#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. извините за это, я только что внес правку, надеюсь, это прояснит немного больше.