拿金融數(shù)據(jù)舉例,通過tushare
獲取個股歷史行情數(shù)據(jù)
>>> 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可以將不同日期的值取入同一行計算。交易日不是連續(xù)的红碑,所以只能移動數(shù)據(jù)戳寸。
DataFrame.shift(periods=1, freq=None, axis=0, fill_value=None)
freq指定時刨仑,移動的就是dataframe的index,axis可以設(shè)置移動列苫耸。
所以根據(jù)情況設(shè)置不同的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)
結(jié)果:
>>> 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
實際應(yīng)用場景可能會復(fù)雜很多,比如用到分組移動
>>> df.groupby('ticker', as_index=False, sort=False).shift(-1, fill_value=0)