В настоящее время я работаю с фреймом данных, который выглядит следующим образом (у него 24 часа, здесь я показываю 2 часа):
На изображении показаны только первые 5 рядов, но есть 4 разных кластера и 3 разных класса. Кластеры были назначены независимо от класса, поэтому любой кластер может содержать строки, принадлежащие всем трем классам.
Мне нужно сделать столько линейных графиков, сколько у меня есть кластеров, где я могу показать кластеры центроид, а также все ряды, принадлежащие этому кластеру. Однако, что мне нужно - и я не могу найти способ сделать это - это нарисовать линию, принадлежащую каждому классу в кластере, другим цветом. Это означает, что каждый график будет иметь максимум 4 разных цвета, 1 для центроида и 1 для каждого класса.
Вот код, который я сейчас использую для построения графика центроида кластера, а также линий.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import seaborn as sb
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin_min
from tslearn.clustering import TimeSeriesKMeans
from tslearn.datasets import CachedDatasets
from tslearn.preprocessing import TimeSeriesScalerMeanVariance
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['figure.figsize'] = (16, 9)
plt.style.use('ggplot')
K = 4
X = np.array(dffinal[['h0','h1','h2','h3','h4','h5','h6','h7','h8','h9','h10','h11','h12','h13','h14','h15','h16','h17','h18','h19','h20','h21','h22','h23']])
y = np.array(dffinal.index)
euc_km = TimeSeriesKMeans(n_clusters=K,
metric='euclidean')
cluster = euc_km.fit_predict(X)
dffinal['cluster'] = cluster
for name, data in dffinal.groupby('cluster'):
for xx in X[cluster == name]:
plt.plot(euc_km.cluster_centers_[name].ravel(), "r-")
plt.plot(xx.ravel(), "k-", alpha=.2)
#plt.xlabel('Hour')
#plt.ylabel('Demand')
#plt.legend()
plt.savefig('plot_euc_{}.png'.format(name))
plt.close()
Это графики, полученные с текущим кодом:
Я пытался включить второе условие после первого groupby
во время графическое кодирование, но я не могу его осуществить.
Заранее спасибо
Редактировать: Я полагаю, я получил его, используя следующий код, на случай, если кто-то еще также столкнулся с той же проблемой.
s = ['deepskyblue','darkorange','magenta']
for name, data in dffinal.groupby('cluster'):
counter = -1
for categoria, data in dffinal.groupby('clase'):
counter = counter + 1
for curve in Xc[(clase == categoria) & (cluster == name)]:
plt.plot(curve.ravel(), s[counter], alpha=0.1)
plt.plot(euc_km.cluster_centers_[name].ravel(), "r-")
plt.savefig('plot_euc_{}.png'.format(name))
plt.close()
Вот как выглядит мой последний график. У меня более 1450 строк данных, из которых около 1250 принадлежат к одному и тому же классу, поэтому большинство из них голубые, но где-то там еще можно увидеть апельсин и пурпурный цвет. Красный - все еще кластерный центроид. Надеюсь, это поможет любому делать что-то подобное.