Динамические обновления строк в фрейме данных

#python #pandas #dataframe

Вопрос:

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

 df=pd.DataFrame([[1,0.6],[1,0.7],[1,0.8],[-1,0.3],[-1,0.4],[-1,0.9]],columns=['prediction','confidence'])
df['date']= pd.date_range('2000-1-1', periods=6, freq='D')
df = df.set_index(['date'])

prediction  confidence
date        
2000-01-01  1   0.6
2000-01-02  1   0.7
2000-01-03  1   0.8
2000-01-04  -1  0.3
2000-01-05  -1  0.4
2000-01-06  -1  0.9
 

Модель также определяет степень достоверности в диапазоне от 0 до 1. Я хочу провести тест, в котором я могу игнорировать прогноз, если достоверность модели Это изменение должно оказать последующее влияние на остальную часть фрейма данных, а не только на 1 день.

То, на чем я застрял, — это как изменить мой фрейм данных (или создать новый), чтобы я получил желаемое. выход. Используя приведенный выше пример, желаемый результат будет

 prediction  confidence
date        
2000-01-01  1   0.6
2000-01-02  1   0.7
2000-01-03  1   0.8
2000-01-04  1   0.3
2000-01-05  1   0.4
2000-01-06  -1  0.9
 

Спасибо

Редактировать:

Так же, как дальнейшее уточнение, когда прогноз изменился в «desire_df» на «2000-01-04», значение «2000-01-05» также изменяется, потому что теперь значение «предыдущей строки» теперь равно 1, а не -1. Этот шаблон продолжается до тех пор, пока модель не выдаст прогноз со знаком -1, который имеет уровень достоверности > 0,5.

Правка№2:

Я думаю, что это требование распространено в торговле/инвестировании, где вы хотите сохранить существующую позицию ( 1 или -1), пока вы не убедитесь, что что-то изменилось (в моем случае уверенность > 0,5), чтобы избежать чрезмерной покупки и продажи из-за шума в модели.

Ответ №1:

Давайте попробуем заменить Series.mask низкие значения уверенности NaN на то, чтобы затем Series.ffill продвинуть значения вперед:

 df['prediction'] = (
    df['prediction'].mask(df['confidence'].lt(0.5)).ffill(downcast='infer')
)
 

df :

             prediction  confidence
date                              
2000-01-01           1         0.6
2000-01-02           1         0.7
2000-01-03           1         0.8
2000-01-04           1         0.3
2000-01-05           1         0.4
2000-01-06          -1         0.9
 

Маскируйте низкие значения достоверности:

 df['prediction'].mask(df['confidence'].lt(0.5))

date
2000-01-01    1.0
2000-01-02    1.0
2000-01-03    1.0
2000-01-04    NaN
2000-01-05    NaN
2000-01-06   -1.0
Name: prediction, dtype: float64
 

Перенаправьте значения заполнения, чтобы заполнить NaN значения. downcast чтобы вернуться к типу int (при необходимости)

 df['prediction'].mask(df['confidence'].lt(0.5)).ffill(downcast='infer')

date
2000-01-01    1
2000-01-02    1
2000-01-03    1
2000-01-04    1
2000-01-05    1
2000-01-06   -1
Name: prediction, dtype: int64
 

Ответ №2:

Попробуйте добавить эту строку кода:

 df['prediction'] = [x if y >= 0.5 else 1 for x, y in zip(df['prediction'], df['confidence'])]
 

Комментарии:

1. спасибо за это. Возможно ли сделать это более динамично? Поэтому вместо того, чтобы устанавливать значение только 1, установите любое значение в предыдущей дате (строке).

2. @FeltonWang Хм, пожалуйста, объясните немного яснее, кажется, я не понимаю, что вы имеете в виду.

3. извините за это, я только что внес правку, надеюсь, это прояснит немного больше.