mirror of
https://github.com/webclinic017/drift.git
synced 2026-07-27 18:57:55 +00:00
2606639cc2
* fix(Labelling): didn't forward shift forward returns previously, introduced major lookahead bias * fix(Baseline): use the same config
53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
import pandas as pd
|
|
from data_loader.types import ForwardReturnSeries
|
|
from labeling.types import EventsDataFrame
|
|
from typing import Callable
|
|
import numpy as np
|
|
|
|
|
|
def create_forward_returns(series: pd.Series, period: int) -> ForwardReturnSeries:
|
|
assert period > 0
|
|
indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=period)
|
|
return series.rolling(window=indexer).sum().shift(-1)
|
|
|
|
|
|
def purge_overlapping_events(events: EventsDataFrame) -> EventsDataFrame:
|
|
events = events.copy()
|
|
indicies_to_remove = []
|
|
last_event_end = events.iloc[0]["start"]
|
|
for index, row in events.iterrows():
|
|
if row["start"] < last_event_end:
|
|
indicies_to_remove.append(index)
|
|
else:
|
|
last_event_end = row["end"]
|
|
events.drop(indicies_to_remove, inplace=True)
|
|
return events
|
|
|
|
|
|
def discretize_binary(x):
|
|
return 1 if x > 0 else -1
|
|
|
|
|
|
def discretize_binary_zero_one(x):
|
|
return 1 if x > 0 else 0
|
|
|
|
|
|
def discretize_threeway(x):
|
|
return 0 if x == 0 else 1 if x > 0 else -1
|
|
|
|
|
|
def discretize_threeway_threshold(threshold: float) -> Callable:
|
|
def discretize(current_value):
|
|
lower_threshold = -threshold
|
|
upper_threshold = threshold
|
|
if np.isnan(current_value):
|
|
return np.nan
|
|
elif current_value <= lower_threshold:
|
|
return -1
|
|
elif current_value > lower_threshold and current_value < upper_threshold:
|
|
return 0
|
|
else:
|
|
return 1
|
|
|
|
return discretize
|