Как ускорить два вложенных цикла в большом наборе данных - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю с набором данных 600.000 x 128, расположенным в следующей форме с иерархическим индексом (см. Слева):

                    Var1     Var2     ...                                     Var1_mean  Var2_mean     ...          
    ID     Date                                               ID     Date          
    1      2017-12  1        0.1                              1      2017-12  2          0.3
    1      2018-01  2        0.3                              1      2018-01  2          0.3
    1      2018-02  3        0.5            -->               1      2018-02  2          0.3
    2      2018-01  2        0.2                              2      2018-01  3          0.15
    2      2018-02  4        0.1                              2      2018-02  3          0.15

Теперь для всех 55.000 клиентов (= уникальные идентификаторы) я хочу заменитьзначения на клиента в выбранных переменных со средними значениями на клиента, сохраненные в новых переменных (имя переменной + «_mean», см. справа).

Я написал для этого функцию, но это занимает 4+ часа, даже после попытки распараллелить задачу.Я попытался:

    identifiers = set(df_raw_sort.index.get_level_values(0)) # unique IDs

    def avg_per_customer(column): 
       df_raw_sort.loc[:, column + '_mean'] = 0 # Create new col
       for unique in identifiers: 
          meanvalue = np.mean(df_raw_sort[column].loc[(unique)])
          df_raw_sort.loc[(unique), column + '_mean'] = meanvalue

    Parallel(n_jobs=2, verbose=10)(delayed(avg_per_customer)(col) for col in transform)
    # transforms selected columns (= transform)

Что я мог сделать, чтобы ускорить эту вещь?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 17 сентября 2018

Можете ли вы попробовать это

df_raw_sort [variable_name_mean] = df_raw_sort [variable_name] .groupby (df_raw_sort ['ID']). Transform ('mean')

Отосланный ответ отсюда

...