2016-08-01 4 views
1

毎日のデータから毎月のデータに変換するために、パンダのDataFrames辞書(またはパンダパネル)を下の関数に渡します。各DataFrameは、日時vの株式コード空間のフィールド(例:Open、High、LowまたはClose)を表します。この関数は正常に機能しますが、廃止予定の警告が表示されています。私は、新たにリファクタリングされたresample()を使用して効率的な実装を見つけることはできません。私が見つけることができる例のほとんどは、単一のデータフレームの異なるカラムに異なるメソッドを適用するagg()関数を使用しています。私のパネルには各フィールドごとに別のフレームがありますが、これはあまり適切ではありません。私は適用(ラムダ)を使用しようとしたが、それは動作しますが、不合理に遅いです。私はこれが効率的に実装されていると確信しています。私は非難された実装に基づいて答えられたいくつかの質問に気付きました。パンダのリファクタリング後に元のコードを複製する効率の良い方法が見つからない.resample()

ここに私の元の関数です:

# function to convert daily data to monthly and return dictionary or panel 
def to_monthly(fields, data_d, create_panel=True): 

    how_dict={'Open':'first', 'High':'max', 'Low':'min', 'Close':'last'} 

    data_m={} 
    for field in fields: 
     data_m[field]=data_d[field].resample(rule='M', how=how_dict[field]).ffill() 
    if create_panel: 
     data_m = pd.Panel(data_m) 

    return data_m 

これは正常に動作が、私は非推奨の警告を取得します。これを解決する私の試みは次のとおりです。

# alternative function to handle refactoring of .resample() 
def to_monthly(fields, data_d, create_panel=True): 

    how_dict={ 
     'Open': (lambda x: x[0]), 
     'High': (lambda x: x.max()), 
     'Low': (lambda x: x.min()), 
     'Close': (lambda x: x[-1]), 
     'Volume': lambda x: x.sum() 
     } 

    data_m={} 
    for field in fields: 
     data_m[field]=data_d[field].resample('M').apply(how_dict[field]).ffill() 
    if create_panel: 
     data_m = pd.Panel(data_m) 

    return data_m 

私はそれが簡単にすべての古い「どのように」オプションの代替構文を見つけるために発見していません。これに関するいくつかの援助も感謝します。 Pandasのドキュメントは、特定の分野や用途のすべてのオプションを提供するとは限りません。私は他の人が同様の問題を抱えているのを見ました

すべてのヘルプは大

あなたはResampler.aggregateを使用し、値として、それのそれぞれの意図した動作とキーとして列名の辞書を渡すことができますあなたの

答えて

0

ありがとういただければ幸いです。

dict_ohlcv = {'Open':'first', 'High':'max', 'Low':'min', 'Close':'last', 'Volume':'sum'} 
data_m[field]=data_d[field].resample('M') 
          .agg(dict_ohlcv[field]) 
          .ffill() 

deprecation warningsあなたはAPIはそれがより多くの .groupbyが好きなようにする .resample方法への変更を壊すことに起因している[ ソース: Resample API]得る。このため

+1

感謝。私の問題を解決する。 1つのDataFrameでさまざまな列フィールドに関連したこのタイプの例を提供するドキュメントで混乱しているかもしれませんが、私は実際にこれを試したと思っていましたが、複数のDataFramesのフィールドは異なりません – tmasters

+0

残念ながら、解決策。明確にするために、data_dに渡される入力はDataFramesのディクショナリであり、それぞれは株のリストのための単一のフィールド(例えばClose)を表します。だから、私は2つのデータフレーム(例:開くと閉じる)を含む辞書に毎日のデータを渡すと、私は毎月のデータで2つのデータフレームの辞書を返すようにしたい。あなたの方法論をここに適用すると、各データフレームのOHLCV師団が得られます。したがって、それぞれの欄の数に5を掛けます。 – tmasters

+0

編集された答えをご覧ください。 –

関連する問題