我试图在双时间数据集上计算移动平均线。数据集由数据日期和有效日期(数据可用的日期)组成。这个日期的数据可以在将来重述几次(相同的数据日期,但不同的生效日期)。我需要计算过去4个季度的移动平均线,使用在正在计算的行生效日期有效的数据。
数据集看起来像这样
<表类>
id
datadate
effdate
价值
tbody><<tr>1 2005-03-31 2005-04-15 10 12005-03-31 2005-05-30 11 12005-06-30 2005-07-15 9 12005-06-30 2005-08-20 9.5 12005-06-30 2005-10-15 9.6 12005-09-30 2005-10-15 10.5 12005-09-30 2005-11-10 11 12005-09-30 2006-02-20 10.75 12005-12-31 2006-02-13 12 12005-12-31 2006-02-20 11.6 12005-12-31 2006-05-10 11 12006-03-31 2006-04-20 8 12006-03-31 2006-05-10 8.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