Как я могу создать условное скользящее среднее?

Я хочу иметь возможность выполнять скользящее среднее в столбце данных на основе значений, помеченных как True в отдельном столбце. Ниже приведен пример набора данных.

                      Data        Condition
2020-01-01 0:00       2.0          False     
2020-01-01 0:01       2.0          False       
2020-01-01 0:02       732.1        True    
2020-01-01 0:03       734.2        True       
2020-01-01 0:04       733.3        True       
2020-01-01 0:05       731.2        True  
2020-01-01 0:06       2.0          False  
2020-01-01 0:07       2.0          False  
...
2020-06-15 23:52      2.0          False       
2020-06-15 23:53      732.1        True    
2020-06-15 23:54      734.2        True       
2020-06-15 23:55      733.3        True       
2020-06-15 23:56      731.2        True 
2020-06-15 23:57      2.0          False      
2020-06-15 23:58      2.0          False       
2020-06-15 23:59      2.0          False 

Мой ожидаемый результат с размером окна 3 для столбца данных будет следующим:

[2.0, 2.0, 733.15, 733.2, 732.9, 732.25, 2, 2, ..., 2.0, 733.15, 733.2, 732.9, 732.25, 2.0, 2.0, 2.0].

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

Вот код, который я нашел, за исключением того, что он не для текущих панд.

pandas.rolling_mean(df[df.Condition], window=30) Я нашел это здесь: Условное среднее путем прокрутки

Мы будем благодарны за любую помощь или информацию по этому поводу!


person wes.e    schedule 29.06.2020    source источник
comment
Каков ваш ожидаемый результат, скажем, window=3 в этом случае?   -  person Quang Hoang    schedule 30.06.2020
comment
Мой ожидаемый результат будет [2.0, 2.0, 733.15, 733.2, 732.9, 732.25, 2, 2, ..., 2.0, 733.15, 733.2, 732.9, 732.25, 2.0, 2.0, 2.0] для этого случая.   -  person wes.e    schedule 30.06.2020
comment
@ wes.e Добавьте ожидаемый результат в вопрос, чтобы упростить ответ и помочь людям, которые находят этот вопрос через Google.   -  person Moondra    schedule 30.06.2020
comment
Конечно, без проблем.   -  person wes.e    schedule 30.06.2020


Ответы (1)


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

df['rolling'] = df.loc[df['Condition'] == True]['Data'].rolling(30).mean().fillna(0)
person rhug123    schedule 30.06.2020
comment
df.loc[df['Condition'] == True]['Data'] должно быть df.loc[df['Condition'] == True, 'Data'] - person Dan; 30.06.2020
comment
Когда я пробую это, я просто получаю NaN для катящейся колонки - person wes.e; 30.06.2020
comment
Есть ли большая разница в том, чтобы сделать это таким образом по сравнению с тем, как это было сделано в решении? - person rhug123; 30.06.2020