python - Pandas DataFrame - 在当前日期之前计算具有更大值的数字频率
问题描述
我正在尝试计算过去所有日期的值高于今天值的出现次数的频率。
我已经研究过使用 pandas rolling和cumcount函数,但仍然无法弄清楚如何有效地做到这一点。
下面是我试图通过下图中显示的输出实现的工作代码片段。我的直觉说这是一种极其丑陋和低效的方法,所以我希望能找到更好的方法。
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}%'})
解决方案
您可以使用.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
...
推荐阅读
- javascript - 绑定滚动事件不会在角度指令中触发
- reactjs - 如何将参数传递给reactjs中的事件句柄
- ansible - 使用 Ansible 获取 VMware 虚拟机的 UUID
- neo4j - 有没有办法一起执行所有 3 个查询?
- c# - 如何通过 Socket C# 发送长字符串
- java - 如何使用 phantomjs 将多个 Web 元素传递到页面
- c# - C# - Xamarin.Froms.Build.Task.GetTaskAbi - 错误
- nested-loops - 如何使用嵌套列表在井字游戏中实现 Tie 功能
- php - 使用另一个数组PHP中的值复制数组内的值
- sql - 在 Windows 7 中安装 SQL Express 2017