此为实验作业。

实验内容见教材(《Python数据分析与挖掘实战》张良均等著(第一版,白色封面的那版))Page 178的实验一及实验二。

实验一代码,可以直接运行

#-*- coding: utf-8 -*-
#标准差标准化

import pandas as pd

datafile = 'zscoredata.xls' #需要进行标准化的数据文件;
zscoredfile = 'zscoreddata.xls' #标准差化后的数据存储路径文件;

#标准化处理
data = pd.read_excel(datafile)
data = (data - data.mean(axis = 0))/(data.std(axis = 0)) #简洁的语句实现了标准化变换,类似地可以实现任何想要的变换。
data.columns=['Z'+i for i in data.columns] #表头重命名。

data.to_excel(zscoredfile, index = False) #数据写入

结果截图如下:

实验二代码:

#-*- coding: utf-8 -*-
#K-Means聚类算法

import pandas as pd
from sklearn.cluster import KMeans #导入K均值聚类算法

inputfile = 'zscoreddata.xls' #待聚类的数据文件
k = 5                       #需要进行的聚类类别数

#读取数据并进行聚类分析
data = pd.read_excel(inputfile) #读取数据

#调用k-means算法,进行聚类分析
kmodel = KMeans(n_clusters = k)
kmodel.fit(data) #训练模型

kmodel.cluster_centers_ #查看聚类中心
kmodel.labels_ #查看各样本对应的类别

#-*- coding: utf-8 -*-
#画出特征雷达图,代码接KMeans_cluster.py

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

labels = data.columns #标签
labels = labels.append(pd.Index([data.columns[0]])) #添加多 第一个标签

k = 5 #数据个数
plot_data = kmodel.cluster_centers_
color = ['b', 'g', 'r', 'c', 'y'] #指定颜色

angles = np.linspace(0, 2*np.pi, k, endpoint=False)
plot_data = np.concatenate((plot_data, plot_data[:,[0]]), axis=1) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合

fig = plt.figure()
ax = fig.add_subplot(111, polar=True) #polar参数!!
for i in range(len(plot_data)):
    ax.plot(angles, plot_data[i], 'o-', color = color[i], label = u'客户群'+str(i), linewidth=2)# 画线

ax.set_rgrids(np.arange(0.01, 3.5, 0.5), np.arange(-1, 2.5, 0.5), fontproperties="SimHei")
ax.set_thetagrids(angles * 180/np.pi, labels)
plt.legend(loc = 4)
plt.title('客户聚类中心向量')
plt.show()

这里要注意,要加多一句:

labels = labels.append(pd.Index([data.columns[0]])) #添加多 第一个标签

否则会出现这个错误:

ValueError: The number of FixedLocator locations(6), usually from a call to set_ticks, does not match the number of ticklabels(5).

原理参考合工大----python实验作业3----matplotlib踩坑记录----set_thetagrids()_图南zzz的博客-CSDN博客

通过:

print(type(data.columns))
print(type(data.columns[0]))

可以知道它们的类型

其中data.columns为'pandas.core.indexes.base.Index'类型,

       data.columns[0]为str类型。

直接插入会出错,所以要利用pd.Index([data.columns[0]]将str转换为index类型,其中的中括号[]为点睛之笔,不加则会报错。

o(╥﹏╥)o

  

实验结果截图如下:

因为插入数据关乎到各种类型转换(Index)什么的,转换起来还是比较复杂的,我感觉这也是python的痛处。希望对各位有所帮助。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐