]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
fix: ensure_datetime_series raises ValueError on None instead of silent corruption
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 1 May 2026 17:20:24 +0000 (19:20 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 1 May 2026 17:20:24 +0000 (19:20 +0200)
ReforceXY/user_data/strategies/RLAgentStrategy.py
quickadapter/user_data/strategies/QuickAdapterV3.py
quickadapter/user_data/strategies/Utils.py

index 7cbe10845533d31e936fc873eb1ad1554d5b5e7f..aa2efa9f5f8f07d3aae3368b2502ba2693e48b76 100644 (file)
@@ -23,8 +23,13 @@ _EPOCH_MS_MIN = 1_262_304_000_000  # 2010-01-01T00:00:00Z
 _EPOCH_MS_MAX = 2_051_222_400_000  # 2035-01-01T00:00:00Z
 
 
-def _ensure_datetime_series(series: pd.Series) -> pd.Series:
+def _ensure_datetime_series(series: pd.Series | None) -> pd.Series:
     """Ensure a date series is datetime64[ms, UTC], following freqtrade's data handler pattern."""
+    if series is None:
+        raise ValueError(
+            "Expected a date Series but received None. "
+            "The 'date' column is missing from the dataframe."
+        )
     if pd.api.types.is_integer_dtype(series):
         sample = series.dropna()
         if sample.empty:
@@ -77,7 +82,7 @@ class RLAgentStrategy(IStrategy):
     def feature_engineering_standard(
         self, dataframe: DataFrame, metadata: dict[str, Any], **kwargs
     ) -> DataFrame:
-        dates = _ensure_datetime_series(dataframe["date"])
+        dates = _ensure_datetime_series(dataframe.get("date"))
         dataframe["%-day_of_week"] = (dates.dt.dayofweek + 1) / 7
         dataframe["%-hour_of_day"] = (dates.dt.hour + 1) / 25
 
index 2d00ba25bf6fdaef033d116eeb5b37727f890fe1..87871e24e3d2a924f0fddb47a7742bd64e0cdc6e 100644 (file)
@@ -724,7 +724,7 @@ class QuickAdapterV3(IStrategy):
     def feature_engineering_standard(
         self, dataframe: DataFrame, metadata: dict[str, Any], **kwargs
     ) -> DataFrame:
-        dates = ensure_datetime_series(dataframe["date"])
+        dates = ensure_datetime_series(dataframe.get("date"))
 
         dataframe["%-day_of_week"] = (dates.dt.dayofweek + 1) / 7
         dataframe["%-hour_of_day"] = (dates.dt.hour + 1) / 25
index e794082a35f11b773e9cf77efa0fd926be53d471..c5f8e7405cdd918b506942982bf99cce31ed969a 100644 (file)
@@ -649,8 +649,13 @@ _EPOCH_MS_MIN = 1_262_304_000_000  # 2010-01-01T00:00:00Z
 _EPOCH_MS_MAX = 2_051_222_400_000  # 2035-01-01T00:00:00Z
 
 
-def ensure_datetime_series(series: pd.Series) -> pd.Series:
+def ensure_datetime_series(series: pd.Series | None) -> pd.Series:
     """Ensure a date series is datetime64[ms, UTC], following freqtrade's data handler pattern."""
+    if series is None:
+        raise ValueError(
+            "Expected a date Series but received None. "
+            "The 'date' column is missing from the dataframe."
+        )
     if pd.api.types.is_integer_dtype(series):
         sample = series.dropna()
         if sample.empty: