Python 计算随时间推移的滚动平均值
我有一个数据框,如下所示:Python 计算随时间推移的滚动平均值,python,pandas,for-loop,statistics,rolling-computation,Python,Pandas,For Loop,Statistics,Rolling Computation,我有一个数据框,如下所示: df = pd.DataFrame([['2019-01-01',2,5],['2019-01-02',15,8],['2019-01-03',1,9],['2019-01-04',10,20],['2019-01-05',5,15]],columns = ['date','data1','data2']) date data1 data2 0 2019-01-01 2 5 1 2019-01-02 15
df = pd.DataFrame([['2019-01-01',2,5],['2019-01-02',15,8],['2019-01-03',1,9],['2019-01-04',10,20],['2019-01-05',5,15]],columns = ['date','data1','data2'])
date data1 data2
0 2019-01-01 2 5
1 2019-01-02 15 8
2 2019-01-03 1 9
3 2019-01-04 10 20
4 2019-01-05 5 15
我想计算每两天的滚动平均值,并将结果放入新的数据框架中。例如,对于日期2019-01-01和2019-01-02,数据1的平均值为8.5,数据2的平均值为6.5,然后对于日期2019-01-02和2019-01-03,数据1的平均值为8,数据2的平均值为8.5。我的原始数据帧比这个大,所以我不希望一个接一个地这样做,我更喜欢创建循环,或者如果可能的话创建矢量化。我的目标是得到下面的数据框
date data1 data2
0 2019-01-02 8.5 6.5
1 2019-01-03 8.0 8.5
2 2019-01-04 5.5 14.5
3 2019-01-05 7.5 17.5
我的尝试:
def my_attempt(df):
result = []
start_date = datetime.datetime.strptime('2019-01-01','%Y-%m-%d')
start_date = start_date.date()
for i in range(5):
df1 = df.loc[df['date'].isin([str(start_date + datetime.timedelta(days = i)),str(start_date + datetime.timedelta(days = i) + datetime.timedelta(days = 1))])]
df1_mean = df1.mean()
result += df1_mean
return result
这不起作用,因为df1.mean()给出的格式与我想要得到的格式不同,并且不可能使用result+=df1_-mean来堆叠结果。因为您的问题似乎是关于时间的,所以最好将日期转换为
datetime
:
df.date = pd.to_datetime(df.date)
df.rolling('2D', min_periods=2, on='date').mean().dropna()
输出:
date data1 data2
2019-01-02 8.5 6.5
2019-01-03 8.0 8.5
2019-01-04 5.5 14.5
2019-01-05 7.5 17.5
我认为最好使用广亨的解决方案,但另一种方法是:
(df.set_index('date').iloc[1:] + df.set_index('date').shift(1).iloc[1:]) / 2
这可能是你想要的答案吗
df.rolling(2.mean()
或df['date']].join(df.rolling(2.mean()).iloc[1:][/code>你为什么不使用熊猫的日期相关功能?!