Ускорьте операцию с пандами с несколькими фреймами данных

Здравствуйте все

Для школьного проекта я застрял на продолжительности операции с Pandas Dataframe.

У меня есть один фрейм данных df, которая имеет форму (250 000 000, 200). Этот информационный кадр содержит значения переменных, описывающих поведение датчиков на машине. Они организованы по "Циклу" (каждый раз, когда машина начинает новый цикл, эта переменная увеличивается на единицу). И в этом цикле CycleTime описывает положение строки в цикле.

В "среднем" DataFrame я вычисляю среднее значение каждой группы переменных с помощью "CycleTime"

DataFrame 'anomaly_matrix' представляет глобальную аномалию каждого цикла, которая является суммой квадратов разности каждой строки, принадлежащей циклу, со средним значением соответствующего CycleTime.

Пример моего кода ниже

df = pd.DataFrame({'Cycle': [0, 0, 0, 1, 1, 1, 2, 2], 'CycleTime': [0, 1, 2, 0, 1, 2, 0, 1], 'variable1': [0, 0.5, 0.25, 0.3, 0.4, 0.1, 0.2, 0.25], 'variable2':[1, 2, 1, 1, 2, 2, 1, 2], 'variable3': [100, 5000, 200, 900, 100, 2000, 300, 300]})
mean = df.drop(['Cycle'], axis = 1).groupby("CycleTime").agg('mean')
anomali_matrix = df.drop(['CycleTime'], axis = 1).groupby("Cycle").agg('mean')
anomaly_matrix = anomali_matrix - anomali_matrix

for index, row in df.iterrows():
    cycle = row["Cycle"]
    time = row["CycleTime"]
    anomaly_matrix.loc[cycle] += (row - mean.loc[time])**2


>>>anomaly_matrix
   variable1    variable2   variable3
Cycle           
0   0.047014    0.25       1.116111e+07
1   0.023681    0.25       3.917778e+06
2   0.018889    0.00       2.267778e+06

Это вычисление для моего (250 000 000, 200) DataFrame за последние 6 часов, оно связано с anomaly_matrix.loc[cycle] += (row - mean.loc[time])**2

Я попытался улучшить с помощью функции применения, но мне не удалось добавить другой DataFrame в эту функцию применения. То же самое, пытаясь векторизовать панд.

У вас есть идеи, как ускорить этот процесс? Спасибо

1 ответ

Решение

Ты можешь использовать:

df1 = df.set_index(['Cycle', 'CycleTime'])

mean = df1.sub(df1.groupby('CycleTime').transform('mean'))**2
df2 = mean.groupby('Cycle').sum()
print (df2)
       variable1  variable2     variable3
Cycle                                    
0       0.047014       0.25  1.116111e+07
1       0.023681       0.25  3.917778e+06
2       0.018889       0.00  2.267778e+06
Другие вопросы по тегам