【发布时间】:2021-03-04 00:33:53
【问题描述】:
我想计算不规则熊猫系列的中位数。
特别是,我想先根据前 X 天计算中位数,然后再根据接下来的 X 天计算中位数。
我确实编写了以下工作示例。在那里,我生成了两列,一列 median_-2days 列出了前两天的中位数,另一列 median_+2days 列出了接下来两天的中位数。
import numpy as np
import pandas as pd
def dummy_data():
idx = np.array([pd.Timestamp(year=2021, month=1, day=1),
pd.Timestamp(year=2021, month=1, day=2),
pd.Timestamp(year=2021, month=1, day=3),
pd.Timestamp(year=2021, month=1, day=5),
pd.Timestamp(year=2021, month=1, day=6),
pd.Timestamp(year=2021, month=1, day=8),
pd.Timestamp(year=2021, month=1, day=9),
pd.Timestamp(year=2021, month=1, day=10),
])
data = np.array([1, 2, 3, 5, 6, 8, 9, 10])
return pd.DataFrame(data, index=idx, columns=["l"])
def rolling_median_irregular(ds, left, right):
res = pd.Series(index=ds.index)
for t in ds.index:
val = ds.loc[(ds.index >= t - left) & (ds.index <= t + right)].median()
res.loc[t] = val
return res
if __name__ == "__main__":
df = dummy_data()
df["median_-2days"] = rolling_median_irregular(df["l"], left=pd.Timedelta(days=2), right=pd.Timedelta(days=0))
df["median_+2days"] = rolling_median_irregular(df["l"], left=pd.Timedelta(days=0), right=pd.Timedelta(days=2))
但是,我觉得我在重新发明轮子。我更喜欢使用内置的rolling 函数来获得更通用的方法,我还可以使用不同的函数(如.sum() 或.mean())和不同的窗口类型。
甚至可以使用内置函数来做到这一点,还是我必须继承BaseIndexer?如果是这样的话,会是什么样子?
【问题讨论】: