栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【数据挖掘】对多支股票进行聚类分析(python)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【数据挖掘】对多支股票进行聚类分析(python)

相关性分析

先对其中一支股票进行相关性分析,获取比较具有代表性的属性
不是非要进行,也是可以对所有属性进行聚类

# 3、相关性分析、聚类
path = r"G:桌面置顶学习课程实践3/"
df=pd.read_csv(path + "000513_main_report.csv",header = 1,encoding="utf-8")
# 转置
df1 = pd.DataFrame(df.values.T, index=df.columns, columns=df.index)
# 设置标题行
df1.columns = df1.iloc[0]
df1 = df1.drop(df1.index[0])
# 时间序列
df1.index=pd.to_datetime(df1.index)

df = df1["2020"].replace('%','',regex=True).astype(float)
result2 = np.corrcoef(df, rowvar=False)

import seaborn as sns
sns.pairplot(df)
plt.savefig(path+'000513_main_report各参数分布图.png',dpi=100,bbox_inches='tight')
plt.cla()
import matplotlib.pyplot as plt
figure, ax = plt.subplots(figsize=(12, 12))
sns.heatmap(df.corr(), square=True, annot=True, ax=ax)
plt.savefig(path+'000513_main_report各参数相关性图.png',dpi=100,bbox_inches='tight')
plt.cla()
# 相关性最低的三个属性
# 每股未分配利润(元)
# 销售净利率
# 应收账款周转天数(天)


根据上述结果,我提取了3个相关性最低的属性

读取数据

批量读取文件夹中的股票文件,并提取上述三个属性

import os
dir_path = path + r"股票财务数据"
dfff = pd.DataFrame(columns=['每股未分配利润(元)','销售净利率','应收账款周转天数(天)','股票代码'])
for filepaths,dirnames,filenames in os.walk(dir_path):
    for allDir in filenames:
        if allDir.lower().endswith(('.xls')):
            df = pd.read_excel(os.path.join(dir_path,allDir),header=1)
            # 转置
            df1 = pd.DataFrame(df.values.T, index=df.columns, columns=df.index)
            # 设置标题行
            df1.columns = df1.iloc[0]
            df1 = df1.drop(df1.index[0])
            # 时间序列
            df1.index=pd.to_datetime(df1.index)
            df = df1["2020"][['每股未分配利润(元)','销售净利率','应收账款周转天数(天)']].replace('%','',regex=True).replace('--','nan',regex=True).astype(float)
            ys = pd.DataFrame(df.resample('Y')[['每股未分配利润(元)','销售净利率','应收账款周转天数(天)']].mean())
            ys['股票代码'] = allDir.split("_")[0]
            dfff = pd.concat([dfff,ys])
print(dfff.isnull().any()) 

数据归一化

def MinMaxNormalization(test_data):
    return test_data.apply(lambda x:(x-np.min(x))/(np.max(x)-np.min(x)))
dfff[['每股未分配利润(元)','销售净利率','应收账款周转天数(天)']] = MinMaxNormalization(dfff[['每股未分配利润(元)','销售净利率','应收账款周转天数(天)']])

K-means聚

from sklearn.cluster import KMeans
# 设置为三个聚类中心
Kmeans = KMeans(n_clusters=3)
# 训练模型
Kmeans.fit(dfff[['每股未分配利润(元)','销售净利率','应收账款周转天数(天)']])
Kmeans.cluster_centers_ # 聚类中心
Kmeans.labels_ # 聚类结果
out_file = pd.DataFrame(columns=['每股未分配利润(元)','销售净利率','应收账款周转天数(天)','股票代码','聚类结果'])
out_file[['每股未分配利润(元)','销售净利率','应收账款周转天数(天)','股票代码']] = dfff
out_file['聚类结果'] = Kmeans.labels_
out_file.to_excel(os.path.join(dir_path,'聚类结果.xlsx'),index=False,encoding="utf_8_sig")

绘图-查看聚类结果

label_pred = Kmeans.labels_ #获取聚类标签
centroids = Kmeans.cluster_centers_ #获取聚类中心
inertia = Kmeans.inertia_ # 获取聚类准则的总和
mark = ['or', '^b', '+g', 'ok', '^r', '+r', 'sr', 'dr', ' 

有归一化的结果




认真观察其实可以发现,事实上是聚类成功的,只是因为三维图形在二维不能准确表达。

没有归一化的结果




这个聚类结果也很不错,很明显三个类别排列成一条直线。所以第一张图看起来很混乱。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/979774.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号