Я делаю упражнение, в котором мы строим дендрограмму для набора данных Евровидения. Образцы уже загружены для меня в упражнении. Я не думаю, что действительно учусь этому, поэтому я сам собрал образцы.
Моя проблема в том, что то, как я это сделал, не очень похоже на pythoni c, и я уверен, что у меня должен быть более быстрый и короткий способ достичь того же.
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram
import pandas as pd
import numpy as np
# Extract data from the data.
eurovision = pd.read_csv('eurovision-2016.csv')
country_names = eurovision['From country'].unique()
toCountry = eurovision['To country'].unique()
samples = np.empty((country_names.shape[0], toCountry.shape[0]))
# Set up samples such that each row corresponds to a voting coutry, and each
# column corresponds to a performance that was voted for.
for i in range(eurovision.shape[0]):
toFound = False
toCount = 0
fromFound = False
fromCount = 0
while toFound == False:
if eurovision['To country'][i] == toCountry[toCount]:
toFound = True
while fromFound == False:
if eurovision['From country'][i] == country_names[fromCount]:
fromFound = True
else:
fromCount += 1
else:
toCount += 1
samples[fromCount,toCount] = eurovision['Televote Rank'][i]
samples = np.round(samples, 0)
#Plot the dendrogram.
mergings = linkage(samples, method='complete')
dendrogram(mergings, labels=country_names.tolist(), leaf_rotation=90,
leaf_font_size=12)
plt.show()
Я не уверен, как прикрепить набор данных csv к сообщению в Stack, но вот заголовки столбцов и 5 строк данных:
Из страны, В страну, Жюри A, Жюри B, Жюри C, Жюри D, Жюри E, Ранг жюри, Ранг телеголосования, Очки жюри, Очки телеголосования
Албания, Бельгия, 20,16,24,22,24,25,14``
Албания, Чешская Республика c, 21,15,25,23,16,22,22``
Албания, Нидерланды, 22,14,23,24,21,24,24``
Албания, Азербайджан, 19,12,11,21,11,13,19``
Албания, Венгрия, 8,13,9,14,9,10,10,1,1
И вот финальная дендрограмма:
Дендрограмма для Евровидения 2016
Есть ли лучший способ сделать это?