import pandas as pd
from sklearn.cluster import KMeans
import math
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
e = math.e
datafile = 'D:/BaiduNetdiskDownload/chapter4/demo/data/discretization_data.xls'
data = pd.read_excel(datafile)
data = data[u'肝气郁结证型系数'].copy()
data.head(5)
k = 4
d1 = pd.cut(data,k,labels= range(k))#等宽离散化
#等频率离散化
w = [1.0 * i/ k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1]
w[0] = w[0]*(1- 1*e -10)
d2 = pd.cut(data,w,labels= range(k))
from sklearn.cluster import KMeans#引入KMeans
kmodel = KMeans(n_clusters = k ,n_jobs= 4 )#建立模型
kmodel.fit(data.values.reshape((len(data),1)))#训练模型
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心,并且排序(默认随机排序)
w = c.rolling(2).mean().iloc[1:]#相比两项求中点,作为边界线
w = [0] + list(w[0]) + [data.max()]#将首末边界点加上
d3 = pd.cut(data,w,labels= range(k))
def cluster_plot(d,k):#自定义作图来显示结果
plt.figure(figsize = (8,3))
for j in range(0,k):
plt.plot(data[d == j],[j for i in d[d == j]],'o')
plt.ylim(-0.5,k-0.5)
return plt
cluster_plot(d1,k).show()
cluster_plot(d2,k).show()
cluster_plot(d3,k).show()
错误1:series数据不存在reshape,需改为data.values.reshape
错误2:dataframe排序,不能直接data.sort[],需改为data.sort_values()
3.df的rolling_mean()移动窗口函数问题:这里移动窗口函数的使用要改为c.rolling(2).mean(),也就是把rolling_mean()函数拆开来;