首页 > 解决方案 > 凯利标准应用程序的逻辑问题(使用最后一行值) - 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 ║
╚═══╩═════════════╩══════╩════════╩════════╩══════ ══╩═══════╩════════╝

标签: pythonpandasdataframe

解决方案


看来您应该使用它shift(1)来获取上一行的值。使用fill_value参数可以用您的初始值填充第一行:

df['Cap'] = df.Total.shift(1, fill_value=1000)

推荐阅读