【发布时间】:2020-07-06 12:08:51
【问题描述】:
我想在 4 天内对价格列执行滚动中位数,数据将按日期分组。所以基本上我想取给定日期的价格和 4 天的所有价格,然后计算这些值的中位数。
以下是示例数据:
id date price
1637027 2020-01-21 7045204.0
280955 2020-01-11 3590000.0
782078 2020-01-28 2600000.0
1921717 2020-02-17 5500000.0
1280579 2020-01-23 869000.0
2113506 2020-01-23 628869.0
580638 2020-01-25 650000.0
1843598 2020-02-29 969000.0
2300960 2020-01-24 5401530.0
1921380 2020-02-19 1220000.0
853202 2020-02-02 2990000.0
1024595 2020-01-27 3300000.0
565202 2020-01-25 3540000.0
703824 2020-01-18 3990000.0
426016 2020-01-26 830000.0
我已经接近结合滚动和分组:
df.groupby('date').rolling(window = 4, on = 'date')['price'].median()
但这似乎为每个索引值添加一行,并且根据中值定义,我无法以某种方式合并这些行以每行产生一个结果。
结果现在如下所示:
date date
2020-01-10 2020-01-10 NaN
2020-01-10 NaN
2020-01-10 NaN
2020-01-10 3070000.0
2020-01-10 4890000.0
...
2020-03-11 2020-03-11 4290000.0
2020-03-11 3745000.0
2020-03-11 3149500.0
2020-03-11 3149500.0
2020-03-11 3149500.0
Name: price, Length: 389716, dtype: float64
它似乎只是删除了 3 个第一个值,然后只是打印了价格值。
是否有可能在每个日期获得一个滞后/移动中值?
【问题讨论】:
-
df.rolling(window = 4, on = 'date')['price'].median() ?
-
似乎只是删除前 3 行,然后打印每个索引的价格,而不是一天
-
哦,现在我明白了,每个日期都有不止 1 行,让我看看...
-
没有找到方法,但迭代,这里是:pd.DataFrame([[x, df[(df['date'] =x-pd.Timedelta('4d'))]['price'].median()] for x in df['date']], columns=['date','4d_median']).drop_duplicates()
标签: python pandas pandas-groupby median rolling-computation