2 Вопрос: Сдвиг и скользящее среднее ненулевых значений в группе панд

вопрос создан в Thu, May 2, 2019 12:00 AM

Я ищу способ создания движущегося окна на основе среднего значения ненулевых значений за последние n дней для каждой группы.

Например, если размер движущегося окна равен 3, я хочу создать столбец MovAvg , основываясь на ненулевых значениях в столбце ct для каждого Группа (т.е. с запаздывающим эффектом).

Date    Group   ct      MovAvg
1/1/71  A   NaN NaN
2/1/71  A   1   NaN
3/1/71  A   NaN NaN
4/1/71  A   NaN 1
5/1/71  A   1   1
6/1/71  A   NaN 1
7/1/71  A   0   1
8/1/71  A   NaN 0.5
9/1/71  A   NaN 0
10/1/71 A   1   0
11/1/71 A   0   1
1/1/71  B   NaN NaN
2/1/71  B   1   NaN
3/1/71  B   NaN NaN
4/1/71  B   NaN 1
5/1/71  B   0   1
6/1/71  B   1   0
7/1/71  B   1   0.5
8/1/71  B   NaN 0.67
9/1/71  B   NaN 1
10/1/71 B   1   1
11/1/71 B   0   1
    
1
2 ответа                              2                         
  df['MovAvg'] = df['ct'].groupby(df['Group']).rolling(3, min_periods=1).mean().shift()
    
0
2019-05-02 15: 33: 09Z
  1. df['ct'].groupby(df['Group']): группирует столбец ct на основе столбца «Группа» rolling(3, min_periods=1).mean(): для групп, созданных в первой части, будет рассчитываться скользящее среднее значение для 3 периодов. min_period = 1 вычислит среднее значение, если хотя бы одна строка не является NaN. shift(): это сместит ваши скользящие средства на один период времени вниз.
    2019-05-03 14: 35: 38Z
  2. ОК. Можете ли вы отредактировать свое сообщение, добавив эту информацию? Есть ли у вас что-нибудь еще сказать о rolling, mean и shift? Посмотрите на другой ответ, если вы не знаете, как объяснить свой код.
    2019-05-03 14: 37: 46Z

Мы можем использовать rolling с min_periods=1, который требует хотя бы одного действительного наблюдения, поэтому мы можем несколько исправить проблему с вашим NaN:

df['MovAvg'] = pd.concat([d['ct'].rolling(3, min_periods=1).mean().shift() for _, d in df.groupby('Group')])
print(df)
       Date Group   ct    MovAvg
0    1/1/71     A  NaN       NaN
1    2/1/71     A  1.0       NaN
2    3/1/71     A  NaN  1.000000
3    4/1/71     A  NaN  1.000000
4    5/1/71     A  1.0  1.000000
5    6/1/71     A  NaN  1.000000
6    7/1/71     A  0.0  1.000000
7    8/1/71     A  NaN  0.500000
8    9/1/71     A  NaN  0.000000
9   10/1/71     A  1.0  0.000000
10  11/1/71     A  0.0  1.000000
11   1/1/71     B  NaN       NaN
12   2/1/71     B  1.0       NaN
13   3/1/71     B  NaN  1.000000
14   4/1/71     B  NaN  1.000000
15   5/1/71     B  0.0  1.000000
16   6/1/71     B  1.0  0.000000
17   7/1/71     B  1.0  0.500000
18   8/1/71     B  NaN  0.666667
19   9/1/71     B  NaN  1.000000
20  10/1/71     B  1.0  1.000000
21  11/1/71     B  0.0  1.000000
    
0
2019-05-02 16: 14: 47Z
источник размещен Вот