首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫按群计算移动滚动方差

熊猫按群计算移动滚动方差
EN

Stack Overflow用户
提问于 2018-11-08 17:39:56
回答 2查看 383关注 0票数 0

我有一个熊猫-dataframe拥有一个组,日期,价值和方差栏:

代码语言:javascript
复制
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            ...

基本上,我想要计算值列的移位滚动方差。因此,指数1的方差值是指数2-6中数值的方差,等等。

我的第一种方法是使用一个扩展的终结来计算方差并将值移动1,但我不确定这是否是正确的方法。我对每一个建议都感到高兴。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-08 18:48:53

要在pd.expanding列上使用VALUE,首先应该翻转数据并计算展开方差移位:

代码语言:javascript
复制
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:

代码语言:javascript
复制
>> 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

对于多个组,您可以对组进行迭代并存储结果。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2018-11-12 10:44:40

对每个研究这个问题的人来说。梅贝尔·维拉尔巴的回答为我指明了正确的方向。我相应地改变了她的做法:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53213324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档