结合金融时间序列演示Pandas模块的操作(四)
由于 Pandas 是 Python 的外部第三方模块,在使用前需要导入,并查询 Pandas 的版本号信息。
>>>import pandas as pd
>>>pd.__version__ #查询Pandas的版本号
'1.0.1'
一、数据框之间的操作
对数据进行分析时,往往会出现同时需要多个数据框的情况,为了便于分析,可以将不同的数据框进行拼接,拼接分为两类:一类是按行拼接(上下结构);另一类是按列拼接(左右结构)。
在 Pandas 中,关于数据框的拼接涉及3个函数,即 concat、merge 和 join,其中,concat 可以运用于按行、按列拼接,merge 和 join 则主要运用于按列拼接。
为便于演示,需要导入4个数据框,具体如下所述。
(一)生成新的数据框
例1:从外部导入沪深300指数在2018年每日交易价格的数据并且生成一个新的数据框,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>HS300_excel1 = pd.read_excel('C:/Desktop/配套彩图和数据/沪深300指数(2018年).xlsx',sheet_name="Sheet1",header=0,index_col=0) #导入外部数据
>>>HS300_excel1.head() #运用head函数查看数据框的头部(最前面5行)数据
----------------------------------输出结果-------------------------------------
开盘点位 最高点位 最低点位 收盘点位
日期
2018-01-02 4045.2086 4087.7789 4045.2086 4087.4012
2018-01-03 4091.4607 4140.0543 4088.7302 4111.3925
2018-01-04 4114.1213 4137.6420 4105.8858 4128.8119
2018-01-05 4133.3439 4151.2818 4123.2817 4138.7505
2018-01-08 4140.8545 4166.3182 4127.3081 4160.1595
-----------------------------------代 码---------------------------------------
>>>HS300_excel1.tail() #运用tail函数查看数据框的尾部(最末尾5行)数据
----------------------------------输出结果--------------------------------------
开盘点位 最高点位 最低点位 收盘点位
日期
2018-12-24 3015.4974 3040.3524 3007.3292 3038.1981
2018-12-25 3006.8787 3030.1418 2964.8750 3017.2815
2018-12-26 3012.8690 3029.0608 2996.4829 3002.0327
2018-12-27 3042.9491 3047.2348 2990.5057 2990.5057
2018-12-28 2994.7950 3024.3525 2984.8177 3010.6536
例2:从外部导入沪深300指数在2016年每日交易价格的数据并且生成一个新的数据框,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>HS300_excel2 = pd.read_excel('C:/Desktop/沪深300指数.xlsx',sheet_name="Sheet2",header=0,index_col=0)
>>>HS300_excel2.head()
----------------------------------输出结果-------------------------------------
开盘点位 最高点位 最低点位 收盘点位
日期
2016-01-04 3725.8561 3726.2446 3468.9485 3469.0662
2016-01-05 3382.1769 3518.2170 3377.2799 3478.7797
2016-01-06 3482.4064 3543.7394 3468.4666 3539.8082
2016-01-07 3481.1499 3481.1499 3284.7374 3294.3839
2016-01-08 3371.8710 3418.8508 3237.9307 3361.5632
-----------------------------------代 码----------------------------------------
>>>HS300_excel2.tail()
----------------------------------输出结果-------------------------------------
开盘点位 最高点位 最低点位 收盘点位
日期
2017-12-25 4057.4173 4086.9342 4026.4496 4041.5401
2017-12-26 4040.6173 4056.8554 4015.2996 4053.6224
2017-12-27 4045.2793 4047.7366 3986.7385 3991.2075
2017-12-28 3992.9970 4036.6975 3980.2358 4018.8974
2017-12-29 4022.8826 4043.1400 4012.8749 4030.8549
例3:从外部导入2018年3月浦发银行、上海机场、中国石化这三只股票的日收盘价格数据,并且生成一个新的数据框,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>stock1 = pd.read_excel('C:/Desktop/关于2018年3月份股票价格数据.xlsx',sheet_name="Sheet1",header=0,index_col=0)
>>>stock1 #输出全部数据
----------------------------------输出结果-------------------------------------
浦发银行 上海机场 中国石化
日期
2018-03-01 12.47 49.33 6.39
2018-03-02 12.41 50.35 6.33
2018-03-05 12.42 50.22 6.39
2018-03-06 12.49 NaN 6.47
2018-03-07 12.49 49.22 6.44
2018-03-08 12.47 49.64 NaN
2018-03-09 12.48 50.83 6.39
2018-03-12 12.50 50.09 6.45
2018-03-13 12.49 50.54 6.37
2018-03-14 12.39 49.84 6.42
2018-03-15 12.39 50.00 6.42
2018-03-16 12.30 49.34 6.42
2018-03-19 NaN 50.14 6.59
2018-03-20 12.32 49.99 6.83
2018-03-21 12.29 49.99 6.85
2018-03-22 12.25 50.79 6.84
2018-03-23 11.71 50.78 6.83
2018-03-26 11.61 50.03 6.64
2018-03-27 11.62 49.32 6.64
2018-03-28 11.57 49.25 6.43
2018-03-29 11.62 47.65 6.62
2018-03-30 11.65 48.84 6.48
例4:从外部导入2018年3月东方航空、宝钢股份这两只股票的日收盘价格数据,并且生成一个新的数据框,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>stock2 = pd.read_excel('C:/Desktop/关于2018年3月份股票价格数据.xlsx',sheet_name="Sheet2",header=0,index_col=0)
>>>stock2 #输出全部数据
----------------------------------输出结果-------------------------------------
东方航空 宝钢股份
日期
2018-03-01 7.6060 9.5103
2018-03-02 7.4473 9.1394
2018-03-05 7.4870 9.0443
2018-03-06 7.5961 9.1680
2018-03-07 7.4771 8.9587
2018-03-08 7.4870 8.9207
2018-03-09 7.5068 8.6544
2018-03-12 7.6258 8.7590
2018-03-13 7.5366 8.7780
2018-03-14 7.4076 9.0634
2018-03-15 7.3283 9.0729
2018-03-16 7.3184 8.9492
2018-03-19 7.1597 8.6734
2018-03-20 7.1796 8.7210
2018-03-21 7.1796 8.7115
2018-03-22 7.1796 8.6069
2018-03-23 7.1696 8.2550
2018-03-26 6.9118 7.9221
2018-03-27 7.0308 7.9887
2018-03-28 6.8821 7.9411
2018-03-29 7.0804 8.2169
2018-03-30 7.1498 8.1028
(二)函数 concat 的运用
函数 concat 可用于将数据框按行、按列拼接,具体用法如下:
注意,当参数axis=0时表示按行拼接,axis=1时则表示按列拼接。
1.按行拼接
例5:以例1和例2生成的两个沪深300指数的日交易价格数据框按行拼接,最终生成2016年至2018年期间沪深300指数每日交易价格的数据框,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>HS300_new = pd.concat([HS300_excel2,HS300_excel1],axis=0) #运用 concat 函数按行拼接
>>>HS300_new.head() #查看头部五行
----------------------------------输出结果-------------------------------------
开盘点位 最高点位 最低点位 收盘点位
日期
2016-01-04 3725.8561 3726.2446 3468.9485 3469.0662
2016-01-05 3382.1769 3518.2170 3377.2799 3478.7797
2016-01-06 3482.4064 3543.7394 3468.4666 3539.8082
2016-01-07 3481.1499 3481.1499 3284.7374 3294.3839
2016-01-08 3371.8710 3418.8508 3237.9307 3361.5632
-----------------------------------代 码----------------------------------------
>>>HS300_new.tail() #查看尾部五行
----------------------------------输出结果-------------------------------------
开盘点位 最高点位 最低点位 收盘点位
日期
2018-12-24 3015.4974 3040.3524 3007.3292 3038.1981
2018-12-25 3006.8787 3030.1418 2964.8750 3017.2815
2018-12-26 3012.8690 3029.0608 2996.4829 3002.0327
2018-12-27 3042.9491 3047.2348 2990.5057 2990.5057
2018-12-28 2994.7950 3024.3525 2984.8177 3010.6536
2.按列拼接
例6:运用例3生成的浦发银行、上海机场、中国石化这3只股票2018年3月的日收盘价形成的数据框 stock1,和例4生成的东方航空、宝钢股份这2只股票同期的日收盘价的数据框 stock2,将这两个数据框按列拼接,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>stock_new = pd.concat([stock1,stock2],axis=1) #运用 concat 函数按行列接
>>>stock_new
----------------------------------输出结果-------------------------------------
浦发银行 上海机场 中国石化 东方航空 宝钢股份
日期
2018-03-01 12.47 49.33 6.39 7.6060 9.5103
2018-03-02 12.41 50.35 6.33 7.4473 9.1394
2018-03-05 12.42 50.22 6.39 7.4870 9.0443
2018-03-06 12.49 NaN 6.47 7.5961 9.1680
2018-03-07 12.49 49.22 6.44 7.4771 8.9587
2018-03-08 12.47 49.64 NaN 7.4870 8.9207
2018-03-09 12.48 50.83 6.39 7.5068 8.6544
2018-03-12 12.50 50.09 6.45 7.6258 8.7590
2018-03-13 12.49 50.54 6.37 7.5366 8.7780
2018-03-14 12.39 49.84 6.42 7.4076 9.0634
2018-03-15 12.39 50.00 6.42 7.3283 9.0729
2018-03-16 12.30 49.34 6.42 7.3184 8.9492
2018-03-19 NaN 50.14 6.59 7.1597 8.6734
2018-03-20 12.32 49.99 6.83 7.1796 8.7210
2018-03-21 12.29 49.99 6.85 7.1796 8.7115
2018-03-22 12.25 50.79 6.84 7.1796 8.6069
2018-03-23 11.71 50.78 6.83 7.1696 8.2550
2018-03-26 11.61 50.03 6.64 6.9118 7.9221
2018-03-27 11.62 49.32 6.64 7.0308 7.9887
2018-03-28 11.57 49.25 6.43 6.8821 7.9411
2018-03-29 11.62 47.65 6.62 7.0804 8.2169
2018-03-30 11.65 48.84 6.48 7.1498 8.1028
(三)函数 merge 的运用
函数 merge 主要用于对不同数据框按列进行拼接。需要注意的是,在使用该函数时,需要明确放置在左侧(left)与右侧(right)的数据框。
例7:沿用例3和例4中涉及的两个数据框stock1、stock2,运用函数 merge 按列拼接,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>pd.merge(left=stock1,right=stock2,left_index=True,right_index=True)
----------------------------------输出结果-------------------------------------
浦发银行 上海机场 中国石化 东方航空 宝钢股份
日期
2018-03-01 12.47 49.33 6.39 7.6060 9.5103
2018-03-02 12.41 50.35 6.33 7.4473 9.1394
2018-03-05 12.42 50.22 6.39 7.4870 9.0443
2018-03-06 12.49 NaN 6.47 7.5961 9.1680
2018-03-07 12.49 49.22 6.44 7.4771 8.9587
2018-03-08 12.47 49.64 NaN 7.4870 8.9207
2018-03-09 12.48 50.83 6.39 7.5068 8.6544
2018-03-12 12.50 50.09 6.45 7.6258 8.7590
2018-03-13 12.49 50.54 6.37 7.5366 8.7780
2018-03-14 12.39 49.84 6.42 7.4076 9.0634
2018-03-15 12.39 50.00 6.42 7.3283 9.0729
2018-03-16 12.30 49.34 6.42 7.3184 8.9492
2018-03-19 NaN 50.14 6.59 7.1597 8.6734
2018-03-20 12.32 49.99 6.83 7.1796 8.7210
2018-03-21 12.29 49.99 6.85 7.1796 8.7115
2018-03-22 12.25 50.79 6.84 7.1796 8.6069
2018-03-23 11.71 50.78 6.83 7.1696 8.2550
2018-03-26 11.61 50.03 6.64 6.9118 7.9221
2018-03-27 11.62 49.32 6.64 7.0308 7.9887
2018-03-28 11.57 49.25 6.43 6.8821 7.9411
2018-03-29 11.62 47.65 6.62 7.0804 8.2169
2018-03-30 11.65 48.84 6.48 7.1498 8.1028
函数 merge 中的参数 left_index 表示是否按照左侧数据框的行索引拼接,输入 True 则代表是、False 代表否,参数 right_index 则代表是否按照右侧数据框的行索引拼接,用法与 left_index 一致。在本例中,由于两个数据框的行索引完全相同,因此采用同时按照两个数据框的行索引进行拼接。
(四)函数 join 的运用
函数 join 用于对不同数据框进行按列拼接,其用法如下:
其中,函数 join 中的参数 on 表示按照某个或某几个索引进行合并,默认情况是按照两个数据框的行索引进行拼接。
例8:沿用例3和例4中涉及的两个数据框stock1、stock2,运用函数 join 按列拼接,具体代码如下:
-----------------------------------代 码----------------------------------------
>>>stock1.join(stock2,on='日期')
----------------------------------输出结果-------------------------------------
浦发银行 上海机场 中国石化 东方航空 宝钢股份
日期
2018-03-01 12.47 49.33 6.39 7.6060 9.5103
2018-03-02 12.41 50.35 6.33 7.4473 9.1394
2018-03-05 12.42 50.22 6.39 7.4870 9.0443
2018-03-06 12.49 NaN 6.47 7.5961 9.1680
2018-03-07 12.49 49.22 6.44 7.4771 8.9587
2018-03-08 12.47 49.64 NaN 7.4870 8.9207
2018-03-09 12.48 50.83 6.39 7.5068 8.6544
2018-03-12 12.50 50.09 6.45 7.6258 8.7590
2018-03-13 12.49 50.54 6.37 7.5366 8.7780
2018-03-14 12.39 49.84 6.42 7.4076 9.0634
2018-03-15 12.39 50.00 6.42 7.3283 9.0729
2018-03-16 12.30 49.34 6.42 7.3184 8.9492
2018-03-19 NaN 50.14 6.59 7.1597 8.6734
2018-03-20 12.32 49.99 6.83 7.1796 8.7210
2018-03-21 12.29 49.99 6.85 7.1796 8.7115
2018-03-22 12.25 50.79 6.84 7.1796 8.6069
2018-03-23 11.71 50.78 6.83 7.1696 8.2550
2018-03-26 11.61 50.03 6.64 6.9118 7.9221
2018-03-27 11.62 49.32 6.64 7.0308 7.9887
2018-03-28 11.57 49.25 6.43 6.8821 7.9411
2018-03-29 11.62 47.65 6.62 7.0804 8.2169
2018-03-30 11.65 48.84 6.48 7.1498 8.1028
注:所有数据均来自《基于Python的金融分析与风险管理》一书的配套资源。