Pandas不同日期数据做计算

拿金融数据举例,通过tushare获取个股历史行情数据

>>> import tushare as ts
>>> ts.get_his_data('60048')
             open   high  close    low  ...    ma20      v_ma5     v_ma10     v_ma20
date                                    ...                                         
2019-05-16  34.16  34.50  33.85  33.34  ...  33.928  150847.40  134251.66  133670.39
2019-05-15  34.28  34.80  34.10  33.80  ...  34.038  154416.84  141012.87  142859.79
2019-05-14  34.00  35.10  33.63  33.27  ...  34.035  150851.64  141492.06  148408.40
2019-05-13  32.00  34.97  34.64  31.90  ...  33.949  142929.32  134009.24  144103.20

如果要计算05-16的涨跌幅,需要用(今日收盘价-昨日收盘价)/昨日收盘价.

一般使用pd.DataFrame.shift可以将不同日期的值取入同一行计算。交易日不是连续的,所以只能移动数据。
DataFrame.shift(periods=1, freq=None, axis=0, fill_value=None)
freq指定时,移动的就是dataframe的index,axis可以设置移动列。
所以根据情况设置不同的periods和freq就能方便同不同日期的值做计算了。

>>>  df['pre_close']=df.shift(-1)['close']

通过apply新增一列涨跌幅,axis为1代表lambda这里传入的是一行,而不是一列(series), 就可以通过原来不同列的值计算新的一列了。

>>> df['chg_pct'] = df.apply(lambda x: (x.close-x.pre_close)/x.pre_close, axis=1)

结果:

>>> df.head(5)
             open   high  close  ...     v_ma20  pre_close   chg_pct
date                             ...                                
2019-05-16  34.16  34.50  33.85  ...  133670.39      34.10 -0.007331
2019-05-15  34.28  34.80  34.10  ...  142859.79      33.63  0.013976
2019-05-14  34.00  35.10  33.63  ...  148408.40      34.64 -0.029157
2019-05-13  32.00  34.97  34.64  ...  144103.20      32.48  0.066502
2019-05-10  30.66  32.55  32.48  ...  144100.62      29.79  0.090299


实际应用场景可能会复杂很多,比如用到分组移动

>>> df.groupby('ticker', as_index=False, sort=False).shift(-1, fill_value=0)

你可能感兴趣的:(Pandas不同日期数据做计算)