[PYTHON] Visualisierung des Trainee-Rankings von Produce 101 Japan durch Scraping

Was ist Produce 101 Japan?

PRODUCE 101 JAPAN OFFICIAL SITE Dies ist die japanische Version des aus Südkorea importierten Vorspielprogramms. Die Ergebnisse der Abstimmung für Auszubildende, die ihr Debüt als Sänger geben möchten, werden wöchentlich bekannt gegeben. Im Laufe der Woche steigt die Anzahl der Schulabbrecher auf den 60. und 35. Platz.

Dieses Mal werden die Ranking-Ergebnisse durch Scraping von der offiziellen Website extrahiert. Ich habe versucht, die Änderung im Ranking der Auszubildenden zu visualisieren, die bis zum letzten Ranking (9. Woche ab 29. November 2019) überlebt haben.

Fertigstellungszeichnung des fertigen Produkts

Einige Namen der Auszubildenden sind versteckt. Unknown.png

Hauptstrom

  1. Schaben
  2. Datenformung
  3. Ranking visualisieren

1. Holen Sie sich Rangliste durch Schaben

Funktionalisiert, so dass wöchentliche Rankings einzeln gesammelt werden können. Verwenden Sie BeautifulSoup, um HTML-Elemente abzurufen und in Text umzuwandeln. Erhalten Sie in Form von "Rang, Name, Woche" (nur ein Teil davon wird angezeigt). aaa.png


def getWeeklyRank(week):
    import requests
    from bs4 import BeautifulSoup
    import re

    #Erhalten Sie die URL der Ranking-Seite, indem Sie mit Zahlen formatieren
    url = 'https://produce101.jp/rank/?week={}'
    html = requests.get(url.format(week))   
    #Behandeln Sie URLs mit Beautiful Soup
    soup = BeautifulSoup(html.text, 'lxml')
    #Holen Sie sich die span- und div-Elemente einer bestimmten Klasse
    span_rank = soup.find_all("span", class_="icon-rank")
    div_name = soup.find_all("div", class_="name")
    
    #Extrahieren Sie die Textkomponente des Tags mit Rang und Namen in die Liste
    rank = []
    for i in range(len(span_rank)):
        rank.append(int(span_rank[i].text))
    name = []
    for i in range(len(div_name)):
        name.append(div_name[i].text)

    #Wöchentlich speichernRanking to csv
    #Erst in der ersten Woche neu erstellen und ab nächster Woche im Zusatzmodus schreiben
    if week == 1:
        f = open('./weeklyRank.txt', 'w')
        for i in range(len(rank)):
            f.write(str(rank[i])+','+str(name[i])+','+str(week)+'\n')
        f.close()
    elif week > 1:
        f = open('./weeklyRank.txt', 'a')
        for i in range(len(rank)):
            f.write(str(rank[i])+','+str(name[i])+','+str(week)+'\n')
        f.close()

Führen Sie die Funktion wöchentlich aus und erhalten Sie das Ranking. (Es ist cool, alles automatisch zu bekommen, aber dieses Mal bekomme ich es stetig.)

getWeeklyRank(1)
getWeeklyRank(2)
getWeeklyRank(3)
#In der 4. Woche wurde kein Ranking bekannt gegeben
getWeeklyRank(5)
getWeeklyRank(6)
#In der 7. Woche wurde kein Ranking bekannt gegeben
getWeeklyRank(8)
getWeeklyRank(9)

2. Erleichtern Sie die grafische Darstellung durch Datenformung

Löschen Sie andere Elemente als den Namen wie "* ablehnen", formatieren Sie die Spaltenüberschrift als Woche und geben Sie das Ranking ein. Ersetzen Sie die Rangliste der Auszubildenden, die unterwegs abgebrochen sind, durch "x". beforeFormat.png

#Löschen Sie die Notation des Niedergangs

f = open('weeklyRank.txt', 'r')
data_lines = f.read()
data_lines = data_lines.replace('* Ablehnen', '')
f.close()

f = open('weeklyRank.txt', 'w')
f.write(data_lines)
f.close()

Formatiert die aus HTML erhaltenen Ranking-Daten. Es gibt Kürzungen bis zum 60. Platz in der 5. Woche und bis zum 35. Platz in der 8. Woche, und die Anzahl der Personen wird sich ändern, sodass wir individuell reagieren werden.

def getWeeklyRank_format(data_path):
    import pandas as pd
    df_rank = pd.read_csv(data_path,header=None, names=('rank', 'name', 'week'))
    df = df_rank[['name','week','rank']]
    df_week1 = df_rank[df_rank['week'] == 1]
    df_week5 = df_rank[df_rank['week'] == 5]
    df_week8 = df_rank[df_rank['week'] == 8]
    f = open('./weeklyRank_format.txt', 'w')
    f.write('week')

    #Holen Sie sich ein Mitglied von week1
    name_week1 = []
    for e in range(len(df_week1)):
        dfe = df[(df['week'] == 1) & (df['rank'] == e+1)]
        nameArray = dfe['name'].values[0]
        f.write(str(','+nameArray))
        name_week1.append(str(nameArray))
    #Holen Sie sich ein Mitglied von week5
    name_week5 = []
    for e in range(len(df_week5)):
        dfe = df[(df['week'] == 5) & (df['rank'] == e+1)]
        nameArray = dfe['name'].values[0]
        name_week5.append(str(nameArray))
    f.write('\n') 
    #Holen Sie sich ein Mitglied von week8
    name_week8 = []
    for e in range(len(df_week8)):
        dfe = df[(df['week'] == 8) & (df['rank'] == e+1)]
        nameArray = dfe['name'].values[0]
        name_week8.append(str(nameArray))
    f.write('\n') 
    #Geben Sie den Rang der Auszubildenden in der ersten Woche als Spaltenüberschrift und die Ränge danach als Variablen ein.
    for i in range(1,10):
        if i==1 or i==2 or i==3:
            #Schreiben Sie eine Woche in Spalte 0
            f.write(str(i))
            #Als nächstes erhalten Sie den Rang eines Auszubildenden in der ersten Woche
            for j in range(0, len(name_week1)):
                dfi = df[(df['week'] == i) & (df['name'] == name_week1[j])]
                f.write(str(','+str(dfi['rank'].values[0])))
        elif i==4:
            continue
        elif i==5 or i==6:
            #Schreiben Sie eine Woche in Spalte 0
            f.write(str(i))
            #Als nächstes erhalten Sie den Rang eines Auszubildenden in der ersten Woche
            for j in range(0, len(name_week1)):
                if name_week1[j] in name_week5:
                    dfk = df[(df['week'] == i) & (df['name'] == name_week1[j])]
                    f.write(str(','+str(dfk['rank'].values[0])))   
                elif name_week1[j] not in name_week5:
                    f.write(',x')
        elif i==7:
            continue
        elif i==8 or i==9:
            #Schreiben Sie eine Woche in Spalte 0
            f.write(str(i))
            #Als nächstes erhalten Sie den Rang eines Auszubildenden in der ersten Woche
            for j in range(0, len(name_week1)):
                if name_week1[j] in name_week8:
                    dfk = df[(df['week'] == i) & (df['name'] == name_week1[j])]
                    f.write(str(','+str(dfk['rank'].values[0])))   
                elif name_week1[j] not in name_week8:
                    f.write(',x')            
        f.write('\n') 
    f.close()

Führen Sie die Funktion aus.

getWeeklyRank_format('./weeklyRank.txt')

Mal sehen, ob es funktioniert hat.

import pandas as pd
df_rank = pd.read_csv('./weeklyRank_format.txt',header=0)
df_rank
df.png

3. Visualisieren Sie das Ranking

Dieses Mal werde ich Heruntergeladene Schriftart: JK Gothic L verwenden, um mit Blick auf das Erscheinungsbild auf Japanisch zu schreiben.

#Trainee-Ranking von der 1. bis zur 9. Woche
#Passen Sie die Schriftart an
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np

#Wenden Sie die Schriftart an, indem Sie die ttf-Datei direkt angeben
import matplotlib.font_manager
fp = matplotlib.font_manager.FontProperties(fname='/Users/[USER NAME]/.matplotlib/fonts/ttf/JKG-L_3.ttf')

#Feld einstellen
fig, axs = plt.subplots(figsize=(10,25))
x = df_rank['week']
axs.set_xlim(0.94,9.1)
axs.set_xticks([1, 2, 3, 4, 5, 6, 7, 8, 9])
axs.set_ylim(99, 0.6)

axs2 = axs.twinx()

labels = list(df_rank.columns[1:])[0:]
axs.set_yticks(list(np.arange(1,99)))
axs.set_yticklabels(labels, fontproperties=fp, color='darkslateblue')
axs.set_xticklabels(['1. Woche', '2. Woche', '3. Woche','4. Woche', '5. Woche', '6. Woche', '7. Woche', '8. Woche', '9. Woche'], rotation=0, fontsize=14, fontproperties=fp, color='darkslateblue')
axs.spines['top'].set_visible(False)
axs.spines['bottom'].set_visible(False)
axs.spines['right'].set_visible(False)
axs.spines['left'].set_visible(False)
axs.tick_params(left=False)

labels2 = list((np.arange(0,99)))
axs2.set_yticks(list(np.arange(1,99)))
axs2.set_yticklabels(labels2[99:0:-1], fontproperties=fp, color='darkslateblue')
axs2.set_ylim(0,98)
axs2.spines['top'].set_visible(False)
axs2.spines['bottom'].set_visible(False)
axs2.spines['right'].set_visible(False)
axs2.spines['left'].set_visible(False)
axs2.tick_params(right=False)

#Ändern Sie die Farbe der Faltlinie in Regenbogen
cmap = plt.get_cmap('rainbow')
for i in range(1, 99,1):
    y = df_rank[df_rank.columns[i]]
    if 'x' in list(y):
        continue
    else:
        axs.plot(x,y,color=cmap(1-i/100),marker='o',markersize=8,linewidth = 3, alpha=0.3)

Das Diagramm sollte jetzt vollständig sein. Wenn Sie die Bedingungen festlegen, können Sie die Auszubildenden visualisieren, die ihr Ranking erheblich verbessert haben.

Recommended Posts

Visualisierung des Trainee-Rankings von Produce 101 Japan durch Scraping
Visualisierung von Daten nach Präfektur
Visualisierung der von numpy erstellten Matrix
Holen Sie sich Qiitas "Gefällt mir" -Liste durch Schaben
Analyse von Finanzdaten durch Pandas und deren Visualisierung (2)
Analyse von Finanzdaten durch Pandas und deren Visualisierung (1)
Visualisierung von Daten anhand einer erklärenden Variablen und einer objektiven Variablen