同花顺Supermind量化交易 Python基础编程--pandas进阶

247 阅读7分钟

本节为pandas进阶内容,核心还是DataFrame数据处理,注意包括缺失数据处理、函数的应用和映射、数据规整等。

第七节:pandas进阶

  本节为pandas进阶内容,核心还是DataFrame数据处理,注意包括缺失数据处理、函数的应用和映射、数据规整等。
开始之前首先导入库:numpy和pandas

In [1]:

import pandas as pd
import numpy as np 

一、缺失数据处理

  还是获取MindGo平台的数据来演示:

In [4]:

# 获取招商银行近10个工作日的开盘价、最高价、最低价、收盘价。并将部分数据赋值为NAN,假设为缺失部分。
price= get_price('600036.SH', None, '20180125', '1d', ['open', 'high', 'low', 'close'], False, 'pre', 10, is_panel=1)
price[price > 34] = np.nan
price

Out[4]:

closehighlowopen
2018-01-1231.5131.5831.0231.12
2018-01-1531.9432.4031.3031.48
2018-01-1631.8932.2831.5431.80
2018-01-1731.6933.1131.5032.10
2018-01-1832.3232.7532.1032.10
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-23NaNNaN33.2033.20
2018-01-2433.85NaN33.45NaN
2018-01-2533.41NaN32.90NaN

  1.去掉包含缺失值的行

In [6]:

price.dropna()

Out[6]:

closehighlowopen
2018-01-1231.5131.5831.0231.12
2018-01-1531.9432.4031.3031.48
2018-01-1631.8932.2831.5431.80
2018-01-1731.6933.1131.5032.10
2018-01-1832.3232.7532.1032.10
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18

  2.对缺失值进行填充为30

In [7]:

price.fillna(value=30)

Out[7]:

closehighlowopen
2018-01-1231.5131.5831.0231.12
2018-01-1531.9432.4031.3031.48
2018-01-1631.8932.2831.5431.80
2018-01-1731.6933.1131.5032.10
2018-01-1832.3232.7532.1032.10
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2330.0030.0033.2033.20
2018-01-2433.8530.0033.4530.00
2018-01-2533.4130.0032.9030.00

  3.判断数据是否为nan

In [8]:

pd.isnull(price)

Out[8]:

closehighlowopen
2018-01-12FalseFalseFalseFalse
2018-01-15FalseFalseFalseFalse
2018-01-16FalseFalseFalseFalse
2018-01-17FalseFalseFalseFalse
2018-01-18FalseFalseFalseFalse
2018-01-19FalseFalseFalseFalse
2018-01-22FalseFalseFalseFalse
2018-01-23TrueTrueFalseFalse
2018-01-24FalseTrueFalseTrue
2018-01-25FalseTrueFalseTrue

二、函数的应用和映射

  再次获取MindGo平台的数据来演示:

In [13]:

# 获取招商银行近10个工作日的开盘价、最高价、最低价、收盘价。
price= get_price('600036.SH', None, '20180125', '1d', ['open', 'high', 'low', 'close'], False, 'pre', 10, is_panel=1)
price

Out[13]:

closehighlowopen
2018-01-1231.5131.5831.0231.12
2018-01-1531.9432.4031.3031.48
2018-01-1631.8932.2831.5431.80
2018-01-1731.6933.1131.5032.10
2018-01-1832.3232.7532.1032.10
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2334.0534.1733.2033.20
2018-01-2433.8535.3533.4534.25
2018-01-2533.4134.0232.9034.01

  1.列计算平均值

In [14]:

price.mean()

Out[14]:

close    32.620
high     33.265
low      32.137
open     32.490
dtype: float64

  2.行计算平均值

In [15]:

price.mean(1)

Out[15]:

2018-01-12    31.3075
2018-01-15    31.7800
2018-01-16    31.8775
2018-01-17    32.1000
2018-01-18    32.3175
2018-01-19    32.6700
2018-01-22    32.7625
2018-01-23    33.6550
2018-01-24    34.2250
2018-01-25    33.5850
dtype: float64

  如果你担心你求均值时受到缺失值的影响,你可以:

In [16]:

price.mean(axis = 1,skipna = True) # skipna参数默认是 True 表示排除缺失值  axis=1是按行 axis=0是按列

Out[16]:

2018-01-12    31.3075
2018-01-15    31.7800
2018-01-16    31.8775
2018-01-17    32.1000
2018-01-18    32.3175
2018-01-19    32.6700
2018-01-22    32.7625
2018-01-23    33.6550
2018-01-24    34.2250
2018-01-25    33.5850
dtype: float64

三、数据规整

  Pandas提供了大量的方法能够轻松的对Series,DataFrame和Panel对象进行各种符合各种逻辑关系的合并操作,主要介绍三个常用操作。

操作方式释义
concat可以沿一条轴将多个对象堆叠到一起。
append将一行连接到一个DataFrame上
duplicated移除重复数据

  1.concat
首先我们分别获取两个DataFrame。

In [18]:

# 获取招商银行20180125日的前5个工作日的开盘价、最高价、最低价、收盘价。
price1= get_price('600036.SH', None, '20180125', '1d', ['open', 'high', 'low', 'close'], False, 'pre', 5, is_panel=1)
price1

Out[18]:

closehighlowopen
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2334.0534.1733.2033.20
2018-01-2433.8535.3533.4534.25
2018-01-2533.4134.0232.9034.01

In [19]:

# 获取招商银行20170125日的前5个工作日的开盘价、最高价、最低价、收盘价。
price2= get_price('600036.SH', None, '20170125', '1d', ['open', 'high', 'low', 'close'], False, 'pre', 5, is_panel=1)
price2

Out[19]:

closehighlowopen
2017-01-1918.5218.7418.5118.55
2017-01-2018.5918.6518.4718.54
2017-01-2318.5018.7618.4118.68
2017-01-2418.8718.8818.5018.59
2017-01-2518.8818.9518.6818.81

  纵向拼接(默认):

In [21]:

pd.concat([price1,price2],axis=0)

Out[21]:

closehighlowopen
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2334.0534.1733.2033.20
2018-01-2433.8535.3533.4534.25
2018-01-2533.4134.0232.9034.01
2017-01-1918.5218.7418.5118.55
2017-01-2018.5918.6518.4718.54
2017-01-2318.5018.7618.4118.68
2017-01-2418.8718.8818.5018.59
2017-01-2518.8818.9518.6818.81

  横向拼接,index对不上的会用 NaN 填充:

In [24]:

pd.concat([price1,price2],axis=1)

Out[24]:

closehighlowopenclosehighlowopen
2017-01-19NaNNaNNaNNaN18.5218.7418.5118.55
2017-01-20NaNNaNNaNNaN18.5918.6518.4718.54
2017-01-23NaNNaNNaNNaN18.5018.7618.4118.68
2017-01-24NaNNaNNaNNaN18.8718.8818.5018.59
2017-01-25NaNNaNNaNNaN18.8818.9518.6818.81
2018-01-1932.4633.3532.2132.66NaNNaNNaNNaN
2018-01-2233.0833.6432.1532.18NaNNaNNaNNaN
2018-01-2334.0534.1733.2033.20NaNNaNNaNNaN
2018-01-2433.8535.3533.4534.25NaNNaNNaNNaN
2018-01-2533.4134.0232.9034.01NaNNaNNaNNaN

  2.append
首先获取数据

In [25]:

# 获取招商银行20180125日的前5个工作日的开盘价、最高价、最低价、收盘价。
price= get_price('600036.SH', None, '20180125', '1d', ['open', 'high', 'low', 'close'], False, 'pre', 5, is_panel=1)
price

Out[25]:

closehighlowopen
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2334.0534.1733.2033.20
2018-01-2433.8535.3533.4534.25
2018-01-2533.4134.0232.9034.01

In [26]:

s = price.iloc[0]
print(s)
close    32.46
high     33.35
low      32.21
open     32.66
Name: 2018-01-19 00:00:00, dtype: float64

In [27]:

price.append(s, ignore_index=False) # ignore_index=False 表示索引不变

Out[27]:

closehighlowopen
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2334.0534.1733.2033.20
2018-01-2433.8535.3533.4534.25
2018-01-2533.4134.0232.9034.01
2018-01-1932.4633.3532.2132.66

In [28]:

price.append(s, ignore_index=True) # ignore_index=True 表示索引重置

Out[28]:

closehighlowopen
032.4633.3532.2132.66
133.0833.6432.1532.18
234.0534.1733.2033.20
333.8535.3533.4534.25
433.4134.0232.9034.01
532.4633.3532.2132.66

  3.移除重复数据duplicated

   延续append示例

In [31]:

price2=price.append(s, ignore_index=False) # ignore_index=False 表示索引不变
price2

Out[31]:

closehighlowopen
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2334.0534.1733.2033.20
2018-01-2433.8535.3533.4534.25
2018-01-2533.4134.0232.9034.01
2018-01-1932.4633.3532.2132.66

  查看重复数据:

In [32]:

price2.duplicated()

Out[32]:

2018-01-19    False
2018-01-22    False
2018-01-23    False
2018-01-24    False
2018-01-25    False
2018-01-19     True
dtype: bool

  移除重复数据:

In [33]:

price2.drop_duplicates()

Out[33]:

closehighlowopen
2018-01-1932.4633.3532.2132.66
2018-01-2233.0833.6432.1532.18
2018-01-2334.0534.1733.2033.20
2018-01-2433.8535.3533.4534.25
2018-01-2533.4134.0232.9034.01

  可以看到'2018-01-19'的重复行被删除了

查看以上策略详情请到supermind量化交易官网查看:同花顺Supermind量化交易 Python基础编程--pandas进阶