拿金融数据举例,通过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)
网友评论