Python代码,先读取一个CSV文件,按照每一行数据为一组的方式读取(数据需要归一化),然后将所有组用K-means函数聚成30类,针对于每一类的曲线图,求其平均曲线,其中X轴和Y轴存在小数。另外,再读取另一个CSV文件,每一列(第一列为时间列,第一行为用户行)按照每96个数据为一组的方式读取(数据需要归一化),如果96个全为0则不读并跳过这一组数据,接着读下一组,若96个数据不全为0则要读取,然后利用欧氏距离算每一列的每一组数据与30类的每一类的平均曲线之间的距离,与哪一类的平均曲线的距离最小,则这组数据就归为这一类,要求记录每一列的每一组数据归属的类别并统计每一列的所有组数据归属的不同类别的百分比,按照饼图的方式输出每一列的所有组数据归属的不同类别的百分比,并且需要在图上标注每一块所属类别及其百分比。
时间: 2024-02-22 13:55:57 浏览: 66
下面是一个可能的实现方案,具体实现可能还需要根据实际情况进行调整:
```python
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 读取第一个CSV文件
df1 = pd.read_csv('file1.csv')
# 对每一行数据进行归一化
df1 = (df1 - df1.mean()) / df1.std()
# 使用KMeans函数将所有行聚成30类
kmeans = KMeans(n_clusters=30, random_state=0).fit(df1)
# 计算每一类的平均曲线
means = []
for i in range(30):
mean = df1[kmeans.labels_ == i].mean()
means.append(mean)
# 读取第二个CSV文件
df2 = pd.read_csv('file2.csv')
df2 = df2.iloc[:, 1:] # 去掉第一列(时间列)
# 对每一列进行96个一组的归一化,并删除全为0的组
data = []
for i in range(df2.shape[1]):
col = df2.iloc[:, i]
col = (col - col.mean()) / col.std()
col = col.values.reshape(-1, 96)
col = col[~np.all(col == 0, axis=1)]
data.append(col)
# 计算每一列的每一组数据与30类的平均曲线之间的距离,并记录每一组数据归属的类别
results = []
for i, col in enumerate(data):
col_results = []
for j, row in enumerate(col):
row_results = []
for k, mean in enumerate(means):
distance = np.linalg.norm(row - mean)
row_results.append((k, distance))
row_results.sort(key=lambda x: x[1])
col_results.append((j, row_results[0][0]))
results.append(col_results)
# 统计每一列的所有组数据归属的不同类别的百分比
percentages = []
for col_results in results:
total = len(col_results)
counts = [0] * 30
for _, label in col_results:
counts[label] += 1
percentages.append([count / total for count in counts])
# 绘制每一列的饼图
for i, percentage in enumerate(percentages):
labels = ['Class {}'.format(j) for j in range(30)]
sizes = percentage
fig, ax = plt.subplots()
ax.pie(sizes, labels=labels, autopct='%1.1f%%')
ax.set_title('Column {}'.format(i+1))
plt.show()
```
需要注意的是,由于没有提供具体的数据文件,代码中的细节也可能需要根据实际情况进行修改。
阅读全文