我在尝试使用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
+---+-------------+------+------+--------+--------+--------+--------+ | | Probability | Odds | Cap | Kelly | Invest | Net | Total | +---+-------------+------+------+--------+--------+--------+--------+ | 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(资本)更新为前一行的总计:
+---+-------------+------+------+--------+--------+--------+--------+ | | Probability | Odds | Cap | Kelly | Invest | Net | 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将是前一行的总和
我尝试使用shift(-1),但是,第一行无法从最后一行中找到总计,因为最后一行是索引行
多谢各位
我已经尝试按照@Daniel Geffen的建议添加shift,但是,我无法解决这个问题。我是把代码放错了顺序还是遗漏了什么? 这是修改后的代码:
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']]
这是更改代码后的结果:
╔═══╦═════════════╦══════╦════════╦════════╦════════╦═══════╦════════╗ ║ ║ 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
参数可以用初始值填充第一行:如果我理解正确的话,您需要按顺序更新各种变量,因为每个值都依赖于前一个值。在这种情况下,我看不到比逐行操作更好的方法:
然而,请注意,这并没有产生与您所期望的数据帧相同的数据帧,因此,可能我仍然误解了某些东西
相关问题 更多 >
编程相关推荐