Создание скользящего среднего с изменяющимся окном на Pandas - PullRequest
0 голосов
/ 28 мая 2020

У меня есть Pandas фрейм данных, как показано ниже. Я хочу создать 7-дневную скользящую среднюю для температуры. Я понимаю, как это сделать, если это было одно чтение в день (dataset['rolling_temp'] = dataset.iloc[:,3].rolling(window=7).mean()), но проблема заключается в случайном количестве чтений в день. т.е. за 1 день может быть несколько строк. Любая помощь будет принята с благодарностью!

    day   temperature 
1     1          18.0           
2     1          19.0
3     2          18.0
4     3          17.0
5     4          18.5 
6     4          19.0
7     5          18.0
8     6          19.0
9     7          18.5
10    8          17.5
11    9          17.0
12   10          18.0
13   11          19.0
14   12          19.5
15   13          16.5
16   13          17.0

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вы должны иметь возможность производить скользящую статистику, если преобразовываете свои дни в правильные даты и составляете из них индекс. Вам нужно будет включить месяцы и годы, поэтому добавьте дополнительные столбцы, если вы еще не храните такие значения, а затем:

dataset['date'] = dataset[['year', 'month', 'day']].apply(lambda row: '{}-{}-{}'.format(row['year'], row['month'], row['day']), axis=1)
dataset.set_index('date', inplace=True')
dataset.temperature.rolling('7D', min_periods=1).mean()

См. Справочную информацию внизу этой страницы . Вы также можете попробовать выполнить повторную выборку индекса:

dataset.temperature.resample('D').rolling('7D', min_periods=1).mean()

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

0 голосов
/ 28 мая 2020

Как насчет того, чтобы сначала сделать .groupby, а затем .rolling? Это решает проблему наличия нескольких дней и дает вам одно значение в день.

dataset = dataset.groupby('day')['temperature'].mean().reset_index().iloc[:,3].rolling(window=7).mean()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...