使用 Pandas Python 的连续输赢
Posted
技术标签:
【中文标题】使用 Pandas Python 的连续输赢【英文标题】:Winning and losing streak using Pandas Python 【发布时间】:2021-03-04 11:22:24 【问题描述】:我可以在下面输入熊猫系列(收盘价的每日系列)来复制该功能吗?它计算每日连胜数。
cp = pd.Series(index=range(1,8+1), name='Closing_Price',
data=[20.00, 20.50, 20.75, 19.75, 19.50, 19.35, 19.35, 19.40])
1 20.00
2 20.50
3 20.75
4 19.75
5 19.50
6 19.35
7 19.35
8 19.40
解释是:
第 2 天的收盘价高于第 1 天的收盘价,因此我们有单日上涨 在第 3 天,价格再次收高,因此我们有 连续两天上涨,即 Streak Duration 值为 2。 在第 4 天,收盘价下跌,给我们带来单日下跌。 Streak Duration 值为负 (-1),因为价格变动是下跌,而不是上涨。 下降趋势在第 5 天和第 6 天继续,我们的Streak Duration 值反映为-2 和-3。 第 7 天收盘价没有变化,因此 Streak Duration 设置为 0,表示既不是上涨也不是下跌。 最后,在第 8 天收盘价再次上涨,使 Streak Duration 值回到 1。我想我需要 cumsum() 和 groupby。类似的东西
def fxn(series):
x = series.diff()
但我不知道如何继续
【问题讨论】:
欢迎来到 Stack Overflow。请阅读如何问好questions。确保您的问题涵盖以下 3 个要素:1. 问题陈述 2. 您的代码(应该是 Minimal, Reproducible Example 3. 错误消息(最好是完整的 Traceback 以帮助其他人查看和提供反馈)。 ,请不要发布代码、数据或 Tracebacks 的图像。将其复制并粘贴为文本,然后将其格式化为代码(选择它并输入ctrl-k
)...Discourage screenshots of code and/or errors。 ,, How to make good reproducible pandas examples
but I'm not sure how to proceed
- 所以不是讨论论坛或教程。
我已经解决了这个问题,但是 SO 要求您尝试尝试并发布您的代码以及卡在哪里。将其分解为多个步骤:a) 获取 Closing_Price 中的一系列差异。称其为CPDiff
b) 将CPDiff
转换为+1/0/-1 值(正负号函数),称其为CPDiffS
c) 然后才考虑CPDiffS
是改变还是保持不变,在d) 最后之前你可以数一数条纹
【参考方案1】:
这可能是答案吗?向@smci 大声疾呼,感谢他们提供了急需和备受赞赏的提示!!
def streak(x):
c = x.copy()
c['diff'] = c.diff()
c['sign'] = c['diff'].apply(func = lambda y: y if not y else y // abs(y))
grouper = (c['sign'] != c['sign'].shift()).cumsum()
c['streak'] = c['sign'].groupby(grouper).cumsum()
return c['streak']
【讨论】:
干得好。 pandas passes dataframes by-reference,所以你不需要.copy()
。取决于您将数据框结果分配给什么?
@smci 感谢您指出这一点。我还有一个问题,可以请教一些提示吗?我想创建一个函数来查看当天价格变化相对于之前价格变化的大小。此计算称为“百分比排名”或百分位数。这告诉我们回溯期内小于当前值的值的百分比。所以百分比排名是回溯期内小于当前值的值的数量除以值的总数。
例如,如果回溯期为 20 天,那么我们会将今天 2.0% 的回报与前 20 天的每一天的回报进行比较。假设其中三个值小于 2.0%。我们将百分比排名计算为:百分比排名 = 3 / 20 = 0.15 = 15%以上是关于使用 Pandas Python 的连续输赢的主要内容,如果未能解决你的问题,请参考以下文章
python pandas - 创建一个保持连续值运行计数的列
python 在Pandas DataFrame中查找连续日期组