数据集与题来源于和鲸社区
# 1.使用绝对路径读取本地Excel数据
import pandas as pd
df = pd.read_excel(r"D:\Haley\Python Project\600000.SH.xls",converters={'A股流通市值(元)':str,'总市值(元)':str,'A股流通股本(股)':str})
# 2.查看数据前三行
df.head(3)
'''
日期 代码 简称 前收盘价(元) 开盘价(元) 最高价(元) 最低价(元) 收盘价(元) 成交量(股) 成交金额(元) 涨跌(元) 涨跌幅(%) 均价(元) 换手率(%) A股流通市值(元) 总市值(元) A股流通股本(股) 市盈率
2016-01-04 600000.SH 浦发银行 16.1356 16.1444 16.1444 15.4997 15.7205 42240610 754425783 -0.4151 -2.5725 17.8602 0.2264 332031791187 332031791187 18653471415 6.5614
2016-01-05 600000.SH 浦发银行 15.7205 15.4644 15.9501 15.3672 15.8618 58054793 1034181474 0.1413 0.8989 17.8139 0.3112 335016346613.4 335016346613.4 18653471415 6.6204
2016-01-06 600000.SH 浦发银行 15.8618 15.8088 16.0208 15.6234 15.9855 46772653 838667398 0.1236 0.7795 17.9307 0.2507 337627832611.5 337627832611.5 18653471415 6.672
'''
# 3.查看每列数据缺失值情况
df.isna().sum()
# 4.提取日期列含有空值的行
df[df['日期'].isnull()]
# 5.输出每列缺失值具体行数
for col in df.columns:
if df[col].isnull().any(): #判断这列有缺失值
print(f'列名:{col}, {df[df[col].isnull()].index.to_list()}处缺失')
# 6.删除所有存在缺失值的行
df.dropna(axis=0, how='any', inplace=True)
# 7.绘制收盘价的折线图
import matplotlib.pyplot as plt
%matplotlib inline
plt.rc('font', size=6) #设置图中字体和大小
plt.rc('figure', figsize=(4,3), dpi=150) # 设置图的大小
plt.style.use('seaborn-darkgrid') # 设置画图的风格
plt.plot(df['收盘价(元)'])
# 8.同时绘制开盘价与收盘价
plt.plot(df['开盘价(元)'], color = 'green', label='开盘价')
plt.plot(df['收盘价(元)'], color = 'red', label='收盘价')
# 9.绘制涨跌幅的直方图
plt.hist(df['涨跌幅(%)'])
# 10.让直方图更细致
df['涨跌幅(%)'].hist(bins=30)
# 11.以data的列名创建一个dataframe
df2 = pd.DataFrame(columns=df.columns.to_list())
# 12.打印所有换手率不是数字的行
df[df['换手率(%)'].apply(lambda x: not isinstance(x,float))]
# 13.打印所有换手率为--的行
df[df['换手率(%)']=='--']
# df.query("换手率(%) == '--'") #这时使用df.query会报错,因为不支持带特殊符号的字符
# 14.重置data的行号
df = df.reset_index()
# 15.删除所有换手率为非数字的行
tmp = df[df['换手率(%)'].apply(lambda x: not isinstance(x,float))].index.to_list()
df.drop(index=tmp, inplace = True)
# 16.绘制换手率的密度曲线
df['换手率(%)'].plot(kind='kde', grid=True)
# 17.计算前一天与后一天收盘价的差值
df.sort_values(['日期'],ascending=True)['收盘价(元)'].diff(1)
# 18.计算前一天与后一天收盘价变化率
df.sort_values(['日期'],ascending=True)['收盘价(元)'].pct_change(periods=1)
# 19.设置日期为索引
df.set_index(['日期'],inplace =True)
# 20.以5个数据作为一个数据滑动窗口,在这个5个数据上取均值(收盘价)
df['收盘价(元)'].rolling(window=5).mean()
# 21.以5个数据作为一个数据滑动窗口,计算这五个数据总和(收盘价)
df['收盘价(元)'].rolling(window=5).sum()
# 22.将收盘价5日均线、20日均线与原始数据绘制在同一个图上
import matplotlib.pyplot as plt
plt.plot(df['收盘价(元)'].rolling(window=5).mean(), color = 'green', label='5日均线')
plt.plot(df['收盘价(元)'].rolling(window=20).mean(), color = 'red', label='20日均线')
plt.plot(df['收盘价(元)'], color = 'blue', label='原始数据')
# 23.按周为采样规则,取一周收盘价最大值
df['收盘价(元)'].resample('W').max()
# 24.绘制重采样数据与原始数据
plt.grid()
plt.plot(df['收盘价(元)'].resample('W').max(), label='重采样数据', color = 'red')
plt.plot(df['收盘价(元)'], label='原始数据', color = 'orange')
# 25.将数据往后移动5天
df.shift(5)
# 26.将数据向前移动5天
df.shift(-5)
# 27.使用expanding函数计算开盘价的移动窗口均值
df['开盘价(元)'].expanding().mean()
# 28.绘制上一题的移动均值与原始数据折线图
plt.plot(df['开盘价(元)'].expanding().mean(),color='red')
plt.plot(df['开盘价(元)'],color='blue')