Векторизация функции более pandas - неизвестная длина окна / диапазон индекса - PullRequest
0 голосов
/ 20 июня 2020

У меня есть фрейм данных, как показано ниже.

          signal   positions.  rates
Date            
2018-01-02  0      NaN         1.2065
2018-01-03  0      0.0         1.2023
2018-01-04  0      0.0         1.2065
2018-01-05  1      1.0         1.2045
2018-01-08  0.    -1.0         1.1973
2018-01-09  0      0.0         1.1932
2018-01-10  0      0.0         1.1992
2018-01-11  1      1.0         1.2017
2018-01-12  1      0.0         1.2137
2018-01-15  0     -1.0         1.22

На основе столбца позиции, я хочу sh для создания новых столбцов с именем entryRate. Все строки между позициями 1 и -1 должны иметь одинаковую скорость: скорость, когда позиция = 1. Например:

          signal    positions   rates   entryRate
Date                
2018-01-02  0       NaN         1.2065  0.0000
2018-01-03  0       0.0         1.2023  0.0000
2018-01-04  0       0.0         1.2065  0.0000
2018-01-05  1       1.0         1.2045  1.2045
2018-01-08  0      -1.0         1.1973  1.2045
2018-01-09  0       0.0         1.1932  0.0000
2018-01-10  0       0.0         1.1992  0.0000
2018-01-11  1       1.0         1.2017  1.2017
2018-01-12  1       0.0         1.2137  1.2017
2018-01-15  0      -1.0         1.2277  1.2017

В настоящее время я перебираю строки, чтобы реализовать это. Условие формируется в столбце сигнала, который остается = 1 между position = 1 и position = -1

dat['entryRate'] = 0
        i=0
        while(i<len(dat)):
            if (dat.iloc[i,0]==1):
                entry = dat.iloc[i,2]
                while (dat.iloc[i,0]==1):
                    dat.iloc[i,3]=entry
                    i+=1

                    #end of dataframe cond
                    if(i==len(dat)):
                        break

                #update one more row after end of while loop, don't update if end of dataframe is reached
                if i<len(dat):
                    dat.iloc[i,4]=entry

            else:
                i+=1

Любой хороший способ векторизовать эту функцию? Я не могу понять, что использовать - применить, объединить asof, et c.

Ценю любые предложения, ребята :)

1 Ответ

0 голосов
/ 21 июня 2020

Я уверен, что есть лучшее векторизованное решение, но я думаю, что это лучше, чем то, что у вас есть

entryRate = 0.0
for i, row in df.iterrows():
    if row['positions'] == 1.0:
        entryRate = row['rates']
        df.loc[i,'entryRate'] = entryRate
    elif row['positions'] == -1.0:
        df.loc[i,'entryRate'] = entryRate
        entryRate = 0.0
    else:
        df.loc[i,'entryRate'] = entryRate

Результат:

            signal  positions   rates  entryRate
Date                                            
2018-01-02       0        NaN  1.2065     0.0000
2018-01-03       0        0.0  1.2023     0.0000
2018-01-04       0        0.0  1.2065     0.0000
2018-01-05       1        1.0  1.2045     1.2045
2018-01-08       0       -1.0  1.1973     1.2045
2018-01-09       0        0.0  1.1932     0.0000
2018-01-10       0        0.0  1.1992     0.0000
2018-01-11       1        1.0  1.2017     1.2017
2018-01-12       1        0.0  1.2137     1.2017
2018-01-15       0       -1.0  1.2200     1.2017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...