6

pandas私は最近、その分析機能について知り、嬉しく思いました。パフォーマンス アトリビューション レポートの作成用に作成したスプレッドシートを自動化するために、Excel 配列関数を Pandas に相当するものに変換しようとしています。この例では、他の列内の条件に基づいて Excel で新しい列を作成しました。

={SUMIFS($F$10:$F$4518,$A$10:$A$4518,$C$4,$B$10:$B$4518,0,$C$10:$C$4518," ",$D$10:$D$4518,$D10,$E$10:$E$4518,$E10)}

数式は、特定の条件に基づいて、"F" 配列 (有価証券の重み) の値を合計しています。「A」配列 (ポートフォリオ ID) は特定の数値、「B」配列 (証券 ID) はゼロ、「C」配列 (グループの説明) は「」、「D」配列 (開始日) は行の日付です。 「E」配列 (終了日) は、私がいる行の日付です。

Pandas では、DataFrame を使用しています。最初の 3 つの条件でデータフレームに新しい列を作成するのは簡単ですが、最後の 2 つの条件では苦労しています。

reportAggregateDF['PORT_WEIGHT'] = reportAggregateDF['SEC_WEIGHT_RATE']
          [(reportAggregateDF['PORT_ID'] == portID) &
           (reportAggregateDF['SEC_ID'] == 0) &
           (reportAggregateDF['GROUP_LIST'] == " ") & 
           (reportAggregateDF['START_DATE'] == reportAggregateDF['START_DATE'].ix[:]) & 
           (reportAggregateDF['END_DATE'] == reportAggregateDF['END_DATE'].ix[:])].sum()

明らかに、最後の 2 つの条件の .ix[:] は何もしていませんが、ループせずに、現在の行で条件付きの合計を作成する方法はありますか? 私の目標は、ループを実行せず、代わりに純粋なベクトル操作を使用することです。

4

2 に答える 2

9

apply 関数とラムダを使用したい場合:

>> df
     A    B    C    D     E
0  mitfx  0  200  300  0.25
1     gs  1  150  320  0.35
2    duk  1    5    2  0.45
3    bmo  1  145   65  0.65

列 C と E を合計したいが、列 B == 1 で D が 5 より大きい場合のみ:

df['matches'] = df.apply(lambda x: x['C'] * x['E'] if x['B'] == 1 and x['D'] > 5 else 0, axis=1)
df.matches.sum()

これを 2 つのステップに分けた方がわかりやすいかもしれません。

df_subset = df[(df.B == 1) & (df.D > 5)]
df_subset.apply(lambda x: x.C * x.E, axis=1).sum()

または、速度のために単純に乗算を使用するには:

df_subset = df[(df.B == 1) & (df.D > 5)]
print sum(df_subset.C * df_subset.E)

この問題をループなしでやりたいと思うのは絶対に正しいです。

于 2013-08-20T03:31:48.830 に答える
1

より良い方法があると確信していますが、これはループでそれを行いました:

for idx, eachRecord in reportAggregateDF.T.iteritems():
reportAggregateDF['PORT_WEIGHT'].ix[idx] = reportAggregateDF['SEC_WEIGHT_RATE'][(reportAggregateDF['PORT_ID'] == portID) &            
    (reportAggregateDF['SEC_ID'] == 0) &            
    (reportAggregateDF['GROUP_LIST'] == " ") &             
    (reportAggregateDF['START_DATE'] == reportAggregateDF['START_DATE'].ix[idx]) &             
    (reportAggregateDF['END_DATE'] == reportAggregateDF['END_DATE'].ix[idx])].sum()
于 2012-06-15T19:18:50.890 に答える