大数据数学基础实验以及实训(多源数据融合与数据分析)
1.大数据数学基础
(代码太长,章末有获取方法)
实验一:微积分
实验二:线性代数(分析收视人数)
实验三:概率与统计
实验四:数值计算
实验五:数据可视化
实验六:
6.1: K-Means聚类建模
6.2:SVM分类建模
6.3:BP神经网络建模
关注公众号:Time木
回复:大数据数学基础实验
可获得相关代码,数据,文档
2.多源数据融合与数据分析
关注公众号:Time木
回复:数学分析
可获得相关代码,数据,文档
fun.py
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
def Fr(data,year):
#输入:
#data--财务指标数据
#year--排名年度
#输出:
#Fscore1--排名结果(股票代码形式)
#Fscore2--排名结果(股票名称形式)
data2 = data.iloc[data['Accper'].values == str(year)+'-12-31',[ 0,2,3,4,5,6,7,8,9,10,11]]
data2 = data2[data2 > 0]
data2 = data2.dropna()
X = data2.iloc[:, 1:]
scaler = StandardScaler()
scaler.fit(X)
X = scaler.transform(X)
# 累计贡献率为95%
pca = PCA(n_components=0.95)
# 满足累计贡献率为95%的主成分数据
Y = pca.fit_transform(X)
# 贡献率
gxl = pca.explained_variance_ratio_
F = np.zeros((len(Y))) # 预定义综合得分数组F
for i in range(len(gxl)):
f = Y[:, i] * gxl[i] # 第i个主成分与第i个主成分贡献率的乘积
F = F + f # 数组累积求和
# 构建序列,值为综合得分F,index为股票代码
fs1 = pd.Series(F, index=data2['Stkcd'].values)
# 结果排名,降序
Fscore1 = fs1.sort_values(ascending=False)
co = pd.read_excel('TRD_Co.xlsx')
Co = pd.Series(co['Stknme'].values, index=co['Stkcd'].values)
Co1 = Co[data2['Stkcd'].values] # 主成分分析指标数据对应的上市公司名称
fs2 = pd.Series(F, index=Co1.values)
Fscore2 = fs2.sort_values(ascending=False)
return (Fscore1,Fscore2)
ffun.py
def Fr2(data,year):
import pandas as pd
import numpy as np
# 读取2014年指标数据,将数据转换为Numpy数组的形式
data = pd.read_excel('data1.xlsx')
data2 = data.iloc[data['Accper'].values == '2014-12-31', [0, 2, 3, 4, 5, 6, 7, 8, 9]]
# da=data2.as_matrix()
da = data2.values
# 对最后一个指标PEG进行处理
da = da[(da[:, 8] < 4) & (da[:, 8] > -4), :] # 消除异常值
da[:, 8] = 1 - (da[:, 8] - min(da[:, 8])) / (max(da[:, 8]) - min(da[:, 8])) # 反极差化处理
# 对剩下的7个指标均要求大于0,且将8倍均值作为异常值进行剔除处理。示例代码如下:
for i in np.arange(1, 8):
da = da[da[:, i] > 0, :] # 要求指标值大于0
da = da[da[:, i] < 8 * np.mean(da[:, i]), :] # 剔除异常值(8倍均值)
# 要求净资产收益率大于0.06
# 这里假定6%回报率为投资者的最低要求。示例代码如下:
da = da[da[:, 6] >= 0.06, :]
# 数据标准化处理
# 这里将指标均作归一化处理。即将指标值全部规范化到[0,1]之间。采用Python中的数据预处理模块中的极差法进行处理。:
from sklearn.preprocessing import MinMaxScaler
X = da[:, 1:]
scaler = MinMaxScaler()
scaler.fit(X)
X = scaler.transform(X)
# 6. 对市盈率、市现率、市净率指标也做反极差化处理
# 主要目的是实现指标度量的统一,即值越大越好。
X[:, 2] = 1 - X[:, 2]
X[:, 3] = 1 - X[:, 3]
X[:, 4] = 1 - X[:, 4]
# 对标准化之后的指标数据X作主成分分析,提取其主成分,要求累计贡献率在95%以上。
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 累计贡献率为95%
Y = pca.fit_transform(X) # 满足累计贡献率为95%的主成分数据
gxl = pca.explained_variance_ratio_ # 贡献率
# 1. 计算综合得分,其中综合得分等于提取的各个主成分与其贡献率的加权求和
F = np.zeros((len(Y)))
for i in range(len(gxl)):
f = Y[:, i] * gxl[i]
F = F + f
# 2. 整理排名结果
# 为了方便进行排名,采用序列作为排名结果的储存数据结构。排名包括两种方式,一种index为股票代码,方面后续收益率计算使用。一种index为股票中文简称,方便查看其排名结果。
# 第一种方式如下:
Fs1 = pd.Series(F, index=da[:, 0])
Fscore1 = Fs1.sort_values(ascending=False) # 降序,True为升序
# 第二种方式如下:
# 首先获取主成分分析指标数据对应的上市公司名称,可以通过data2数据中的股票代码关联上市公司信息表(TRD_Co.xlsx)筛选获得。TRD_Co.xlsx数据表详细信息见表8-2,其Python程序代码如下:
co = pd.read_excel('TRD_Co.xlsx')
Co = pd.Series(co['Stknme'].values, index=co['Stkcd'].values)
Co1 = Co[da[:, 0]]
# 其次,以综合得分F为值,上市公司名称作为索引(index),构建序列,并按值作降序排序,以观察其排名结果
Fs2 = pd.Series(F, index=Co1.values)
Fscore2 = Fs2.sort_values(ascending=False) # 降序,True为升序
return (Fscore1,Fscore2)
fun2.py
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import pandas as pd
# 输入:
# Fscore1--排名结果(股票代码形式)
# s_trd1--持有期开始日期
# s_trd1--持有期结束日期
# num--排名数
# 输出:
# r_list--股票代码收益率列表
# r_total--总收益率
# 获取交易数据
def Re(Fscore1, s_trd1, s_trd2, num):
trd = pd.read_excel('trd_'+s_trd1[0:4]+'.xlsx')
# 预定义每个股票的收益率序列
r_list = []
for i in range(num):
# 获取排名第i个股票代码
code = Fscore1.index[i]
# 获取排名第i个股票代码的交易数据
dt = trd.iloc[trd.iloc[:, 0].values == code, :]
# 获取排名第i个股票代码2017年度的交易数据,并按交易日期升序排序
I1 = dt['Trddt'].values >= str(s_trd1)
I2 = dt['Trddt'].values <= str(s_trd2)
dtt = dt.iloc[I1 & I2, :].sort_values('Trddt')
# 数据是否为空条件判断
if len(dtt) > 1:
# 获取排名第i个股票代码的
# 首个和最后一个交易日的考虑现金红利再投资的收盘价可比价
p1 = dtt.iloc[0, 3]
p2 = dtt.iloc[len(dtt) - 1, 3]
# 计算排名第i个股票代码的收益率,并添加到r_list中
r_list.append((p2 - p1) / p1)
# 计算总收益率
r_total = sum(r_list)
return (r_list,r_total)
test0.py
import matplotlib.pyplot as plt
import visual
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
data=pd.read_excel('data.xlsx')
data2=data.iloc[data['Accper'].values=='2016-12-31',[ 0,2,3,4,5,6,7,8,9,10,11]]
data2=data2[data2>0]
data2=data2.dropna()
from sklearn.preprocessing import StandardScaler
X=data2.iloc[:,1:]
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)
from sklearn.decomposition import PCA
#累计贡献率为95%
pca=PCA(n_components=0.95)
#满足累计贡献率为95%的主成分数据
Y=pca.fit_transform(X)
#贡献率
gxl=pca.explained_variance_ratio_
import numpy as np
F=np.zeros((len(Y))) #预定义综合得分数组F
for i in range(len(gxl)):
f=Y[:,i]*gxl[i] #第i个主成分与第i个主成分贡献率的乘积
F=F+f #数组累积求和
#构建序列,值为综合得分F,index为股票代码
fs1=pd.Series(F,index=data2['Stkcd'].values)
#结果排名,降序
Fscore1=fs1.sort_values(ascending=False)
co=pd.read_excel('TRD_Co.xlsx')
Co=pd.Series(co['Stknme'].values,index=co['Stkcd'].values)
Co1=Co[data2['Stkcd'].values] #主成分分析指标数据对应的上市公司名称
fs2=pd.Series(F,index=Co1.values)
Fscore2=fs2.sort_values(ascending=False)
X = list()
Y = list()
for k ,v in Fscore2.items():
X.append(k)
X = X[:10]
print(X)
Y = Y[:10]
print(Fscore2)
# visual.visual(Fscore2)
# # 条形图
# X = list()
# Y = list()
# for k,v in Fscore2.items():
# X.append(k)
# Y.append(v)
# X = X[:10]
# Y = Y[:10]
# #使用ggplot样式来模拟ggplot2风格的图形,ggplot2是一个常用的R语言绘图包
# plt.style.use('ggplot')
# customers = X
# customers_index = range(len(customers))
# sale_amounts = Y
# #基础图
# fig = plt.figure()
# #在基础图上加上子图
# ax1 = fig.add_subplot(1,1,1)
# #param1:设置条形左侧在X轴上的坐标;param2:设置条形的高度;param3:设置条形和标签中间对齐;param4:设置条形的颜色
# ax1.bar(customers_index,sale_amounts,align='center',color='darkblue')
# #设置X,Y轴刻度线位置
# ax1.xaxis.set_ticks_position('bottom')
# ax1.yaxis.set_ticks_position('left')
# #将条形的刻度线标签由客户索引值更改为实际的客户名称
# plt.xticks(customers_index,customers,rotation=0,fontsize='small')
# #设置X轴标签
# plt.xlabel('Stock Name')
# #设置Y轴标签
# plt.ylabel('Score')
# #设置图标签
# plt.title('Score Analysis')
# #将统计图保存在当前文件夹,dpi为分辨率,bbox_inches将图形四周的空白部分去掉
# plt.savefig('bar_plot.png',dpi=400,bbox_inches='tight')
# #显示图形
# plt.show()
#
#
#获取交易数据
# trd=pd.read_excel('trd_2017.xlsx')
# #预定义每个股票的收益率序列
# r_list=[]
# for i in range(30):
# #获取排名第i个股票代码
# code=Fscore1.index[i]
# #获取排名第i个股票代码的交易数据
# dt=trd.iloc[trd.iloc[:,0].values==code,:]
# #获取排名第i个股票代码2017年度的交易数据,并按交易日期升序排序
# I1=dt['Trddt'].values>='2017-05-01'
# I2=dt['Trddt'].values<='2017-12-31'
# dtt=dt.iloc[I1&I2,:].sort_values('Trddt')
# #数据是否为空条件判断
# if len(dtt)>1:
# #获取排名第i个股票代码的
# #首个和最后一个交易日的考虑现金红利再投资的收盘价可比价
# p1=dtt.iloc[0,3]
# p2=dtt.iloc[len(dtt)-1,3]
# #计算排名第i个股票代码的收益率,并添加到r_list中
# r_list.append((p2-p1)/p1)
# r_total=sum(r_list) #计算总收益率
test1_1.py
import pandas as pd
import fun
import fun2
import visual
data=pd.read_excel('data.xlsx')
r1=fun.Fr(data,2016)
Fscore1=r1[0]
Fscore2=r1[1]
print(Fscore2)
print(Fscore1)
visual.visual(Fscore2)
visual.visual(Fscore1)
r2=fun2.Re(Fscore1,'2017-05-01','2017-12-31',30)
r_list=r2[0]
r_total=r2[1]
print(r_total)
test1_2.py
import pandas as pd
import fun #导入自定义的函数文件
import fun2 #导入自定义的函数文件
data=pd.read_excel('data.xlsx')
ind300=pd.read_excel('index300.xlsx')#沪深300指数
list1=[] #存放年度
list2=[] #存放持有期
list3=[] #存放投资组合收益率
list4=[] #存放沪深300指数收益率
for year in [2013,2014,2015,2016]:
for time in ['06-30','09-30','12-31']:
#获得基于总体规模与投资效率指标的综合评价排名结果
r1=fun.Fr(data,year)
r2=fun2.Re(r1[0],str(year+1)+'-05-O1',str(year+1)+'-'+time,40)
r_total=r2[1]
list1.append(year)
list2.append(str(year+1)+'-05-01'+'--'+str(year+1)+'-'+time)
list3.append(r_total)
#计算沪深300指数同期收益率
td1=str(year+1)+'-05-01'
td2=str(year+1)+'-'+time
l1=ind300.iloc[:,1].values>=td1
l2=ind300.iloc[:,1].values<=td2
dt=ind300.iloc[l1&l2,[1,2]].sort_values('Idxtrd01')
p=dt.iloc[:,1].values
list4.append((p[len(p)-1]-p[0])/p[0])
#将结果转化为数据框,并导出到Excel
Reason={'year':list1 , 'time':list2,'r_total':list3,'index':list4}
Reason=pd.DataFrame(Reason)
Reason.to_excel('Reason.xlsx')
test2_1.py
import pandas as pd
import numpy as np
#读取2014年指标数据,将数据转换为Numpy数组的形式
data=pd.read_excel('data1.xlsx')
data2=data.iloc[data['Accper'].values=='2014-12-31',[0,2,3,4,5,6,7,8,9]]
da=data2.values
#对最后一个指标PEG进行处理
da=da[(da[:,8]<4)&(da[:,8]>-4),:] #消除异常值
da[:,8]=1-(da[:,8]-min(da[:,8]))/(max(da[:,8])-min(da[:,8])) #反极差化处理
#3. 对剩下的7个指标均要求大于0,且将8倍均值作为异常值进行剔除处理。
for i in np.arange(1,8):
da=da[da[:,i]>0,:] #要求指标值大于0
da=da[da[:,i]<8*np.mean(da[:,i]),:] #剔除异常值(8倍均值)
#4. 要求净资产收益率大于0.06
#这里假定6%回报率为投资者的最低要求。
da=da[da[:,6]>=0.06,:]
#5. 数据标准化处理
#这里将指标均作归一化处理。即将指标值全部规范化到[0,1]之间。采用Python中的数据预处理模块中的极差法进行处理。
from sklearn.preprocessing import MinMaxScaler
X=da[:,1:]
scaler = MinMaxScaler()
scaler.fit(X)
X=scaler.transform(X)
#6. 对市盈率、市现率、市净率指标也做反极差化处理
#主要目的是实现指标度量的统一,即值越大越好。示例代码如下:
X[:,2]=1-X[:,2]
X[:,3]=1-X[:,3]
X[:,4]=1-X[:,4]
#对标准化之后的指标数据X作主成分分析,提取其主成分,要求累计贡献率在95%以上。其计算程序如下:
from sklearn.decomposition import PCA
pca=PCA(n_components=0.95) #累计贡献率为95%
Y=pca.fit_transform(X) #满足累计贡献率为95%的主成分数据
gxl=pca.explained_variance_ratio_ #贡献率
#1. 计算综合得分,其中综合得分等于提取的各个主成分与其贡献率的加权求和
F=np.zeros((len(Y)))
for i in range(len(gxl)):
f=Y[:,i]*gxl[i]
F=F+f
#2. 整理排名结果
# 为了方便进行排名,采用序列作为排名结果的储存数据结构。排名包括两种方式,一种index为股票代码,方面后续收益率计算使用。一种index为股票中文简称,方便查看其排名结果。
# 第一种方式如下:
Fs1=pd.Series(F,index=da[:,0])
Fscore1=Fs1.sort_values(ascending=False) #降序,True为升序
# 第二种方式如下:
# 首先获取主成分分析指标数据对应的上市公司名称,可以通过data2数据中的股票代码关联上市公司信息表(TRD_Co.xlsx)筛选获得。TRD_Co.xlsx数据表详细信息见表8-2,其Python程序代码如下:
# 其次,以综合得分F为值,上市公司名称作为索引(index),构建序列,并按值作降序排序,以观察其排名结果
co=pd.read_excel('TRD_Co.xlsx')
Co=pd.Series(co['Stknme'].values,index=co['Stkcd'].values)
Co1=Co[da[:,0]]
Fs2=pd.Series(F,index=Co1.values)
Fscore2=Fs2.sort_values(ascending=False) #降序,True为升序
import visual
#排名可视化
visual.visual(Fscore2)
visual.visual(Fscore1)
# print(Fscore1)
# print(Fscore2)
#收益率计算
trd=pd.read_excel('trd_2015.xlsx')
#预定义每个股票的收益率序列
r_list=[]
for i in range(20):
#获取排名第i个股票代码
code=Fscore1.index[i]
#获取排名第i个股票代码的交易数据
dt=trd.iloc[trd.iloc[:,0].values==code,:]
#获取排名第i个股票代码2015年度的交易数据,并按交易日期升序排序
I1=dt['Trddt'].values>='2015-05-01'
I2=dt['Trddt'].values<='2015-12-31'
dtt=dt.iloc[I1&I2,:].sort_values('Trddt')
#数据是否为空条件判断
if len(dtt)>1:
#获取排名第i个股票代码的
#首个和最后一个交易日的考虑现金红利再投资的收盘价可比价
p1=dtt.iloc[0,3]
p2=dtt.iloc[len(dtt)-1,3]
#计算排名第i个股票代码的收益率
r_list.append((p2-p1)/p1)
r_total=sum(r_list) #总收益率
print(r_list)
print(r_total)
test2_2.py
import pandas as pd
import ffun
import fun2
data=pd.read_excel('data1.xlsx')
r1=ffun.Fr2(data,2014)
Fscore1=r1[0]
Fscore2=r1[1]
r2=fun2.Re(Fscore1,'2015-05-01','2015-12-31',20)
r_list=r2[0]
r_total=r2[1]
data=pd.read_excel('data1.xlsx')
ind300=pd.read_excel('index300.xlsx')#沪深300指数
list1=[] #存放年度
list2=[] #存放持有期
list3=[] #存放投资组合收益率
list4=[] #存放沪深300指数收益率
for year in [2013,2014,2015,2016]:
for time in ['06-30','09-30','12-31']:
print(str(year) + '-' + str(time))
#获得基于总体规模与投资效率指标的综合评价排名结果
r1=ffun.Fr2(data,year)
# a=r1[1]
# X = list()
# for k, v in a.items():
# X.append(k)
# X = X[:20]
# print(X[:20])
r2=fun2.Re(r1[0],str(year+1)+'-05-O1',str(year+1)+'-'+time,40)
r_total=r2[1]
list1.append(year)
list2.append(str(year+1)+'-05-01'+'--'+str(year+1)+'-'+time)
list3.append(r_total)
#计算沪深300指数同期收益率
td1=str(year+1)+'-05-01'
td2=str(year+1)+'-'+time
l1=ind300.iloc[:,1].values>=td1
l2=ind300.iloc[:,1].values<=td2
dt=ind300.iloc[l1&l2,[1,2]].sort_values('Idxtrd01')
p=dt.iloc[:,1].values
list4.append((p[len(p)-1]-p[0])/p[0])
#将结果转化为数据框,并导出到Excel
Reason2={'year':list1 , 'time':list2,'r_total':list3,'index':list4}
Reason2=pd.DataFrame(Reason2)
Reason2.to_excel('Reason2.xlsx')
关注公众号:Time木
回复:大数据数学基础实验
回复:数学分析
可获得相关代码,数据,文档
版权声明:本文为qq_43374681原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。