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

У меня есть pandas-dataframe, содержащий столбцы GROUP, DATE, VALUE и VARIANCE:

Index      GROUP   DATE         VALUE    VARIANCE
1          g1      2015-12-02   10       3.2                    
2          g1      2015-10-12   9        4.25                  
3          g1      2013-12-13   8        8               
4          g1      2013-12-13   11       8
5          g1      2013-07-15   7        NaN
6          g1      2015-12-02   11       NaN                   
7          g2            ...

В основном я хочу вычислить сдвинутую скользящую дисперсию для столбца VALUE. Таким образом, значение для дисперсии для индекса 1 представляет собой дисперсию значений в индексе 2-6 и т. Д.

Мой первый подход состоял в том, чтобы использовать расширяющуюся ветровую ветвь для вычисления отклонений и сдвига значений на 1, но я не уверен, является ли это правильным подходом здесь. Я рад каждому предложению.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Для всех, кто интересуется этим вопросом. Ответ Мейбл Вильяльба указал мне правильное направление. Я изменил ее подход соответственно:

variance_r = df[['GROUP','DATE','VALUE']].sort_values(['GROUP','DATE'])
variance = []

for name, group in variance_r.groupby('GROUP'):
    variance.append(
                    group['VALUE'].expanding().var().shift(1).
                    where(group['DATE'].shift() != group['DATE'],
                    group['VALUE'].expanding().var().shift(2)
                    ))

variance_r.assign(VARIANCE = pd.concat(variance))
0 голосов
/ 08 ноября 2018

Чтобы использовать pd.expanding в столбце VALUE, сначала необходимо перевернуть кадр данных и рассчитать смещенную дисперсию расширения:

variance = df['VALUE'].iloc[::-1].expanding(
          ).var().shift().iloc[::-1].rename('VARIANCE')

>> variance

Index
1    3.200000
2    4.250000
3    5.333333
4    8.000000
5         NaN
6         NaN
Name: VARIANCE, dtype: float64

Несколько групп

Давайте создадим новый df со значениями для каждой группы:

>> df

      GROUP        DATE  VALUE
Index                         
1        g1  2015-12-02     10
2        g1  2015-10-12      9
3        g1  2013-12-13      8
4        g1  2013-12-13     11
5        g1  2013-07-15      7
6        g1  2015-12-02     11
1        g2  2015-12-02     10
2        g2  2015-10-12      9
3        g2  2013-12-13      8
4        g2  2013-12-13     11
5        g2  2013-07-15      7
6        g2  2015-12-02     11

Для нескольких групп вы можете перебирать по группам и сохранять результаты.

variance = []

for name, group in df.groupby('GROUP'):
      variance.append(group['VALUE'].iloc[::-1].expanding(
                      ).var().shift().iloc[::-1])

>> df.assign(VARIANCE=pd.concat(variance))

      GROUP        DATE  VALUE  VARIANCE
Index                                   
1        g1  2015-12-02     10  3.200000
2        g1  2015-10-12      9  4.250000
3        g1  2013-12-13      8  5.333333
4        g1  2013-12-13     11  8.000000
5        g1  2013-07-15      7       NaN
6        g1  2015-12-02     11       NaN
1        g2  2015-12-02     10  3.200000
2        g2  2015-10-12      9  4.250000
3        g2  2013-12-13      8  5.333333
4        g2  2013-12-13     11  8.000000
5        g2  2013-07-15      7       NaN
6        g2  2015-12-02     11       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...