3

私は一生、自分が望む構造を手に入れて適切に機能させることができないように見えるので、怒り狂って皆さんに来ます.

セットアップ: Futures_Contracts という名前のディレクトリがあり、その中に約 30 個のフォルダーがあり、すべて原資産の名前が付けられ、最後に最も近い 6 つの有効期限契約が csv 形式で含まれています。各 csv の形式は同じで、日付、O、H、L、C、V、OI、有効期限の月が含まれています。

注: OHLCV OI は、始値、高値、安値、終値、出来高、建玉 (詳しくない人向け) であり、終値は以下の決済と同義であると仮定します

フォルダ構造

タスク: ここからの目標は、最上位インデックスが基礎となる商品シンボル、中間レベル インデックスが有効期限の月-年、最後にOHLCデータ。最終的な目標は、zipline モジュールでハッキングを開始して、先物で実行できるようにすることです。視覚的に: ここに画像の説明を入力

私の弱い試み:

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

これはある程度機能しますが、これは実際には、最後にデータフレームを保持するネストされた dict です。したがって、スライスは非常に扱いにくいです:

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()

利回りここに画像の説明を入力

資産、有効期限、日付、および価値全体でデータを比較できるように、各インデックスをスライスできることが最適です。さらに、matplotlib チャートでわかるように、私が見ているものにラベルを付けます。

確かにこれを行う方法はありますが、私はそれを理解するほど賢くありません.

4

2 に答える 2

2

これを 1 つの 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']])

これらはあなたの例のデータフレームですが、列の最初のレベルは単なるアセット名です。

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

注: これはスプレッドシートとよく似ています。

そして、以下を使用して特定のチャート (例: ohlc) を取得できますxs

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
于 2013-06-18T21:40:26.973 に答える