首页 > 解决方案 > Pandas DataFrame - 在当前日期之前计算具有更大值的数字频率

问题描述

我正在尝试计算过去所有日期的值高于今天值的出现次数的频率。

我已经研究过使用 pandas rollingcumcount函数,但仍然无法弄清楚如何有效地做到这一点。

下面是我试图通过下图中显示的输出实现的工作代码片段。我的直觉说这是一种极其丑陋和低效的方法,所以我希望能找到更好的方法。

    def freq_greater_than(r):
        smaller_date = df[df.date < r.date]
        larger_num = smaller_date[(smaller_date.num > r.num)]
        return round(len(larger_num) / len(smaller_date) * 100, 2)
    
    index = pd.date_range('2020-01-01', '2020-01-10')
    df = pd.DataFrame(dict(num=np.random.random_integers(0, 100, len(index))), index=pd.Series(index, name='date'))
    df['date'] = df.index
    df['freq_greater_than'] = df.iloc[1:].apply(freq_greater_than, axis=1)
    df.style.format({'freq_greater_than': '{:.2f}%'})

在此处输入图像描述

标签: pythonpandasdataframe

解决方案


您可以使用.expanding()

# convert date and sort dataframe:
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values(by="date")

df["freq_greater_than"] = (
    df["num"]
    .expanding(1)
    .apply(lambda x: ((x.iat[-1] < x[:-1]).sum() / (len(x) - 1)) * 100)
)
print(df)

印刷:

        date  num  freq_greater_than
0 2020-01-01   72                NaN
1 2020-01-02   28              100.0
2 2020-01-03   47               50.0
3 2020-01-04    2              100.0
4 2020-01-05   73                0.0
5 2020-01-06    8               80.0

...

推荐阅读