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.
Einige Namen der Auszubildenden sind versteckt.
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).
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)
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".
#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
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