2017-04-22 15 views
2

df1.dateがdf2の2か月前以内にある2つのパンダデータフレームを結合する必要があります。その期間中に何人のトレーダーが同じ株式を取引したかを計算し、購入した株式の総数を数えたいと思います。日付フィールドが互いに2ヶ月以内の2つのパンダデータフレームを結合

私は以下の方法を試してみましたが、それほど複雑ではありませんでした。よりスマートでシンプルなソリューションがあると私は信じています。

Pandas: how to merge two dataframes on offset dates?

サンプルデータセットは、以下である:

DF1(team_1):

date  shares symbol trader 
31/12/2013 154  FDX  Max 
30/06/2016 2367 GOOGL Max 
21/07/2015 293  ORCL Max 
18/07/2015 304  ORCL Sam 

DF2(team_2):

date  shares symbol trader 
23/08/2015 345  ORCL John 
04/07/2014 567  FB  John 
06/12/2013 221  ACER Sally 
31/11/2012 889  HP  John 
05/06/2010 445  ABBV Kate 

要求出力:

これは2つの新しい列を追加します... 'team_2_traders' = DF2にリストされている日付から前の2か月間に同じ在庫を交換したteam_1のトレーダーの数です。 'team_2_shares_bought' = DF2に掲載されている日付から過去2ヶ月間にteam_1が購入した株式の合計数。

誰かがこれを喜ばせるには、以下のスニペットを使用してデータフレームを設定してください。実際のデータセットには数百万行と6,000の会社株式が含まれています。

team_1 = {'symbol':['FDX','GOOGL','ORCL','ORCL'], 
      'date':['31/12/2013','30/06/2016','21/07/2015','18/07/2015'], 
      'shares':[154,2367,293,304], 
      'trader':['Max','Max','Max','Sam']} 
df1 = pd.DataFrame(team_1) 

team_2 = {'symbol':['ORCL','FB','ACER','HP','ABBV'], 
      'date':['23/08/2015','04/07/2014','06/12/2013','31/11/2012','05/06/2010'], 
      'shares':[345,567,221,889,445], 
      'trader':['John','John','Sally','John','Kate']} 

df2 = pd.DataFrame(team_2) 

ありがとうございます。

答えて

1

私の解決策を確認してください。

from pandas.tseries.offsets import MonthEnd 

df_ = df2.merge(df1, on=['symbol']) 
df_['date_x'] = pd.to_datetime(df_['date_x']) 
df_['date_y'] = pd.to_datetime(df_['date_y']) 

df_2m = df_[df_['date_x'] < df_['date_y'] + MonthEnd(2)] \ 
     .loc[:, ['date_y', 'shares_y', 'symbol', 'trader_y']] \ 
     .groupby('symbol') 

df1_ = pd.concat([df_2m['shares_y'].sum(), df_2m['trader_y'].count()], axis=1) 

print(df1_) 

     shares_y trader_y 
symbol      
ORCL   597   2 

print(df2.merge(df1_.reset_index(), on='symbol', how='left').fillna(0)) 

     date shares symbol trader shares_y trader_y 
0 23/08/2015  345 ORCL John  597.0  2.0 
1 04/07/2014  567  FB John  0.0  0.0 
2 06/12/2013  221 ACER Sally  0.0  0.0 
3 30/11/2012  889  HP John  0.0  0.0 
4 05/06/2010  445 ABBV Kate  0.0  0.0 
+0

お使いのソリューションには、必要な日付範囲の検索が含まれていません。 – mattblack

+0

私は制約を逃しました、再度確認してください。私はコードを更新しました。 – su79eu7k

+0

うまくいきます、ありがとう!私は後で大きなデータセットでそれを試してみましょう。乾杯! – mattblack

関連する問題