【Python_043】pandas 金融数据处理实战

数据集与题来源于和鲸社区

# 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')

你可能感兴趣的:(Python,python)