как получить непрерывное скользящее среднее в pandas? - PullRequest
3 голосов
/ 06 января 2020

В поисках непрерывного скользящего среднего для кадра данных.

df выглядит следующим образом

index price

0      4
1      6
2      10
3      12

, стремясь к непрерывному изменению цены

. Цель состоит в том, чтобы это выглядело как скользящее среднее всех цен.

index price  mean

0      4      4
1      6      5
2      10     6.67
3      12     8 

спасибо заранее!

Ответы [ 2 ]

4 голосов
/ 06 января 2020

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

df['mean'] = df.price.expanding().mean()

df
index   price   mean
0       4       4.000000
1       6       5.000000
2       10      6.666667
3       12      8.000000
3 голосов
/ 07 января 2020

Добро пожаловать в SO: Надеюсь, люди скоро запомнят вас из предыдущих сообщений SO, таких как этот.

Из вашего примера кажется, что @Allen дал вам код, который дает ответ в вашей таблице. Тем не менее, это не совсем то же самое, что "скользящий" способ. Функция expanding(), которую использует Аллен, берет среднее значение первой строки, деленное на n (которое равно 1), затем добавляет строки 1 и 2 и делит на n (которое теперь равно 2), и так далее, так что последняя строка is (4 + 6 + 10 + 12) / 4 = 8.

Это последнее число может быть ответом, если окно, которое вы хотите для скользящего среднего, равно 4, поскольку это будет означать, что вы хотите среднее значение 4 наблюдения. Однако, если вы продолжите движение вперед с размером окна 4 и начнете включать строки 5, 6, 7 ..., тогда ответ из expanding() может отличаться от того, что вы хотите. Фактически, expanding() записывает среднее значение всей серии (в данном случае price), как будто оно получает новый фрагмент данных в каждой строке. «Свертывание», с другой стороны, дает результат агрегации некоторого размера окна.

Вот еще один вариант выполнения скользящих вычислений: метод rolling() в pandas.dataframe.

В вашем случае вы должны сделать:

df['rolling_mean'] = df.price.rolling(4).mean()

df
index   price   rolling_mean
0       4       nan
1       6       nan
2       10      nan
3       12      8.000000

Эти nan s являются результатом работы с окнами: пока не будет достаточно строк для вычисления среднего, результат будет nan. Вы можете установить меньшее окно:

df['rolling_mean'] = df.price.rolling(2).mean()

df
index   price   rolling_mean
0       4       nan
1       6       5.000000
2       10      8.000000
3       12      11.00000

. Это показывает уменьшение количества записей nan, а также функцию прокрутки: оно только усредняется в предоставленном вами окне второго размера. В результате значение df['rolling_mean'] будет отличаться от значения df.price.expanding().

Примечание: вы можете избавиться от nan, используя .rolling(2, min_periods = 1), который сообщает функции минимальное количество определенных значений в пределах окно, которое должно присутствовать для расчета результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...