python - 计算具有非唯一日期索引的数据帧的滚动中位数

标签 python pandas

我有以下数据框,它具有使用日期的非唯一索引:

                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

enter image description here


顺便说一下,我是这样加载数据的:

# 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/

相关文章:

python - 如何将选定的数据转换为相同的长度(形状)

python - 如何在Python中进行行列转换/旋转?

python - 关于从 matplotlib 生成的图像大小

python - 代码有什么问题?结果在Google Kickstart 2020 Round A中产生RE

python - 无法使用 FreeTDS ODBC 连接到 SQL Server 实例

python - openssl,python请求错误: "certificate verify failed"

python - Django 管理员 : sending signal on field change

python - 使用循环在seaborn直方图子图中添加分位数和平均线

python - 为什么基于 iLocation 的 bool 索引不起作用?

Python Pandas : Counting the Frequency of unique values over all Columns