微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

熊猫日均线

如何解决熊猫日均线

我在下面显示了df:

enter image description here

为数据框添加代码

df = pd.DataFrame({'Name':['John']*12,'Type':[*'AABBBBAAABAB'],'Period':['Noon','Morning']*6,'Date':['1/1/2020']*2+['1/4/2020']*2+
                          ['1/5/2020']*2+['1/2/2020']*2+
                          ['1/3/2020']*2+['1/19/2020','1/31/2020'],'value':[1,2,7,8,9,10,3,4,5,6,6]},index=range(1,13))

基本上,我需要连续2天对一个人(以John为例)的值进行移动平均,并按类型和时期(人也是如此,但不在此表中)进行分类

预期结果如最后一列所示。 例如1。早晨,约翰的B型第4行,在1/4/2020和1/3/2020(第10行)中的平均值为(6+8)/2=7, 并且没有约翰类型B的1/3/2020之前的数据,因此row10结果为na

例如2。第11和12行不是连续的日期,因此都是na

如何使用熊猫实现此功能?我应该使用transform还是rolling

解决方法

您可以使用以下内容:

df.set_index('Date')\
  .groupby(['Name','Type','Period'])['value']\
  .rolling('2D',min_periods=2)\
  .mean()\
  .reset_index()

输出:

    Name Type   Period       Date  value
0   John    A  Morning 2020-01-01    NaN
1   John    A  Morning 2020-01-02    3.0
2   John    A     Noon 2020-01-01    NaN
3   John    A     Noon 2020-01-02    2.0
4   John    A     Noon 2020-01-03    4.0
5   John    A     Noon 2020-01-19    NaN
6   John    B  Morning 2020-01-04    NaN
7   John    B  Morning 2020-01-05    9.0
8   John    B  Morning 2020-01-03    8.0
9   John    B  Morning 2020-01-31    NaN
10  John    B     Noon 2020-01-04    NaN
11  John    B     Noon 2020-01-05    8.0

而且,一种将其合并回原始数据框的方法:

df_er = (df.set_index('Date')
           .groupby(['Name','Period'])['value']
           .rolling('2D',min_periods=2)
           .mean()
           .rename('Expected Result'))
df.merge(df_er,left_on=['Name','Period','Date'],right_index=True)

输出:

    Name Type   Period       Date  value  Expected Result
1   John    A     Noon 2020-01-01      1              NaN
2   John    A  Morning 2020-01-01      2              NaN
3   John    B     Noon 2020-01-04      7              NaN
4   John    B  Morning 2020-01-04      8              NaN
5   John    B     Noon 2020-01-05      9              8.0
6   John    B  Morning 2020-01-05     10              9.0
7   John    A     Noon 2020-01-02      3              2.0
8   John    A  Morning 2020-01-02      4              3.0
9   John    A     Noon 2020-01-03      5              4.0
10  John    B  Morning 2020-01-03      6              8.0
11  John    A     Noon 2020-01-19      5              NaN
12  John    B  Morning 2020-01-31      6              NaN

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。