我有以下数据框,它具有使用日期的非唯一索引:
column
2019-01-07 NaN
2019-01-08 NaN
2019-01-08 0.02
2019-01-09 31.45
2019-01-10 NaN
2019-01-10 71.87
2019-01-10 90.18
2019-01-11 NaN
2019-01-12 12.67
2019-01-12 5.68
2019-01-12 11.23
2019-01-12 21.67
2019-01-12 14.77
2019-01-12 5.18
2019-01-13 14.38
2019-01-13 NaN
2019-01-13 71.13
2019-01-13 20.02
2019-01-13 103.10
2019-01-14 NaN
2019-01-15 32.48
2019-01-16 37.37
2019-01-16 31.05
2019-01-16 7.00
2019-01-17 NaN
2019-01-17 39.65
2019-01-18 23.68
2019-01-18 0.08
2019-01-18 41.35
2019-01-19 NaN
2019-01-19 45.85
2019-01-19 3.98
2019-01-19 4.60
2019-01-19 NaN
2019-01-19 NaN
2019-01-20 3.60
2019-01-20 5.03
2019-01-20 15.70
我的目标是使用每个日期的所有值计算 7 天滚动中位数,但忽略 NaN 值。
生成的数据框应具有唯一的日期索引,其中滚动中位数作为该日期的列值,类似于以下内容:
column
2019-01-13 17.40
2019-01-14 17.40
2019-01-15 20.85
2019-01-16 20.85
2019-01-17 20.02
2019-01-18 20.85
2019-01-19 31.05
2019-01-20 19.69
我不确定如何使用 pandas 轻松实现此目的,因此如果有人可以提供答案或为我指出正确的方向,我将非常感激。
编辑
为了让事情更清楚,我将解释如何计算单个日期的中位数。
使用 2019 年 1 月 13 日的日期,滚动中位数将需要使用从 7 天到 13 日的所有值(不包括 NaN 值)。这意味着需要包含在 13 日中位数计算中的值为 0.02、31.45、71.87、90.18、12.67、5.68、11.23、21.67、14.77、5.18、14.38、71.13、20.02、103.10。 13 日的结果中位数为 17.4。
希望有帮助。
最佳答案
滚动
对象是可迭代的,它允许像这样的解决方案:
# drop NAs and group by date into lists of values
df_per_date = df.dropna().groupby('date').apply(lambda g: g.value.to_list())
# compute medians across windows ('sum' concatenates multiple lists into one list)
medians = [np.median(window.agg(sum)) for window in df_per_date.rolling(5)]
# result
medians = pd.Series(index=df_per_date.index, data=medians)
medians
顺便说一下,我是这样加载数据的:
# load the data
df = pd.read_csv(pd.io.common.StringIO("""
2019-01-07 NaN
2019-01-08 NaN
2019-01-08 0.02
2019-01-09 31.45
2019-01-10 NaN
2019-01-10 71.87
2019-01-10 90.18
2019-01-11 NaN
2019-01-12 12.67
2019-01-12 5.68
2019-01-12 11.23
2019-01-12 21.67
2019-01-12 14.77
2019-01-12 5.18
2019-01-13 14.38
2019-01-13 NaN
2019-01-13 71.13
2019-01-13 20.02
2019-01-13 103.10
2019-01-14 NaN
2019-01-15 32.48
2019-01-16 37.37
2019-01-16 31.05
2019-01-16 7.00
2019-01-17 NaN
2019-01-17 39.65
2019-01-18 23.68
2019-01-18 0.08
2019-01-18 41.35
2019-01-19 NaN
2019-01-19 45.85
2019-01-19 3.98
2019-01-19 4.60
2019-01-19 NaN
2019-01-19 NaN
2019-01-20 3.60
2019-01-20 5.03
2019-01-20 15.70
""".strip()), sep='\s+', names=['date', 'value'], parse_dates=['date'])
关于python - 计算具有非唯一日期索引的数据帧的滚动中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65929683/