方法見:https://blog.csdn.net/zwy_0309/article/details/108217342
在此,我使用以下腳本得到股票(代碼:688022)在開始時間至現(xiàn)在的行情信息:
【腳本】
import tushare as ts
frame = ts.get_k_data('688022', start='2019-07-22')
print(frame)
【結(jié)果】
date open close high low volume code
0 2019-07-22 67.60 50.19 68.99 33.53 17681055.0 688022
1 2019-07-23 40.98 44.45 47.55 40.98 6996702.0 688022
2 2019-07-24 45.18 50.72 50.85 45.18 9718576.0 688022
3 2019-07-25 52.00 55.17 60.65 52.00 11794163.0 688022
4 2019-07-26 53.52 51.70 55.45 50.44 7550641.0 688022
.. ... ... ... ... ... ... ...
279 2020-09-10 38.01 36.79 38.60 36.79 906319.0 688022
280 2020-09-11 36.83 37.30 37.88 36.33 841580.0 688022
281 2020-09-14 37.88 38.43 39.01 37.88 1095643.0 688022
282 2020-09-15 38.66 38.48 38.92 38.22 760755.0 688022
283 2020-09-16 38.80 39.30 39.61 38.01 993362.0 688022
[284 rows x 7 columns]
【說明】
2 以上結(jié)果中只展示了前5及后5條數(shù)據(jù),如果想加載全部的數(shù)據(jù),則在代碼中增加一句話:pd.set_option('display.max_rows', None)2 當(dāng)然,有時列太多,也會顯示不全,如果想顯示全,則用pd.set_option('display.max_columns', None),
2 如果列太多換行了,則增加一個設(shè)置語句:pd.set_option('display.width', 500),其中500是整體顯示的寬度,這樣有的列不會換行。
第二步:設(shè)置時間序列索引
【腳本】
frame = frame.set_index('date')frame.index = pd.to_datetime(frame.index)
【結(jié)果】
open close high low volume code
date
2019-07-22 67.60 50.19 68.99 33.53 17681055.0 688022
2019-07-23 40.98 44.45 47.55 40.98 6996702.0 688022
【說明】
在顯示上與上面不同,date不再是列標(biāo)題,而是變成了索引,之前的位置索引0、1、2……不見了。
另外,還需要將索引列轉(zhuǎn)換為時間類型,使用的函數(shù)為to_datetime()
第三步:得到每天收盤價比前一天收盤時漲的費(fèi)用
方法一:移動收盤價形成新的frame,再將兩個frame的close列相減
【腳本】
frame1 = frame.shift(1)print(frame1)
print(frame['close'] - frame1['close'])
【結(jié)果1】
open close high low volume code
date
2019-07-22 NaN NaN NaN NaN NaN NaN
2019-07-23 67.60 50.19 68.99 33.53 17681055.0 688022
2019-07-24 40.98 44.45 47.55 40.98 6996702.0 688022
【結(jié)果2】
date
2019-07-22 NaN
2019-07-23 -5.74
...
2020-09-15 0.05
2020-09-16 0.82
【說明】
1、 對比原frame數(shù)據(jù)與【結(jié)果1】,發(fā)現(xiàn)frame1的數(shù)據(jù)都發(fā)生了向下位移1天的情況,而索引沒有變化。
2、 【結(jié)果2】即為每天收盤價減前一天收盤價的增加量,即為股票漲了多少。
仔細(xì)看會發(fā)現(xiàn),這樣的結(jié)果中,索引列數(shù)據(jù)不是連續(xù)的,而是只有交易日的數(shù)據(jù)。
方法二:移動索引列形成新的frame,再將兩個frame的close列相減
【腳本】
frame2 = frame.shift(-1, freq='D')print(frame2)
print(frame['close'] - frame2['close'])
【結(jié)果1】
open close high low volume code
date
2019-07-21 67.60 50.19 68.99 33.53 17681055.0 688022
2019-07-22 40.98 44.45 47.55 40.98 6996702.0 688022
2019-07-23 45.18 50.72 50.85 45.18 9718576.0 688022
【結(jié)果2】
date
2019-07-21 NaN
2019-07-22 5.74
2019-07-23 -6.27
2019-07-24 -4.45
2019-07-25 3.47
...
2020-09-11 NaN
2020-09-13 NaN
2020-09-14 -0.05
2020-09-15 -0.82
2020-09-16 NaN
【說明】
索引列向后移動后,自動補(bǔ)了一天‘2019-07-21’,可以想到,后面每一周同樣會補(bǔ)一個日期,而這個日期卻不是交易日,在原frame中是不存在的。
由【結(jié)果2】可以看出,因?yàn)槿掌谒饕囊苿优c自動被充,會導(dǎo)致非交易日數(shù)據(jù)相減結(jié)果為“NaN”。這一情況,在方法一中是不存在的。
總結(jié)
以上方法,比循環(huán)使用“第i行數(shù)據(jù)減第i-1行數(shù)據(jù)”的方法執(zhí)行效率高。
記住frame.shift()函數(shù)!