SIENTIAPDE-1579: Fixed data preprocessor
This commit is contained in:
@@ -18,6 +18,15 @@ FEATURE_CREATION = 'Feature Creation'
|
||||
LAG_CREATION = 'Lag Creation'
|
||||
|
||||
|
||||
def _frontend_date_format_to_strftime(fmt: str | None) -> str | None:
|
||||
"""Convert front-end date format (e.g. dd/MM/yyyy HH:mm:ss) to Python strftime."""
|
||||
if not fmt:
|
||||
return None
|
||||
out = fmt.replace('yyyy', '%Y').replace('MM', '%m').replace('dd', '%d')
|
||||
out = out.replace('HH', '%H').replace('mm', '%M').replace('ss', '%S')
|
||||
return out
|
||||
|
||||
|
||||
class LinearRegressionModel(BaseEstimator, TransformerMixin):
|
||||
"""
|
||||
Linear Regression Model for Time Series Analysis.
|
||||
@@ -244,6 +253,7 @@ class DataPreprocessor(BaseEstimator, TransformerMixin):
|
||||
lag_transform: dict[str, int] | None = None,
|
||||
start_date: str | None = None,
|
||||
end_date: str | None = None,
|
||||
date_format: str | None = None,
|
||||
removed_intervals: list[tuple[str, str]] | None = None,
|
||||
static_threshold: int | None = None,
|
||||
low_lim: dict[str, float] | None = None,
|
||||
@@ -270,8 +280,9 @@ class DataPreprocessor(BaseEstimator, TransformerMixin):
|
||||
*Format: {'variable_name': lag}*
|
||||
lag_transform (dict): The lags for each variable to be applyed during transformation \\
|
||||
*Format: {'variable_name': lag}*
|
||||
start_date (str): The start date for filtering data (format: 'YYYY-MM-DD HH:MM:SS')
|
||||
end_date (str): The end date for filtering data (format: 'YYYY-MM-DD HH:MM:SS')
|
||||
start_date (str): The start date for filtering data
|
||||
end_date (str): The end date for filtering data
|
||||
date_format (str | None): Frontend date format for start/end (e.g. dd/MM/yyyy HH:mm:ss or MM/dd/yyyy HH:mm:ss). When set, parsing matches the CSV date column.
|
||||
removed_intervals (list): List of tuples with intervals to remove from data \\
|
||||
*Format: [('start_date', 'end_date'), ...]*
|
||||
static_threshold (int): The number of repeated values to be considered as static
|
||||
@@ -314,6 +325,7 @@ class DataPreprocessor(BaseEstimator, TransformerMixin):
|
||||
self.lag_transform = lag_transform if lag_transform else {}
|
||||
self.start_date = start_date
|
||||
self.end_date = end_date
|
||||
self.date_format = date_format
|
||||
self.removed_intervals = removed_intervals if removed_intervals else []
|
||||
self.ar_var = ar_var
|
||||
self.self_operations = self_operations
|
||||
@@ -443,10 +455,17 @@ class DataPreprocessor(BaseEstimator, TransformerMixin):
|
||||
return input_data
|
||||
|
||||
def _parse_datetime(self, date_str: str | None) -> pd.Timestamp | None:
|
||||
"""Parse a date string to Timestamp, returning None on failure."""
|
||||
"""Parse a date string to Timestamp using date_format when set.
|
||||
|
||||
When date_format is set (e.g. dd/MM/yyyy HH:mm:ss or MM/dd/yyyy HH:mm:ss),
|
||||
parsing matches the CSV date column so start_date/end_date filter correctly.
|
||||
"""
|
||||
if not date_str:
|
||||
return None
|
||||
try:
|
||||
python_fmt = _frontend_date_format_to_strftime(self.date_format) if self.date_format else None
|
||||
if python_fmt:
|
||||
return pd.to_datetime(date_str, format=python_fmt)
|
||||
return pd.to_datetime(date_str)
|
||||
except (ValueError, TypeError):
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user