Python панды: мы можем избежать применения в этом случае groupby / apply? - PullRequest
2 голосов
/ 03 апреля 2019

Я много слышал о применении панд медленно, и его следует использовать как можно меньше.

У меня есть ситуация здесь:

df = pd.DataFrame({'Date': ['2019-01-02', '2019-01-03', '2019-01-04'],
          'Fund_ID': [9072, 9072, 9072],
          'Fund_Series': ['A', 'A', 'A'],
          'Value': [1020.0, 1040.4, 1009.188],
          'Dividend': [0.0, 0.0, 52.02]})

Я хотел бы выполнить некоторые операции взвешивания, указанные ниже, после группировки:

df['Pct_Change_Adjusted'] = df.groupby(['Fund_ID', 'Fund_Series'], as_index=False) \
                              .apply(lambda x: (x.Value + x.Dividend)/(x.Value.shift()+x.Dividend.shift())  ) \
                              .reset_index(drop=True).values[0]

print(df)

         Date  Dividend  Fund_ID Fund_Series     Value  Pct_Change_Adjusted
0  2019-01-02      0.00     9072           A  1020.000                  NaN
1  2019-01-03      0.00     9072           A  1040.400                 0.02
2  2019-01-04     52.02     9072           A  1009.188                 0.02

Есть ли здесь какие-либо альтернативы apply, которые повысят эффективность или, по крайней мере, еще один способ сделать что-то !!

Примечание: я не говорю о даске и других парализациях, только о чистых пандах.

Обязательно:
Вычислить столбец Pct_Change_Adjusted без использования apply.

1 Ответ

4 голосов
/ 03 апреля 2019

Да, это 100% векторизация с использованием groupby.pct_change:

(df.Value + df.Dividend).groupby([df.Fund_ID, df.Fund_Series]).pct_change()

0     NaN
1    0.02
2    0.02
dtype: float64

df['Pct_Change_Adjusted'] = (df.assign(Foo=df['Value'] + df['Dividend'])
                               .groupby(['Fund_ID', 'Fund_Series'])
                               .Foo
                               .pct_change())

df

         Date  Fund_ID Fund_Series     Value  Dividend  Pct_Change_Adjusted
0  2019-01-02     9072           A  1020.000      0.00                  NaN
1  2019-01-03     9072           A  1040.400      0.00                 0.02
2  2019-01-04     9072           A  1009.188     52.02                 0.02
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...