Как рассчитать среднее значение скользящего окна для каждой группы, исключая помеченные данные из ретроспективного аналиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как рассчитать среднее значение скользящего окна для каждой группы, исключая помеченные данные из ретроспективного анали

Сообщение Anonymous »

У меня есть фрейм данных pandas — df

Код: Выделить всё

    Time    Value   Flag
0   00:30   5   0
1   01:00   5   0
2   00:30   10  0
3   01:00   10  1
4   00:30   15  0
5   01:00   15  1
6   00:30   20  1
7   01:00   20  0
8   00:30   25  1
9   01:00   25  0
10  00:30   30  1
11  01:00   30  0
Я хочу создать новый столбец ['Result'], который вычисляет скользящее среднее двух последних «значений», сгруппированных по на каждую уникальную единицу «времени». , исключая/пропуская строки, где df['Flag'] == 1 из моего обзора. Размер моего прокручивающегося окна равен 2, и я хочу сдвинуться на 1 (т. е. исключить текущую строку «Значение» из расчета)
Результирующий кадр данных должен быть равен приведенному ниже:

Код: Выделить всё

    Time    Value   Flag    Result
0   00:30   5   0   n/a
1   01:00   5   0   n/a
2   00:30   10  0   n/a
3   01:00   10  1   n/a
4   00:30   15  0   7,5
5   01:00   15  1   n/a
6   00:30   20  1   12,5
7   01:00   20  0   n/a
8   00:30   25  1   12,5
9   01:00   25  0   12,5
10  00:30   30  1   12,5
11  01:00   30  0   22,5
Примеры логики:
  • Результат в строке 8 = среднее значение строки 4 и строки 2 [(15+ 10)/2] = 12,5. Т.е. он использует два последних значения для 00:30, исключая значение из строки 6 из ретроспективного анализа.
  • Результат в строке 4 = среднее значение строки 2 и строки 0 [(10+ 5)/2] = 7,5. Т.е. он использует два последних значения для 00:30 без значений, где df['Flag'] == 1.
Data

Код: Выделить всё

import pandas as pd

#DataFrame
data = {
'Time': ['00:30', '01:00', '00:30', '01:00', '00:30', '01:00', '00:30', '01:00', '00:30', '01:00', '00:30', '01:00'],
'Value': [5, 5, 10, 10, 15, 15, 20, 20, 25, 25, 30, 30],
'Flag': [0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0]
}
df = pd.DataFrame(data)
Текущая попытка
  • Функция

Код: Выделить всё

def calculate_rolling_avg(df):
values = df.loc[df['Flag'] == 0, 'Value']
rolling_avg = values.shift(1).rolling(window=2).mean()
return rolling_avg
  • Примените функцию и создайте столбец «Результат».

Код: Выделить всё

df['Result'] = df.index.to_series().map(calculate_rolling_avg(df))

print(df)
Вывод:

Код: Выделить всё

     Time  Value  Flag  Result
0   00:30      5     0     NaN
1   01:00      5     0     NaN
2   00:30     10     0     5.0
3   01:00     10     1     NaN
4   00:30     15     0     7.5
5   01:00     15     1     NaN
6   00:30     20     1     NaN
7   01:00     20     0    12.5
8   00:30     25     1     NaN
9   01:00     25     0    17.5
10  00:30     30     1     NaN
11  01:00     30     0    22.5
Мое решение просто исключает расчет скользящего среднего для строк, где df['Flag'] == 1. Я хочу вычислить скользящее среднее для всех строк, но исключить значения из ретроспективного анализа, где df['Flag'] == 1.


Подробнее здесь: https://stackoverflow.com/questions/787 ... agged-data
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»