python数据分析--金融数据处理

数据来源:和鲸社区-Numpy+Pandas数据处理·第四关
主要内容:

  • 缺失数据
  1. 查看每列 数据的缺失情况
  2. 输出每列具体缺失的行数
  3. 删除所有存在缺失值的行
  • 绘制折线图
  1. 收盘价折线图
  2. 收盘价开盘价折线图
  3. 收盘价5日均线,20日均线图
  4. 收盘价上轨线,中轨线,下轨线折线图
  • 绘制密度图
  1. 删除换手率为非数字的行
  2. 绘制换手率密度图
  3. 同时绘制密度图和直方图
  • pandas窗口函数rolling 和expanding
  • 重采样 resample
  • 计算相邻两天的差值和变化率
  • 数据前移后移shift()
导入数据
import pandas as pd
data = pd.read_excel('/home/mw/input/pandas1206855/600000.SH.xls')
data.head()
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 329 entries, 0 to 328
Data columns (total 18 columns):
代码           328 non-null object
简称           327 non-null object
日期           327 non-null datetime64[ns]
前收盘价()      327 non-null float64
开盘价()       327 non-null float64
最高价()       327 non-null float64
最低价()       327 non-null float64
收盘价()       327 non-null float64
成交量()       327 non-null object
成交金额()      327 non-null object
涨跌()        327 non-null float64
涨跌幅(%)       327 non-null float64
均价()        327 non-null object
换手率(%)       327 non-null object
A股流通市值()    327 non-null float64
总市值()       327 non-null float64
A股流通股本()    327 non-null float64
市盈率          327 non-null float64
dtypes: datetime64[ns](1), float64(11), object(6)
memory usage: 46.3+ KB
缺失值处理
# 查看每列数据缺失情况
data.isnull().sum()
# 提取日期列含有空值的行
data[data['日期'].isnull()]
#输出每列缺失值具体行数
for columnname in data.columns:
    if data[columnname].count() != len(data):
        loc = data[columnname][data[columnname].isnull().values == True].index.tolist()
        print('列名:"{}",第{}行位置有缺失值'.format(columnname,loc))

python数据分析--金融数据处理_第1张图片

# 删除所有存在缺失值的行
data.dropna(axis=0,how='any',inplace=True)
    语法:
        df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
    参数:
        axis : {0 or 'index', 1 or 'columns'}, default 0
            0, or 'index':删除包含丢失值的行
            1, or 'columns':删除包含丢失值的列
            默认为0
        how : {'any', 'all'}, default 'any'
            'any': 如果存在NA值,则删除该行或列
            'all': 如果所有值都是NA,则删除该行或列
        thresh: int,保留含有int个非空值的行
        subset: 对特定的列进行缺失值删除处理

    不同情况参数设置:
        删除所有有缺失值的行
            df.dropna()
        删除所有有缺失值的列
            df.dropna(axis='columns')
            df.dropna(axis=1)
        删除所有值缺失的行
            df.dropna(how='all')
        删除至少有两个非缺失值的行
            df.dropna(thresh=2)
        指定判断缺失值的列范围
            df.dropna(subset=['name', 'born'])
        使删除和的结果生效
            df.dropna(inplace=True)
        指定列的缺失值删除
            df.toy.dropna()
绘制折线图

1.绘制收盘价的折线图

#方法一:
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid')  #设置画图风格
plt.rc('font', size=6) #设置图中字体和大小
plt.rc('figure', figsize=(16,6), dpi=150) #设置图的大小
data['收盘价(元)'].plot()

#方法二:
from matplotlib import pyplot as plt
import matplotlib

#设置画图字体格式
font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)
#设置图片大小和分辨率
plt.figure(figsize=(16, 6), dpi=80)

#绘制折线图
x = data['日期']
y = data['收盘价(元)']
plt.plot(x, y, label='收盘价(元)', color='orange', linestyle='-')

#设置x,y轴标签
plt.xlabel("日期")
plt.ylabel("收盘价(元)")
plt.title("每日收盘价趋势图")

#绘制网格
plt.grid(alpha=0.4, linestyle='--')#alpha表示透明度

#添加图例(设置图例时,必须在绘制时,加上label字段,见上plt.plot()函数)
'''upper right;upper left;
   lower left;lower right;
   best; right; center
   center left; center right
   lower center; upper center
'''
plt.legend(loc="upper right")

#展示图
plt.show()

2.同时绘制开盘价和收盘价

#方法一:
#设置画图字体格式
font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)

#设置图片大小和分辨率
plt.figure(figsize=(16, 6), dpi=80)

#绘制折线图
x = data['日期']
y1 = data['收盘价(元)']
y2 = data['开盘价(元)']
plt.plot(x, y1, label='收盘价(元)', color='orange', linestyle='-')
plt.plot(x, y2, label='开盘价(元)', color='blue', linestyle='-')

#设置x,y轴标签
plt.xlabel("日期")
plt.ylabel("价钱(元)")
plt.title("每日开盘收盘趋势图")

#绘制网格
plt.grid(alpha=0.4, linestyle='--')#alpha表示透明度

#添加图例(设置图例时,必须在绘制时,加上label字段,见上plt.plot()函数)
'''upper right;upper left;
   lower left;lower right;
   best; right; center
   center left; center right
   lower center; upper center
'''
plt.legend(loc="upper right")

#展示图
plt.show()
#方法二:
plt.rcParams['font.sans-serif']=['Simhei']  #显示中文
plt.rcParams['axes.unicode_minus']=False    #设置显示中文后,负号显示受影响,显示负号  

plt.rc('figure', figsize=(16, 6), dpi=150) #设置图的大小
data[['收盘价(元)', '开盘价(元)']].plot()

3.收盘价5日均线,20日均线图

#方法一:
mean_5 = data['收盘价(元)'].rolling(5).mean()
mean_20 = data['收盘价(元)'].rolling(20).mean()

font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)

plt.rc('figure', figsize=(16,6), dpi=150) #设置图的大小
plt.plot(data['收盘价(元)'], label='原始数据')
plt.plot(mean_5, label='5日均线')
plt.plot(mean_20, label='20日均线')

plt.legend(loc='upper right')
plt.show()
#方法二:
#data['收盘价(元)'].plot()
#data['收盘价(元)'].rolling(5).mean().plot()
#data['收盘价(元)'].rolling(20).mean().plot()

4.绘制上轨线,下轨线,中轨线折线图

MB = data['收盘价(元)'].rolling(20).mean()
UP = MB+MD*2
DN = MB-MD*2

font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)

plt.rc('figure', figsize=(16,6), dpi=150) #设置图的大小

plt.plot(MB, label='中轨线')
plt.plot(UP, label='上轨线')
plt.plot(DN, label='下轨线')

plt.xlabel('index')
plt.ylabel('开盘价(元)')
plt.legend(loc='upper right')
plt.grid(alpha=0.4)
plt.show()
绘制密度图
# 打印所有换手率不是数字的行
for i in range(len(data)):
    if type(data['换手率(%)'][i]) != float: #data['换手率(%)'][i]或写成data.iloc[i, 13]
        temp = temp.append(data.loc[i])
temp.head()
 # 如果是判断某一列(字符串类型)是否包含指定字符串:
 # 方法一:
 #      df[df["columns"].str.contains("--")]
 # 方法二:
 #   isin()函数:清洗数据,删选过滤掉DataFrame中一些行

data[data['换手率(%)'].isin(['--'])]

1.删除所有换手率为非数字的行

# 删除所有换手率为非数字的行
k = []
for i in range(len(data)):
    if type(data['换手率(%)'][i]) != float: #data['换手率(%)'][i]或写成data.iloc[i, 13]
        k.append(i)
data.drop(labels=k, inplace=True)
data

2.绘制换手率的密度曲线

# 绘制换手率的密度曲线

# 密度图(density plots),也叫核密度图( kernel density estimate,KDE)是理解数值变量分布的另一个方法。相比直方图,它的主要优势是不依赖于柱的尺寸,更加清晰。
#方法一:
data['换手率(%)'].plot.kde()
#方法二:
data['换手率(%)'].plot(kind='kde')

python数据分析--金融数据处理_第2张图片
3.同时显示密度图与直方图

#同时显示密度图与直方图
import seaborn as sns, numpy as np
sns.set(); np.random.seed(0)
ax = sns.distplot(data['换手率(%)'])

python数据分析--金融数据处理_第3张图片

窗口函数rolling和expanding

    Pandas进阶之窗口函数rolling()和expanding():
        https://www.jianshu.com/p/b8c795345e93
    rolling()函数,是固定窗口大小,进行滑动计算,expanding()函数只设置最小的观测值数量,不固定窗口大小,实现累计计算,即不断扩展;
        DataFrame.expanding(min_periods = 1,center = False,axis = 0)

# 设置日期为索引
data = data.set_index('日期')
#以5个数据作为一个数据滑动窗口,在这5个数据上取均值(收盘价)
data['收盘价(元)'].rolling(5).mean()
# 以5个数据作为一个数据滑动窗口,计算这五个数据总和(收盘价)
data['收盘价(元)'].rolling(5).sum()
重采样resample

Python3 如何使用Pandas库将日数据转换为周数据、月数据或季度数据https://blog.csdn.net/weixin_44904908/article/details/107065633
pandas的resample重采样 (方法各参数详解)https://www.cnblogs.com/jingsupo/p/pandas-resample.html

# 按周为采样规则,取一周收盘价最大值
data['收盘价(元)'].resample('W').max()
# 绘制重采样数据与原始数据
plt.figure(figsize=(16, 6), dpi=80)
data['收盘价(元)'].plot()
data['收盘价(元)'].resample('7D').max().plot()
计算相邻两天的差值和变化率
#计算前一天与后一天的收盘价的差值
#方法一:
# data['收盘价(元)'].diff()
#方法二:shift(1)表示上移一位
diff = data['收盘价(元)'] - data['收盘价(元)'].shift(1)
diff
# 计算前一天与后一天收盘价变化率
#方法一:
# data['收盘价(元)'].pct_change()
#方法二:
data['收盘价(元)']/data['收盘价(元)'].shift(1) - 1
数据前移后移
data.shift(5)  # 前移
data.shift(-5) # 后移

你可能感兴趣的:(python,数据分析,金融)