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 

그러나이 정말 마지막에 dataframe을 보유하고 중첩 딕셔너리이다. 따라서 슬라이스은 매우 투박 :

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 차트에서 볼 수 있듯이, 모든 것이 단순히 '결말'이라는 이름으로 표시됩니다.

확실한 방법이 있지만 분명히 알아낼 수있을만큼 똑똑하지 않습니다.

답변

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

감사합니다. 정말 도움을 주셔서 감사합니다! 이제 진행하는 방법에 대해 오랫동안 생각해야합니다. –