Python 如何计算使用熊猫前n天的平均值?
我想像前10天一样计算每天的平均值 例如,在结果表的A列中,“1/11/2000”显示44,这是从“1/1/2000”到“1/10/2000”的A值的平均值 原始数据:Python 如何计算使用熊猫前n天的平均值?,python,pandas,Python,Pandas,我想像前10天一样计算每天的平均值 例如,在结果表的A列中,“1/11/2000”显示44,这是从“1/1/2000”到“1/10/2000”的A值的平均值 原始数据: A B C 1/1/2000 60 62 88 1/2/2000 46 99 28 1/3/2000 20 23 94 1/4/2000 28 19 79 1/
A B C
1/1/2000 60 62 88
1/2/2000 46 99 28
1/3/2000 20 23 94
1/4/2000 28 19 79
1/5/2000 58 45 12
1/6/2000 50 46 62
1/7/2000 68 4 55
1/8/2000 54 64 79
1/9/2000 26 41 63
1/10/2000 33 10 18
1/11/2000 37 82 73
1/12/2000 67 33 29
1/13/2000 2 82 17
1/14/2000 82 74 51
1/15/2000 9 46 81
1/16/2000 72 84 70
1/17/2000 74 77 100
1/18/2000 19 88 37
结果:
A B C
1/1/2000
1/2/2000
1/3/2000
1/4/2000
1/5/2000
1/6/2000
1/7/2000
1/8/2000
1/9/2000
1/10/2000
1/11/2000 44 41 58
1/12/2000 42 43 56
1/13/2000 44 37 56
1/14/2000 42 43 49
1/15/2000 48 48 46
1/16/2000 43 48 53
1/17/2000 45 52 54
1/18/2000 46 59 58
您可以将
rolling.mean()
与shift
一起使用:
df.rolling(window = 10).mean().applymap(round).shift()
警告/警告
numpy
通常(并非总是)提供更高性能的解决方案。然而,它们也缺乏直观性和灵活性。我提供这个解决方案是为了向社区提供有用的信息。我不会向刚刚熟悉pandas
和numpy
的人推荐这个。我建议你也阅读下面@Jeff的评论
numpy
使用步履蹒跚
时间测试
如果缺少值,则此操作将失败:numpy对以下内容不友好this@Jeff使用
np.nanmean
并适应nan值是一个简单的修复方法。请重新考虑你的否决票,或作进一步评论。谢谢。推荐人们使用大步行走,这太疯狂了。当然,也有一些高级用户偶尔可以做一些新奇的事情,但99%的人不应该碰像这样的小傻瓜。而且它相当不灵活。试着在一段时间内跳过两个南。@Jeff,我尊重你的意见。因此,我试图从你和其他人身上汲取任何智慧。你认为最好不要提供这样的答案吗。或者留下这样一个带有适当警告的答案。到目前为止,我认为这是有用的信息。如果你建议我这样做的话,我会更负责任,发出更响亮的警告。但根据你的评论,我认为你根本不希望看到这样的答案。你会建议我做什么对社区最合适。是的,这是一个有用的答案,但警告是大多数用户不会(也不应该这样做);他偶尔也会说一些numpy惯例更具表现力,但它们几乎总是不那么灵活,在语法上也不太具有挑战性。因此,有了这些警告,一切都很好。
import pandas as pd
import numpy as np
from numpy.lib.stride_tricks import as_strided as stride
v = df.values
n, m = v.shape
s1, s2 = v.strides
# note that `np.nanmean` is used to address potential nan values
pd.DataFrame(
np.nanmean(stride(v, (n - 9, 10, m), (s1, s1, s2)), 1).round(),
df.index[9:], df.columns
)
A B C
1/10/2000 44.0 41.0 58.0
1/11/2000 42.0 43.0 56.0
1/12/2000 44.0 37.0 56.0
1/13/2000 42.0 43.0 49.0
1/14/2000 48.0 48.0 46.0
1/15/2000 43.0 48.0 53.0
1/16/2000 45.0 52.0 54.0
1/17/2000 46.0 59.0 58.0
1/18/2000 42.0 62.0 54.0