pandas的IO 量化投資逃不過數據處理,數據處理逃不過數據的讀取和存儲。一般,最常用的交易數據存儲格式是csv,但是csv有一個很大的缺點,就是無論如何,存儲起來都是一個文本的格式,例如日期‘2018-01-01’,在csv裡面是字元串格式存儲,每次read_csv的時候,我們如果希望日期以da ...
pandas的IO
量化投資逃不過數據處理,數據處理逃不過數據的讀取和存儲。一般,最常用的交易數據存儲格式是csv,但是csv有一個很大的缺點,就是無論如何,存儲起來都是一個文本的格式,例如日期‘2018-01-01’,在csv裡面是字元串格式存儲,每次read_csv的時候,我們如果希望日期以datatime格式存儲的時候,都要用pd.to_datetime()函數來轉換一下,顯得很麻煩。而且,csv文件萬一一不小心被excel打開之後,說不定某些格式會被excel“善意的改變”,譬如字元串‘000006’被excel打開之後,然後萬一選擇了保存,那麼再次讀取的時候,將會自動變成數值,前面的五個0都消失了,很顯然,原來的股票代碼被改變了,會造成很多不方便。
此外,如果我們的pandas中的某些地方存儲的不是可以被文本化的內容的時候,csv的局限性就更大了。pandas官方提供了一個很好的存儲格式,hdfs。所以筆者建議,凡是pandas格式的數據,想存儲下來,就用hdfs格式。
例如下麵這樣的一個數據:
我們可以很簡單的用一個語句就把pandas保存下來:
size_data.to_hdf('filename.h5', key='data')
當我們想讀取的時候,只要
size_data = pd.read_hdf('filename.h5', key='data')
就可以了,size_data就可以再次使用了。
面板數據的截面分析
所謂的面板數據就是截面數據加上時間序列數據。股票的數據很顯然就是一個面板數據。在量化投資中,我們經常會使用截面數據處理和時間序列數據的處理。
所謂的截面數據處理,就是站在某一個交易日,或者某一個時間點,來考察全市場這麼多股票的情況。而,通常,我們希望對時間序列上每一個時間節點都進行一次截面處理。
例如,我們現在有這樣的一個dataframe:
。。。。。。
顯然,這個數據就是一個典型的面板數據。我們現在希望對第三列signal_raw做截面上的處理。這個時候,就可以使用groupby。
- signal.sort_values(['trading_date', 'code'], inplace=True)
- signal['siganl_win'] = signal.groupby('trading_date').apply(your_function).values
我們來分析一下上面的代碼。第一行的作用是先根據trading_date排序,然後根據code排序。
代碼中的your_function就是我們希望作用在截面數據上的函數。
我們來好好分析一下:
- def xf(df):
- print df
- signal.groupby('trading_date').apply(xf)
我們運行一下看看,究竟groupby之後每一個部分是什麼。
很顯然,groupby把dataframe按照日期分成好多小的dataframe。所以我們的處理函數只要能夠返回一個等長的series,註意,我們的函數要返回一個series,要不然整個函數就不是這樣寫的。大家可以嘗試返回一個等長的list,就會發現上面的代碼不能成功運行。這樣的原因是因為如果返回一個series,pandas最後整個groupby語句返回的是一個multi index 的series,index第一層是日期,第二層是返回的series的index。如果返回的是list,那麼返回的是一個類似於字典結構的結果,key是日期,values是返回的list。
之所以最後要用values是將multi index去掉,只留下數值。而之所以前面要sort_values是為了順序匹配,大家可以仔細想想。
面板數據的時間序列分析
很簡單,只要sort的時候,順序換一下,先code,後日期。然後groupby的時候按照code就可以了。
groupby apply的彩蛋
groupby後面apply的函數運行過程中,第一個被groupby拆分的子dataframe會被apply後面的函數運行兩次。大家如果看仔細的話,會發現,第一個子dataframe和第二個dataframe其實是一樣的。pandas官方說,之所以這樣是第一個子dataframe傳入的目的是為了尋找一個能夠優化運行速度的方法,提高後面的運行效率。所以,如果日期只有一種,而再groupby後,返回的邏輯和有多種日期是不一樣的,大家可以自行研究一下,還是很有趣的。
--------------------- 本文來自 錢塘小甲子 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/qtlyx/article/details/80515077?utm_source=copy