3

我對於我的生活似乎無法得到我想要的結構並使其功能正常,所以在一陣憤怒中我來找你們。商品期貨分層數據結構

設置: 我有一個名爲Futures_Contracts的目錄,裏面是大約30個文件夾,所有這些文件夾都以相關資產命名,最後在csv格式的6個最近的到期合約中。每個csv格式相同,包含日期,O,H,L,C,V,OI,到期月份。

注:OHLCV OI是開放的,高,低,收盤,成交量,持倉量(對於那些不熟悉),也承擔收盤價低於

Folder Structure

任務結算的代名詞:從這裏的目標是將期貨數據加載到多指標熊貓數據框中,使得頂級指數是潛在的商品符號,中級指數是到期月 - 年,最後是OHLC數據。最終目標是讓我可以開始對zipline模塊進行黑客攻擊,使其在未來運行。 所以視覺: enter image description here

我愚蠢的嘗試:

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 
from pandas import DataFrame, Series 
import datetime 
plt.figsize(16,8) 

deliveries = {} 
commoidities = {} 
columns = 'open', 'high', 'low', 'settle', 'volume', 'interest', 'delivery' #Contract fields 
path = os.getcwdu()+'/Futures_Contracts/' #Futures Path 
for sym in os.listdir(path): 
    if sym[0] != '.': #Weed out hidden files 
     deliveries[sym] = [] 
     i = 0 
     for contract in os.listdir(path + sym): 
      temp = pd.io.parsers.read_csv(path + sym + '/' + contract, index_col=0, parse_dates = True, names = columns)#pull in the csv 
      deliveries[sym].append(str(contract[:-4][-1] + contract[:-4][:-1][-2:])) #add contract to dict in form of MonthCode-YY 
      commodities[sym] = deliveries[sym] 
      commodities[sym][i] = temp 
      i += 1 

這個有點工作,但是這確實是一個嵌套的字典保存在最後一個數據幀。因此切片是非常笨拙:

commodities['SB2'][0]['settle'].plot() 
commodities['SB2'][3]['settle'].plot() 
commodities['SB2'][4]['settle'].plot() 
commodities['SB2'][3]['settle'].plot() 
commodities['SB2'][4]['settle'].plot() 
commodities['SB2'][5]['settle'].plot() 

,併產生enter image description here

最理想的,我將能夠在每個指標的切片,這樣我可以比較不同資產,到期日期和值數據。此外,請標註我正在查看的內容,如同您在matplotlib圖表中看到的,所有內容都簡單地命名爲'settle'

確實有辦法做到這一點,但我不夠聰明。

回答

2

我想你會更好地把它放到一個DataFrame中,所以考慮使用MultiIndex。這裏有一個例子玩具,我認爲會很好的轉化爲代碼:

In [11]: dfN13 = pd.DataFrame([[1, 2]], columns=[['N13', 'N13'], ['a', 'b']]) 

In [12]: dfM13 = pd.DataFrame([[3, 4]], columns=[['M13', 'M13'], ['a', 'b']]) 

這些都是在你的榜樣的DataFrames,但列的第一個層次,它只是資產名稱。

In [13]: df = pd.concat([dfN13, dfM13], axis=1) 

In [14]: df 
Out[14]: 
    N13  M13 
    a b a b 
0 1 2 3 4 

爲了方便起見,我們可以標記列級別和索引。

In [15]: df.columns.names = ['asset', 'chart'] 

In [16]: df.index.names = ['date'] # well, not in this toy example 

In [17]: df 
Out[17]: 
asset N13  M13 
chart a b a b 
date 
0  1 2 3 4 

注:此長得挺像你的電子表格。

使用 xs

我們可以搶出一個具體的圖表(例如OHLC):

In [18]: df.xs('a', level='chart', axis=1) 
Out[18]: 
asset N13 M13 
date 
0  1 3 

In [19]: df.xs('a', level='chart', axis=1).plot() # win 
+0

請讓我來接你的大腦多一點。不幸的是,並非所有標的資產都有相同的合約到期日。我該如何處理?我想創建一個數據框不會因爲這個原因而可行。最理想的是,他們是把csv加入到一起的訣竅,有什麼想法? –

+0

你是指不同的日期?上面的代碼處理:) –

+0

是不同的日期,但我關心與顯式到期對應的列。 –

1

確定這似乎工作。

commodities = {} 
columns = 'open', 'high', 'low', 'settle', 'volume', 'interest', 'delivery' #Contract fields 
path = os.getcwdu()+'/Futures_Contracts/' #Futures Path 
for sym in os.listdir(path): 
    if sym[0] != '.': #Weed out hidden files 
     i = 0 
     c_expirations = {} 
     for contract in os.listdir(path + sym): 
      expiry = (contract[:-4][-1].encode('ascii', 'ignore') + contract[:-4][:-1][-2:].encode('ascii', 'ignore')) 
      c_expirations[expiry] = pd.io.parsers.read_csv(path + sym + '/' + contract, index_col=0, parse_dates = True, names = columns) 
     commodities[sym] = pd.concat(c_expirations, axis =1) 
df_data = pd.concat(commodities, axis=1) 
df_data.columns.names = 'asset', 'expiry', 'data' 

,並看看它打印出

print df_data 


<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 1568 entries, 2007-04-16 00:00:00 to 2013-06-17 00:00:00 
Columns: 1197 entries, (CC2, H14, open) to (ZW, Z13, delivery) 
dtypes: float64(1197) 

真的只是來到了安迪的建議修修補補,並將其應用於大規模

+0

很高興你得到它的工作! –

+0

謝謝,我真的很感謝幫助!現在我需要長時間思考如何進行:( –