在双时态数据集上计算移动平均



我试图在双时间数据集上计算移动平均线。数据集由数据日期和有效日期(数据可用的日期)组成。这个日期的数据可以在将来重述几次(相同的数据日期,但不同的生效日期)。我需要计算过去4个季度的移动平均线,使用在正在计算的行生效日期有效的数据。

数据集看起来像这样

<表类> id datadate effdate 价值 tbody><<tr>12005-03-312005-04-151012005-03-312005-05-301112005-06-302005-07-15912005-06-302005-08-209.512005-06-302005-10-159.612005-09-302005-10-1510.512005-09-302005-11-101112005-09-302006-02-2010.7512005-12-312006-02-131212005-12-312006-02-2011.612005-12-312006-05-101112006-03-312006-04-20812006-03-312006-05-108.25

这个问题的答案是不清楚的,因为您只要求&"更好的&";并且您没有指出您希望这个改进在哪个轴上。

所以我将提供一些更好的,在可读性方面。这可能会帮助其他人在其他方向上找到改进:

给定csvdata.csv:

datadate,effdate,value
2005-03-31,2005-04-15,10
2005-03-31,2005-05-30,11
2005-06-30,2005-07-15,9
2005-06-30,2005-08-20,9.5
2005-06-30,2005-10-15,9.6
2005-09-30,2005-10-15,10.5
2005-09-30,2005-11-10,11
2005-09-30,2006-02-20,10.75
2005-12-31,2006-02-13,12
2005-12-31,2006-02-20,11.5
2005-12-31,2006-05-10,11
2006-03-31,2006-04-20,8
2006-03-31,2006-05-10,8.25

您可以通过以下操作获得相同的结果:

import pandas as pd
data = pd.read_csv('data.csv').sort_values(by=["effdate"])

def moving_avg(df, quarters):
df = df[
df.index <= df.last_valid_index
].drop_duplicates(subset="datadate", keep="last").tail(quarters)
return df["value"].sum() / df["value"].count()

print(data.assign(MAvg=[moving_avg(d, 4) for d in data.expanding()]).sort_index())

这提供了:

datadate     effdate  value       MAvg
0   2005-03-31  2005-04-15  10.00  10.000000
1   2005-03-31  2005-05-30  11.00  11.000000
2   2005-06-30  2005-07-15   9.00  10.000000
3   2005-06-30  2005-08-20   9.50  10.250000
4   2005-06-30  2005-10-15   9.60  10.300000
5   2005-09-30  2005-10-15  10.50  10.366667
6   2005-09-30  2005-11-10  11.00  10.533333
7   2005-09-30  2006-02-20  10.75  10.450000
8   2005-12-31  2006-02-13  12.00  10.900000
9   2005-12-31  2006-02-20  11.50  10.712500
10  2005-12-31  2006-05-10  11.00  10.587500
11  2006-03-31  2006-04-20   8.00   9.962500
12  2006-03-31  2006-05-10   8.25   9.900000

最新更新