python - 凯利标准应用程序的逻辑问题(使用最后一行值) - python,pandas
问题描述
尝试使用 python 构建具有 kelly 标准的模型时出现逻辑问题。我需要从前一行(单元格)中为函数使用一个值,但是,当我尝试将函数应用于整个 df 时,前一行(单元格)是索引行。
下面是代码和输出:
import pandas as pd
import numpy as np
data = {'Probability':[0.3,0.4,0.5],
'Odds':[5,1,4]
,'Cap':[1000,'','']}
df = pd.DataFrame(data)
P = df.Probability / 1
B = df.Odds
Q = 1 - P
df['Kelly'] = ((B * P - Q)/B)
df['Invest'] = df.Kelly * df.Cap
df.loc[df['Invest'] < 0, 'Invest'] = 0
df['Net'] = df.Odds * df.Invest
df['Total'] = df.Cap + df.Net
原DF
+---+--------------+------+------+--------+-------- +--------+--------+ | | 概率 | 赔率 | 帽 | 凯利 | 投资 | 网| 总计 | +---+--------------+------+------+--------+-------- +--------+--------+ | 0 | 0.3 | 5 | 1000 | 0.160 | 160.0 | 800.0 | 1800.0 | | 1 | 0.4 | 1 | | -0.200 | 0.0 | 0.0 | 0.0 | | 2 | 0.5 | 4 | | 0.375 | 0.0 | 0.0 | 0.0 | +---+--------------+------+------+--------+-------- +--------+--------+
我试图实现的结果的 DF:其中 Cap(capital) 用上一行的 Total 更新:
+---+--------------+------+------+--------+-------- +--------+--------+ | | 概率 | 赔率 | 帽 | 凯利 | 投资 | 网| 总计 | +---+--------------+------+------+--------+-------- +--------+--------+ | 0 | 0.3 | 5 | 1000 | 0.160 | 160.0 | 800.0 | 1800.0 | | 1 | 0.4 | 1 | 1800 | -0.200 | 0.0 | 0.0 | 1800.0 | | 2 | 0.5 | 4 | 1800 | 0.375 | 675.0 | 2700.0 | 4500.0 | +---+--------------+------+------+--------+-------- +--------+--------+
总之,第一行的 1000 的 Cap 是初始资本,Total 是 Net + Cap 的总和。因此,在第一次迭代之后,以下 Cap 将是上一行的 Total。
我试过使用 shift(-1),但是,第一行将无法从最后一行找到 Total,因为最后一行是索引行。
非常感谢问候
我已经尝试按照@Daniel Geffen 的建议添加班次,但是,我无法解决问题。我是按错误的顺序放置代码还是遗漏了什么?这是修改后的代码:
P = df.Probability / 1
B = df.Odds
Q = 1 - P
df['Kelly'] = ((B * P - Q)/B)
df["Total"] = np.nan
df['Cap'] = df.Total.shift(1, fill_value=1000)
df['Invest'] = df.Kelly * df.Cap
df.loc[df['Invest'] < 0, 'Net'] = 0
df['Net'] = df.Odds * df.Invest
df['Total'] = df.Cap + df.Net
df = df[['Probability', 'Odds','Cap','Kelly','Invest', 'Net', 'Total']]
这是更改代码的结果:
╔═══╦═════════════╦══════╦════════╦════════╦══════ ══╦═══════╦════════╗ ║ ║ 概率 ║ 赔率 ║ 上限 ║ 凯利 ║ 投资 ║ 净值 ║ 总计 ║ ╠═══╬═════════════╬══════╬════════╬════════╬══════ ══╬═══════╬════════╣ ║ 0 ║ 0.3 ║ 5 ║ 1000.0 ║ 0.160 ║ 160.0 ║ 800.0 ║ 1800.0 ║ ║ 1 ║ 0.4 ║ 1 ║ NaN ║ -0.200 ║ NaN ║ NaN ║ NaN ║ ║ 2 ║ 0.5 ║ 4 ║ NaN ║ 0.375 ║ NaN ║ NaN ║ NaN ║ ╚═══╩═════════════╩══════╩════════╩════════╩══════ ══╩═══════╩════════╝
解决方案
看来您应该使用它shift(1)
来获取上一行的值。使用fill_value
参数可以用您的初始值填充第一行:
df['Cap'] = df.Total.shift(1, fill_value=1000)
推荐阅读
- python - aiohttp ClientSession.get() 方法静默失败 - Python3.7
- dialogflow-es - 是否有一种简单的方法可以在对话流中创建“电影名称”实体
- python - xarray - 返回满足特定条件的数据,而无需使用 for 循环
- python - 相对于另一个减少一个 python pandas 列
- python-3.x - 模块存在,但它说找不到
- python - 将数据集拆分为两个非冗余 numpy 数组?
- amazon-web-services - 如何在 Cloudformation Fn::Sub 中的 UserData 中添加两个变量
- java - 如何让 Scala 和 Java 与 Visual Studio Code 一起工作?
- python - 用于网络搜索历史的 GUI
- python - 如何通过 Python API 使用 Google Drive v3 API 来限制编辑者共享电子表格?