抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

最近在阅读《Python数据分析与挖掘实战》一书,其中发现不少内容没有更新,导致提供的代码直接运行会出现错误。

下面是第8章《中医证型关联规则挖掘》的 “代码清单8-1 数据聚类离散化代码” :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#-*- coding:utf-8 -*-

from __future__ import print_function
import pandas as pd
from sklearn.cluster import KMeans

datafile = '../data/data.xls'
processedfile = '../tmp/data_processed.xls'
typelabel = {u'肝气郁结证型系数':'A', u'热毒蕴结证型系数':'B', u'冲任失调证型系数':'C', u'气血两虚证型系数':'D', u'脾胃虚弱证型系数':'E', u'肝肾阴虚证型系数':'F'}
k = 4

data = pd.read_excel(datafile)
keys = list(typelabel.keys())
result = pd.DataFrame()

if __name__ == '__main__':
for i in range(len(keys)):
print(u'正在进行“%s”的聚类...' % keys[i])
kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data[[keys[i]]].as_matrix())

r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]])
r2 = pd.Series(kmodel.labels_).value_counts()
r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'n'])
r = pd.concat([r1, r2], axis=1).sort(typelabel[keys[i]])
r.index = [1,2,3,4]
r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]], 2)
r[typelabel[keys[i]]][1] = 0.0
result = result.append(r.T)

result = result.sort()
result.to_excel(processedfile)

其中,第25、31行中会出现 ‘DataFrame’ object has no attribute ‘sort’ 错误,第27行会出现 module ‘pandas’ has no attribute ‘rolling_mean’ 的错误。

关于 ‘DataFrame’ object has no attribute ‘sort’

sort 已经弃用,代替使用的是 sort_values 或者 sort_index

  • sort_values 基本用法:
    • 根据“col1”排序:df.sort_values(by=['col1'])
    • 根据多个排序:df.sort_values(by=['col1', 'col2'])
    • 倒叙排序(省略为默认正序):df.sort_values(by='col1', ascending=False)
    • 缺省值NaNs显示在前(省略默认在后):`df.sort_values(by='col1', ascending=False, na_position='first')`
    • 注意:只有by是必须的,其他可缺省。
  • sort_index 基本用法:
    • 直接使用,不需要添加参数:df.sort_index()

关于 module ‘pandas’ has no attribute ‘rolling_mean’

pandas包中关于“rolling_mean”已经更新用法,代替使用的是 rolling

“rolling_mean” 的用法应该对应为df.rolling(2).mean()

修改版代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#-*- coding:utf-8 -*-

from __future__ import print_function
import pandas as pd
from sklearn.cluster import KMeans

datafile = '../data/data.xls'
processedfile = '../tmp/data_processed.xls'
typelabel = {u'肝气郁结证型系数':'A', u'热毒蕴结证型系数':'B', u'冲任失调证型系数':'C', u'气血两虚证型系数':'D', u'脾胃虚弱证型系数':'E', u'肝肾阴虚证型系数':'F'}
k = 4

data = pd.read_excel(datafile)
keys = list(typelabel.keys())
result = pd.DataFrame()

if __name__ == '__main__':
for i in range(len(keys)):
print(u'正在进行“%s”的聚类...' % keys[i])
kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data[[keys[i]]].as_matrix())

r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]])
r2 = pd.Series(kmodel.labels_).value_counts()
r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'n'])
r = pd.concat([r1, r2], axis=1).sort_values(typelabel[keys[i]])
r.index = [1,2,3,4]
r[typelabel[keys[i]]] = r[typelabel[keys[i]]].rolling(2).mean()
r[typelabel[keys[i]]][1] = 0.0
result = result.append(r.T)

result = result.sort_index()
result.to_excel(processedfile)

评论