Pandas Как заставить мою колонку добавлять новую цену к цене по прейскуранту, сохранять тот же список при удержании или ничего не делать, продавать все, чтобы быть Nan = N

#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. О, хорошо, тогда я адаптирую это для расчета моей общей прибыли, а также Спасибо, кстати