我正在寻找按类别分组的每日数据的“每月”滚动窗口。下面的代码不能按原样工作,它导致以下错误:
ValueError: <DateOffset: months=1> is a non-fixed frequency
我知道我可以使用“ 30D”偏移量,但这会随着时间的推移而改变日期。
我正在寻找一个窗口的总和,该窗口的范围从一个月的第x天到第J个月的同一x天。例如,J = 1:7月4日至8月4日,7月5日至8月5日,7月6日至8月6日等
我已经尝试了好几天了。任何建议或的窍门将非常感激。新年快乐。
MRE:
import pandas as pd
from io import StringIO
data = StringIO(
"""\
date logret category
2014-03-25 -0.01 A
2014-04-05 -0.02 A
2014-04-15 -0.03 A
2014-04-25 0.01 B
2014-05-05 0.03 B
2014-05-15 -0.01 A
2014-05-25 0.04 B
"""
)
df = pd.read_csv(data,sep="\s+",parse_dates=True,index_col="date")
J=1
df.groupby(['category'])['logret'].rolling(pd.DateOffset(months=J),min_periods=J*20).sum()
在中间步骤中,“标准化”您的时间戳记,以使每个月有31天,然后进行汇总,最后从结果中删除“插入的”行。
只要您的聚合具有中性元素,该方法就起作用。
import pandas as pd
from io import StringIO
data = StringIO(
"""\
date logret category
2014-03-25 -0.01 A
2014-04-05 -0.02 A
2014-04-15 -0.03 A
2014-04-25 0.01 B
2014-05-05 0.03 B
2014-05-15 -0.01 A
2014-05-25 0.04 B
"""
)
df = pd.read_csv(data,sep="\s+",parse_dates=True,index_col="date")
idx = df.index.strftime('%Y-%m-%d')
y0 = df.index[0].year
y1 = df.index[-1].year
padded = pd.DataFrame(index=[f'{y}-{m:02}-{d:02}'
for y in range(y0,y1+1)
for m in range(1, 13)
for d in range(1, 32)])[idx[0]:idx[-1]]
# Note that the rolling interval is exclusive at start
df.assign(rolling_aggregate=padded.join(df.set_index(idx)).fillna(0).rolling(31).agg(sum).loc[idx])
产量:
logret category rolling_aggregate
date
2014-03-25 -0.01 A NaN
2014-04-05 -0.02 A NaN
2014-04-15 -0.03 A NaN
2014-04-25 0.01 B -0.04
2014-05-05 0.03 B 0.01
2014-05-15 -0.01 A 0.03
2014-05-25 0.04 B 0.06
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句