#python #pandas
#python #pandas
Вопрос:
У меня есть этот фрейм данных из цены на золото
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
и я сделал для них функцию, похожую на
- Long = 1 —> Купить
- Long = 0 —> Ничего не делать или просто удерживать
- Long = -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]
Но я не уверен, почему и что я сделал не так в своем коде, что он не работает, чтобы сделать dataframe похожим на приведенный выше dataframe, который я показываю в примере (я также буду использовать данные в 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
Если у кого-то есть идея получше сохранить данные, похожие на этот, пожалуйста, дайте несколько советов, пожалуйста
Комментарии:
1. Я не понимаю, как
LongPrice
нужно вычислять2. Я просто сохраняю 1 единицу, которую я покупаю, прежде чем рассчитывать прибыль, если системе нужно продать
Ответ №1:
Один из способов использования shift
с 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]
Комментарии:
1. Я раньше не использовал такие функции, как ne и cumsum, поэтому я не ожидал этой идеи, но есть ли у нее больше возможностей не использовать cumsum?
2. На данный момент я не могу придумать другого способа, который не используется
cumsum
, кроме перебора каждой строки по одному, что затем теряет многие преимуществаpandas
.3. О, хорошо, тогда я адаптирую это для расчета моей общей прибыли, а также Спасибо, кстати