Kelly标准应用程序python的逻辑问题(使用最后一行值),pandas

2024-09-26 22:12:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试使用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    ║
╚═══╩═════════════╩══════╩════════╩════════╩════════╩═══════╩════════╝

Tags: 函数代码importdfnetshiftasnan
2条回答

似乎应该使用shift(1)从上一行获取值。使用fill_value参数可以用初始值填充第一行:

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

如果我理解正确的话,您需要按顺序更新各种变量,因为每个值都依赖于前一个值。在这种情况下,我看不到比逐行操作更好的方法:

# starting with your original df, not repeated here

for row in range(1, len(df)):
    df.loc[row, 'Cap'] = df.Total[row - 1]
    df.loc[row, 'Invest'] = df.Kelly[row] * df.Cap[row]
    df.loc[row, 'Net'] = df.Odds[row] * df.Invest[row]
    df.loc[row, 'Total'] = df.Cap[row] + df.Net[row]

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       1800.0  -0.200  -360.0  -360.0  1440.0
2   0.5             4       1440.0  0.375   540.0   2160.0  3600.0

然而,请注意,这并没有产生与您所期望的数据帧相同的数据帧,因此,可能我仍然误解了某些东西

相关问题 更多 >

    热门问题