2017-01-26 2 views
2

私は在庫データを扱っており、特定のタイプの分析を実行する際にデータセットのデータ長が同じになるようにしたいと考えています。ディクショナリに格納された複数のDataFramesの列を効率的にフィルタリングする方法を教えてください。

問題

I アップルの負荷データIは、1985年以来、毎日のデータを取得する場合は天然ガスETFの負荷データは、それだけで今まで遡って2012年のように私に行く可能性がある場合Appleをフィルタリングしたい場合は、2012年の履歴のみを表示してください。また、終了日は、のように最新のデータセットではない可能性があります。Appleのデータは1985年から1-20-17まで、 天然ガスETFのデータは2012年から12-23-16の範囲です。私はまた、最大日付を設定する別のフィルタが欲しい。これで、2012年から12月23日までの日付のリンゴデータセットがフィルタリングされました。今私のデータセットは等しいです。

アプローチ

私は私のdateframesのすべてを格納株式と呼ばれる辞書を持っています。すべてのデータフレームにはDという名前の列があり、これはの日付列です。

私は、辞書にデータフレームを取り込み、各dfの最小値と最大値を取る関数を書いています。私はこれら2つの辞書の最小値を他の2つの辞書に保存しますDatesMaxDateMinこれらの2つの辞書の最小値と最大値を取って、すべてのデータフレームのフィルタ値に使用される最大値と最小値を取得します。

以下の関数は、複数のデータフレームの最小値と最大値を取得し、という名前の辞書に返します。DatesMinMax

def MinMaxDates (FileName): 

    DatesMax = {}; DatesMin = {} 
    DatesMinMax = {}; stocks = {} 

    with open (FileName) as file_object: 
     Current_indicators = file_object.read() 
     tickers = Current_indicators.split('\n') 

     for i in tickers: 
      a = '/' in i 
      if a == True: 
       x = i.find("/")+1 
       df = pd.read_csv(str(i[x:]) + '_data.csv') 
       stocks[i] = df 
       maxDate = max(df.D) 
       minDate = min(df.D) 
       DatesMax[i] = maxDate 
       DatesMin[i] = minDate 
      else: 
       df = pd.read_csv(i + '_data.csv') 
       stocks[i] = df 
       maxDate = max(df.D) 
       minDate = min(df.D) 
       DatesMax[i] = maxDate 
       DatesMin[i] = minDate 

     x = min(DatesMax.values()) 
     y = max(DatesMin.values()) 

    DatesMinMax = {'MaxDate' : x, 'MinDate' : y} 
    return DatesMinMax 

print DatesMinMax 
# {'MinDate': '2012-02-08', 'MaxDate': '2017-01-20'} 

質問

今、私はそこに日付列をフィルタするために辞書名に株式をすべてのデータフレームの私のループを実行する必要があります。何かを再度ループするのは非効率的だと思われますが、フィルタを適用する他の方法は考えられません。

答えて

0

実は、後でフィルタリングに(2016-12-30 < 2017-01-20以降)最小値と最大値をキャプチャする必要はないかもしれませんが、単にフルインナーは「D」()のカラム上のすべてのデータフレーム間でmergeに参加し実行します。

すべてのデータフレームにわたって同じ長さを保証するチェーンマージを使用し、この出力されたマスターデータフレームをティッカー列でスライスしてストック辞書を構築することを検討してください。もちろん、幅広いマスターデータフレームを使用して分析することができます。

with open (FileName) as file_object: 
    Current_indicators = file_object.read() 
    tickers = Current_indicators.split('\n') 

# DATA FRAME LIST BUILD 
dfs = [] 
for i in tickers: 
    if '/' in i: 
     x = i.find("/")+1 
     df = pd.read_csv(str(i[x:]) + '_data.csv') 
     # PREFIX ALL NON-DATE COLS WITH TICKER PREFIX 
     df.columns = [i+'_'+str(col) for col in df.columns if col!='D']    
     dfs.append(df) 

    else: 
     df = pd.read_csv(i + '_data.csv') 
     # PREFIX ALL NON-DATE COLS WITH TICKER PREFIX 
     df.columns = [i+'_'+str(col) for col in df.columns if col!='D'] 
     dfs.append(df) 

# CHAIN MERGE (INNER JOIN) ACROSS ALL DFS 
masterdf = reduce(lambda left,right: pd.merge(left, right, on=['D']), dfs) 

# DATA FRAME DICT BUILD 
stocks = {} 
for i in tickers: 
    # SLICE CURRENT TICKER COLUMNS 
    df = masterdf[['D']+[col for col in df.columns if i in col]] 
    # REMOVE TICKER PREFIXES 
    df.columns = [col.replace(i+'_', '') for col in df.columns] 
    stocks[i] = df 
関連する問題