作业1"/>
数据科学作业1
这是我去年选修数据科学时候的作业一,当时是肖若秀老师教的,但听说我们这届之后计科和物联信安一个难度授课了这篇文章可能也就只是自己记录帮不上学弟学妹了,但当时我上数据科学时候肖老师不签到老好了最后四个作业完成之后就有个还不错的分数虽然不出国选修课分数也无所谓就是了。
目录
一、作业描述
二、作业过程
1.首先我从本作业提供上证A股的四套数据中选择了宝钢股份的1套数据。数据为CSV文件,其格式说明,即为首行列名如下所示。
2.读入数据:
3.数据汇总:
4.绘制图形
5.假设检验
三、公式推导
四、可视化结果
1.横坐标是月份,纵坐标是股价,绘制平均开盘价(元)、平均收盘价(元)随月份的变化(两条曲线)。
2.频数直方图正态检验
五、源代码附上:
心得体会
一、作业描述
本作业提供上证A股的数据1套(从提供的上海机场,宝钢股份,中国石油,中国银行4套股票数据中任意选1套)。数据为CSV文件,格式说明见CSV的首行列名。
具体要求:
(1)读取数据,在列上仅保留:代码、简称,日期,开盘价(元),收盘价(元),成交金额(元)。在行上,删除包含空值的行。
(2)对数据进行汇总,获得每个月(按自然月)的平均开盘价(元)和平均收盘价(元),总成交金额(元)。此时获得数据:代码、简称,月份,平均开盘价,平均收盘价,总成交金额。
(3)绘制图形,横坐标是月份,纵坐标是股价,绘制平均开盘价(元)、平均收盘价(元)随月份的变化(两条曲线)。
(4)取所有月份的总成交金额构成的一组数值,判定这组数值是否符合正态分布,并简述回顾正态分布检验的原理。
二、作业过程
1.首先我从本作业提供上证A股的四套数据中选择了宝钢股份的1套数据。数据为CSV文件,其格式说明,即为首行列名如下所示。
代码
简称
日期
前收盘价(元)
开盘价(元)
最高价(元)
最低价(元)
收盘价(元)
成交量(股)
成交金额(元)
涨跌(元)
涨跌幅(%)
均价(元)
换手率(%)
A股流通市值(元)
B股流通市值(元)
总市值(元)
A股流通股本(股)
B股流通股本(股)
总股本(股)
市盈率
市净率
市销率
市现率
2.读入数据:
需要在列上仅保留:代码、简称,日期,开盘价(元),收盘价(元),成交金额(元)。在行上,删除包含空值的行。如果不考虑后续数据操作的复杂程度的话,可以直接
通过如下代码实现:
import pandas as pd
all = pd.read_csv("600019.SH.CSV")
data = all[["日期","代码","简称","开盘价(元)","收盘价(元)" ,"成交金额(元)"]].copy()
data.dropna(axis=0,how='any',inplace = True)
但考虑到为了后续便于对数据进行汇总,我采取了如下代码实现:
all = pd.read_csv("600019.SH.CSV")
data1 = all[["日期","代码","简称"]].copy()
data2 = all[["日期","开盘价(元)","收盘价(元)"]].copy()
data3 = all[["日期","成交金额(元)"]].copy()
data1.dropna(axis=0,how='any',inplace = True)
data2.dropna(axis=0,how='any',inplace = True)
data3.dropna(axis=0,how='any',inplace = True)
即把需要保留的列分成三部分分别进行操作,这项操作的好处将在后续数据汇总时体现出来。
3.数据汇总:
对数据进行汇总,需要获得每个月(按自然月)的平均开盘价(元)和平均收盘价(元),总成交金额(元)。
此时我们发现,对开盘价(元),收盘价(元)和成交金额(元)的统计操作是不同的,前两个需要取平均而成交金额则需要求和。如果按照(2)中前一种的方法进行数据保留在这一步可能会相当麻烦,但当采用第二种方法进行数据保留时,就会发现我们很容易就能分别对数据进行汇总。具体代码实现如下:
# 将数据类型转换为日期类型并将日期设为index
data1['日期'] = pd.to_datetime(data1['日期'])
data2['日期'] = pd.to_datetime(data2['日期'])
data3['日期'] = pd.to_datetime(data3['日期'])
data1 = data1.set_index('日期')
data2 = data2.set_index('日期')
data3 = data3.set_index('日期')#获得每个月(按自然月)的平均开盘价(元)和平均收盘价(元),总成交金额(元)
data1 = data1.to_period('M')
data1 = data1.loc[~data1.index.duplicated(keep='first')] #对数据进行去重保持行数一致
data2 = data2.resample('M').mean().to_period('M')
data3 = data3.resample('M').sum().to_period('M')#修改列索引
data2.rename(columns={"开盘价(元)":"平均开盘价(元)",
"收盘价(元)":"平均收盘价(元)"},inplace = True)
data3.rename(columns={"成交金额(元)":"总成交金额(元)"},inplace = True)#合并数据
data = pd.concat([data1,data2,data3],axis=1)
代码中首先将原数据表中的日期转为日期类型,并将其设置为index;再通过.to_period('M')和 .resample('M')实现按月显示和统计;其中对与data1的数据去重是因为data1中只有["代码","简称"],他们所对应的数据不能被mean()或是sum(),于是就先将其按月显示,再对相同的index进行去重从而保证与data2和data3的行数一致从而实现拼接。
这时可以通过:
print(data)
输出一下我们获得的data结果:
此时我们获得数据:代码、简称,月份,平均开盘价,平均收盘价,总成交金额。
4.绘制图形
横坐标是月份,纵坐标是股价,绘制平均开盘价(元)、平均收盘价(元)随月份的变化(两条曲线)。具体代码如下:
df = data[["平均开盘价(元)","平均收盘价(元)"]].copy()#横坐标是月份,纵坐标是股价,绘制平均开盘价(元)、平均收盘价(元)随月份的变化(两条曲线)。
df.plot(y=["平均开盘价(元)","平均收盘价(元)"],grid=True)
可以获得如下图象:
不难发现这是出现了中文乱码不显示的情况所以需要在代码前加上:
from pylab import mpl#mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
从而得到正确的可视化结果:
5.假设检验
取所有月份的总成交金额构成的一组数值,判定这组数值是否符合正态分布,
这里我们需要from scipy import stats进行假设检验:
原假设:所有月份的总成交金额符合正态分布;
备择假设:所有月份的总成交金额不符合正态分布;
python实现如下:
mr = data["总成交金额(元)"]mr.plot(y="总成交金额(元)")print(stats.normaltest(mr))
得到输出:
NormaltestResult(statistic=77.46799539019028, pvalue=1.5067407673010662e-17)
得到pvalue=1.5067407673010662e-17<<α(=0.01)
其中α=0.01为显著性水平
所以我们否认原假设,即所有月份的总成交金额不符合正态分布。
此外,我们也可以通过.plot()通过可视化来观察,实现代码和可视化结果如下:
mr = data["总成交金额(元)"]mr.plot(kind='hist',bins=30)
三、公式推导
正态分布检验的原理:
即假设检验的原理,
假设检验的基本思想是“小概率事件”原理,其统计推断方法是带有某种概率性质的反证法。
小概率思想是指小概率事件在一次试验中基本上不会发生。
反证法思想是先提出检验假设,再用适当的统计方法,利用小概率原理,确定假设是否成立。
即为了检验一个假设H0是否正确,首先假定该假设H0正确,然后根据样本对假设H0做出接受或拒绝的决策。
如果样本观察值导致了“小概率事件”发生,就应拒绝假设H0,否则应接受假设H0
四、可视化结果
1.横坐标是月份,纵坐标是股价,绘制平均开盘价(元)、平均收盘价(元)随月份的变化(两条曲线)。
2.频数直方图正态检验
五、源代码附上:
'''
本作业提供上证A股的数据1套
(从提供的上海机场,宝钢股份,中国石油,中国银行4套股票数据中任意选1套)。
数据为CSV文件,格式说明见CSV的首行列名。
具体要求:
(1)读取数据在列上仅保留:代码、简称,日期,开盘价(元),收盘价(元),成交金额(元)。在行上,删除包含空值的行。
(2)对数据进行汇总获得每个月(按自然月)的平均开盘价(元)和平均收盘价(元),总成交金额(元)。此时获得数据:代码、简称,月份,平均开盘价,平均收盘价,总成交金额。
(3)绘制图形横坐标是月份,纵坐标是股价,绘制平均开盘价(元)、平均收盘价(元)随月份的变化(两条曲线)。
(4)取所有月份的总成交金额构成的一组数值判定这组数值是否符合正态分布,并简述回顾正态分布检验的原理。提交方式:
压缩格式,文件后缀为ZIP。其中:
(1)压缩文件根目录包含pdf文件为作业的文档内容包括作业过程,公式推导,简单的代码说明,可视化结果等。
(2)压缩包包含src子目录,其中包含所有的相关代码等。原数据数据无需放置在压缩包内。'''
import pandas as pd
from pylab import mpl
from scipy import stats
#mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题all = pd.read_csv("600019.SH.CSV")
#在列上仅保留:代码、简称,日期,开盘价(元),收盘价(元),成交金额(元)。
data1 = all[["日期","代码","简称"]].copy()
data2 = all[["日期","开盘价(元)","收盘价(元)"]].copy()
data3 = all[["日期","成交金额(元)"]].copy()#在行上,删除包含空值的行。
data1.dropna(axis=0,how='any',inplace = True)
data2.dropna(axis=0,how='any',inplace = True)
data3.dropna(axis=0,how='any',inplace = True)#将数据类型转换为日期类型
data1['日期'] = pd.to_datetime(data1['日期'])
data2['日期'] = pd.to_datetime(data2['日期'])
data3['日期'] = pd.to_datetime(data3['日期'])
data1 = data1.set_index('日期')
data2 = data2.set_index('日期')
data3 = data3.set_index('日期')#获得每个月(按自然月)的平均开盘价(元)和平均收盘价(元),总成交金额(元)
data1 = data1.to_period('M')
data1 = data1.loc[~data1.index.duplicated(keep='first')]
data2 = data2.resample('M').mean().to_period('M')
data3 = data3.resample('M').sum().to_period('M')data2.rename(columns={"开盘价(元)":"平均开盘价(元)","收盘价(元)":"平均收盘价(元)"},inplace = True)
data3.rename(columns={"成交金额(元)":"总成交金额(元)"},inplace = True)data = pd.concat([data1,data2,data3],axis=1)
print(data)
df = data[["平均开盘价(元)","平均收盘价(元)"]].copy()#横坐标是月份,纵坐标是股价,绘制平均开盘价(元)、平均收盘价(元)随月份的变化(两条曲线)。
df.plot(y=["平均开盘价(元)","平均收盘价(元)"],grid=True)#假设检验
#取所有月份的总成交金额构成的一组数值
mr = data["总成交金额(元)"]
#mr.plot(kind='hist',bins=30)
print(stats.normaltest(mr))#判定这组数值是否符合正态分布,并简述回顾正态分布检验的原理。
'''
正态分布检验原理:假设检验的基本思想是“小概率事件”原理,其统计推断方法是带有某种概率性质的反证法。小概率思想是指小概率事件在一次试验中基本上不会发生。反证法思想是先提出检验假设,再用适当的统计方法,利用小概率原理,确定假设是否成立。即为了检验一个假设H0是否正确,首先假定该假设H0正确,然后根据样本对假设H0做出接受或拒绝的决策。如果样本观察值导致了“小概率事件”发生,就应拒绝假设H0,否则应接受假设H0'''
心得体会
1.Pandas作为Python的一个数据分析包,纳入大量库和标准数据模型,提供高效的操作数据集所需的工具、函数和方法。
2.对数据进行读取时一定要考虑到后续对数据进行整理时的操作,毕竟数据本身的价值更多的是体现在数据背后分析出的结果上的,仅仅是读取数据没有意义,比如本次作业中将所需数据分三部分读入分别进行数据整理最后再合并。
更多推荐
数据科学作业1
发布评论