我试图将pandas数据帧传递给sklearn包的kmeans算法。dataframe有一个日期索引,包含52个日期(每周一个),列是不同的文章。列值是对应周的销售数量。为了更好地计算,我计算了百分比变化,这就是它的样子:
ARTICLE 47070868 489070875 29470899 99070943 \
DATE
2017-01-02 0.000000 0.000000 0.000000 0.000000
2017-01-09 -0.015625 -0.074928 -0.083333 0.230769
2017-01-16 0.232804 0.007788 0.284091 0.062500
2017-01-23 0.051502 0.174652 0.011799 0.117647
2017-01-30 0.200000 -0.082895 0.008746 0.807018
2017-02-06 0.057823 0.040172 -0.020231 -0.411003
2017-02-13 0.000000 -0.037241 -0.014749 -0.087912
2017-02-20 0.125402 0.259312 0.218563 0.138554
2017-02-27 -0.265714 -0.271900 -0.233415 -0.343915
2017-03-06 0.470817 0.293750 0.448718 0.661290
2017-03-13 0.002646 0.013285 -0.057522 -0.048544
数据帧有52行8753列。如果我将数据帧传递给kmeans算法,将得到以下错误:
值错误:x和y必须具有相同的第一维度,但必须具有形状(52,)和(8753,)
代码如下:
kmeans = KMeans(n_clusters=3, random_state=0).fit(data_pct_change)
print(kmeans.labels_)
np.savetxt('log_sebastian2017.txt', kmeans.labels_, newline="\n")
for i, cluster_center in enumerate(kmeans.cluster_centers_):
plp.plot(data_pct_change.index, cluster_center, label='Center {0}'.format(i))
plp.legend(loc='best')
plp.show()
如果我执行此代码:
kmeans = KMeans(n_clusters=3, random_state=0).fit(data_pct_change)
print(kmeans.labels_)
np.savetxt('log_sebastian2017.txt', kmeans.labels_, newline="\n")
for i, cluster_center in enumerate(kmeans.cluster_centers_):
plp.plot(cluster_center, label='Center {0}'.format(i))
plp.legend(loc='best')
plp.show()
它工作得很好,但是x轴和y轴的比例不正确,它在x上从0到8700(可能是8753,列的数量)到达,在y上从0到10000(这也是错误的,数据帧中最大的百分比变化是17,6)。
我在这里做错什么了?同时,生成的标签数量也是错误的(在这两种情况下,算法都会为
kmean.labels_
,但应该是8573)
有人能帮我正确地进行聚类吗?我的数据帧对kmeans来说是错误的吗?