python - Pandas 如何让我的专栏将新价格附加到标价,持有或什么都不做时保持相同的列表,全部出售为 Nan=N
问题描述
我有黄金价格的这个数据框
Date Open High Low Close Long 20High LongPrice
x/x/x 569.799988 575.299988 568.000000 572.500000 1 575.299988 NaN
x/x/x 571.500000 574.200012 565.000000 567.400024 0 575.299988 NaN
x/x/x 568.400024 574.000000 567.500000 570.200012 0 575.299988 NaN
x/x/x 569.500000 571.000000 550.599976 551.000000 0 575.299988 NaN
x/x/x 551.000000 553.299988 545.500000 550.099976 0 575.299988 NaN
x/x/x 553.299988 566.000000 549.900024 564.500000 0 575.299988 NaN
x/x/x 561.900024 561.900024 548.000000 550.200012 0 575.299988 NaN
x/x/x 548.500000 549.500000 540.000000 539.000000 -1 575.299988 NaN
x/x/x 538.000000 546.000000 535.500000 545.900024 -1 575.299988 NaN
x/x/x 544.900024 545.000000 538.000000 539.700012 0 575.299988 NaN
我为他们创造了乐趣
- 多头 = 1 --> 买入
- Long = 0 --> 什么都不做或只是保持
- 多头 = -1 --> 全部卖出
它会是这样的
Date Open High Low Close Long 20High LongPrice
x/x/x 569.799988 575.299988 568.000000 572.500000 1 575.299988 [575.299988]
x/x/x 571.500000 575.299988 565.000000 567.400024 1 575.299988 [575.299988,575.299988]
x/x/x 568.400024 574.000000 567.500000 570.200012 0 575.299988 [575.299988,575.299988]
x/x/x 569.500000 571.000000 550.599976 551.000000 0 575.299988 [575.299988,575.299988]
x/x/x 551.000000 553.299988 545.500000 550.099976 0 575.299988 [575.299988,575.299988]
x/x/x 553.299988 566.000000 549.900024 564.500000 0 575.299988 [575.299988,575.299988]
x/x/x 561.900024 561.900024 548.000000 550.200012 0 575.299988 [575.299988,575.299988]
x/x/x 548.500000 549.500000 540.000000 539.000000 -1 575.299988 NaN
x/x/x 538.000000 546.000000 535.500000 545.900024 -1 575.299988 NaN
x/x/x 544.900024 577.000000 538.000000 560.700015 1 577.000000 [577.000000]
但是我不确定为什么以及我在代码中做错了什么,它不能使数据框像上面我展示的示例数据框一样(我也将使用 LongPrice 中的数据来计算利润)
def TurtleBuyPrice(df):
df = df.copy()
df = df.reset_index()
x = []
for index,row in df.iterrows():
if index == 0:
if row['Long'] == 0 or -1:
continue
else:
df['LongPrice'][index] = [row["20High"]]
elif row['Long'] in [1]:
if df['LongPrice'][index-1] == np.nan:
df['LongPrice'][index] = [row["20High"]]
else:
df['LongPrice'][index] = df['LongPrice'][index-1]+[row["20High"]]
elif row['Long'] in [0]:
df['LongPrice'][index] = df['LongPrice'][index-1]
elif row['Long'] in [-1]:
df['LongBuySell'][index] = np.nan
return df
如果有人有更好的想法来保持数据是这样的,请给一些建议
解决方案
一种使用shift
with 的方法cumsum
:
s = df["Long"].ne(-1)
s2 = df["20High"].apply(lambda x: [x]) * df["Long"]
df["LongPrice"] = s2.groupby(s.ne(s.shift()).cumsum()).apply(pd.Series.cumsum)
print(df)
输出:
Date Open High Low Close Long 20High \
0 x/x/x 569.799988 575.299988 568.000000 572.500000 1 575.299988
1 x/x/x 571.500000 574.200012 565.000000 567.400024 1 575.299988
2 x/x/x 568.400024 574.000000 567.500000 570.200012 0 575.299988
3 x/x/x 569.500000 571.000000 550.599976 551.000000 0 575.299988
4 x/x/x 551.000000 553.299988 545.500000 550.099976 0 575.299988
5 x/x/x 553.299988 566.000000 549.900024 564.500000 0 575.299988
6 x/x/x 561.900024 561.900024 548.000000 550.200012 0 575.299988
7 x/x/x 548.500000 549.500000 540.000000 539.000000 -1 575.299988
8 x/x/x 538.000000 546.000000 535.500000 545.900024 -1 575.299988
9 x/x/x 544.900024 545.000000 538.000000 539.700012 1 575.299988
LongPrice
0 [575.299988]
1 [575.299988, 575.299988]
2 [575.299988, 575.299988]
3 [575.299988, 575.299988]
4 [575.299988, 575.299988]
5 [575.299988, 575.299988]
6 [575.299988, 575.299988]
7 []
8 []
9 [575.299988]
推荐阅读
- c# - c# Linq 表达式返回复选框的选定值
- javascript - 添加我的应用 ID 和单元 ID 后,广告没有出现
- android - 如果使用具有链请求的唯一工作,则 WorkStatus 为 BLOCKED
- php - URL 重写内部服务器错误
- python - 如何从 OpenCV 图像而不是 numpy 数组中获取 TIFF 字节流?
- powershell - Powershell,从目录中的前 100 个文件创建存档
- java - Java 8+流:检查我的对象实例的两个字段的列表是否正确
- bash - 有什么作用。/opt/pat/staging/config/VARIABLES>>/dev/null 做什么?
- typescript - Visual Studio 2017 中的 Typescript d.ts 文件
- javascript - JS - 循环对象数组并输出属性