Панды, как увеличить значение скользящего среднего ряд за строкой в ​​определенном диапазоне - PullRequest
0 голосов
/ 06 сентября 2018

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

#get the rolling mean from last 7 days 
df = pd.DataFrame(np.random.randint(10, size=10), columns=['values'])
df['rolling7'] = df['values'].rolling(7).mean().round(1)
df.head(10)

   values  rolling7
0  7       NaN
1  6       NaN
2  3       NaN
3  4       NaN
4  0       NaN
5  9       NaN
6  0       4.1
7  1       3.3
8  3       2.9
9  9       3.7

Я хочу заполнить NaN примерно более короткими средствами прокатки:

прокатка (1) для ряда 0, прокатка (2) для ряда 1 и т. Д.

Я понимаю, почему мой код не работает, но я не знаю, как исправить это приращение:

m = 0
for row in df.loc[0:6]:
        m = ++1
        df['rolling7'] = df['values'].rolling(m).mean().round(1)
df.head(10)

   values   rolling7
0  7        7.0
1  6        6.0
2  3        3.0
3  4        4.0
4  0        0.0
5  9        9.0
6  0        0.0
7  1        1.0
8  3        3.0
9  9        9.0
# and I don't know why it went through entire df even if I specified the rows

1 Ответ

0 голосов
/ 06 сентября 2018

.rolling принимает необязательный аргумент, min_periods после окна, которое даст вам поведение, которое вы ищете. Установив для него значение 1, оно обеспечит самое длинное скользящее среднее значение для каждой строки:

In [14]: df = pd.DataFrame(np.random.randint(10, size=10), columns=['values'])
    ...: df['rolling7'] = df['values'].rolling(7, 1).mean().round(1)
    ...: df.head(10)
    ...:
Out[14]:
   values  rolling7
0       9       9.0
1       0       4.5
2       1       3.3
3       7       4.2
4       9       5.2
5       7       5.5
6       1       4.9
7       3       4.0
8       5       4.7
9       3       5.0

Что касается того, почему ваш код не работает, есть две большие проблемы. Во-первых, m = ++1 идентичен m = 1, поэтому он никогда не изменяет значение там. Вы, вероятно, намеревались m += 1. Секунда df['rolling7'] = df['values'].rolling(m).mean().round(1) действует на весь столбец каждый раз, так как вы назначаете rolling7 для всего df.

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