pandas: Эффективно ли выполнить многократное вычисление? - PullRequest
1 голос
/ 05 марта 2020

Скажем, у меня есть набор данных, который является индексом на дату

id, date, col1, col2
1, 4, 1, 12
1, 5, 2, 13
1, 6, 6, 14
2, 4, 20, 16 
2, 5, 8, 17 
2, 6, 11, 18
...

, и я буду sh для вычисления скользящего mean, sum, min, max для col1 и col2, сгруппированного по id, с окном размер 2 и 3. Я могу сделать это в al oop примерно так:

def multi_rolling(df, winsize, column):
 [df.groupby("id")[column].rolling(winsize).mean(),
 df.groupby("id")[column].rolling(winsize).sum(),
 df.groupby("id")[column].rolling(winsize).min(),
 df.groupby("id")[column].rolling(winsize).max(),
 df.groupby("id")[column].rolling(winsize).count()]

Тогда мне просто нужно вызвать вышеприведенное в al oop. Но это кажется неэффективным. Есть ли способ вызвать его для всех комбинаций всех функций и всех столбцов и всех размеров окна более эффективно? Например, запустить их параллельно?

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Использование pandas.DataFrame.agg:

new_df = df.groupby("id").rolling(2)[["col1","col2"]].agg(['mean','sum','min','max','count'])
print(new_df)

Выход:

      col1                                                      col2        \
      mean         sum        min         max       count       mean         
      col1  col2  col1  col2 col1  col2  col1  col2  col1 col2  col1  col2   
id                                                                           
1  0   NaN   NaN   NaN   NaN  NaN   NaN   NaN   NaN   1.0  1.0   NaN   NaN   
   1   1.5  12.5   3.0  25.0  1.0  12.0   2.0  13.0   2.0  2.0   1.5  12.5   
   2   4.0  13.5   8.0  27.0  2.0  13.0   6.0  14.0   2.0  2.0   4.0  13.5   
2  3   NaN   NaN   NaN   NaN  NaN   NaN   NaN   NaN   1.0  1.0   NaN   NaN   
   4  14.0  16.5  28.0  33.0  8.0  16.0  20.0  17.0   2.0  2.0  14.0  16.5   
   5   9.5  17.5  19.0  35.0  8.0  17.0  11.0  18.0   2.0  2.0   9.5  17.5   


       sum        min         max       count       
      col1  col2 col1  col2  col1  col2  col1 col2  
id                                                  
1  0   NaN   NaN  NaN   NaN   NaN   NaN   1.0  1.0  
   1   3.0  25.0  1.0  12.0   2.0  13.0   2.0  2.0  
   2   8.0  27.0  2.0  13.0   6.0  14.0   2.0  2.0  
2  3   NaN   NaN  NaN   NaN   NaN   NaN   1.0  1.0  
   4  28.0  33.0  8.0  16.0  20.0  17.0   2.0  2.0  
   5  19.0  35.0  8.0  17.0  11.0  18.0   2.0  2.0  
0 голосов
/ 05 марта 2020

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

Но посмотрите, поможет ли один вкладыш:

df.groupby("id")[column].rolling(winsize).agg(['mean','sum','min','max','count'])

Потому что Вы группируете неоднократно, это обязательно будет очень неэффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...