Source code for modeva.data.feature_engineering.kinematics

import copy
from typing import Tuple, Union

import numpy as np
import pandas as pd

from ...utils.constants import NUMERICAL
from ...utils.results import ValidationResult


[docs] class FEKinematics: def __init__(self, dataset): self.dataset = dataset self.key = "data_fe_kinematics" self.fitted_ = False
[docs] def transform(self, data): if isinstance(data, pd.DataFrame): X = data[self.feature_names_in_].values.astype(np.float32) else: data = pd.DataFrame(data, columns=self.all_feature_names_in_) X = data[self.feature_names_in_].values.astype(np.float32) result = self.gaml_transformer_.transform(X) return pd.DataFrame(result, columns=self.feature_names_out_)
[docs] def run(self, features: Union[str, Tuple] = None, dataset: str = "main", n_timesteps: int = None, n_features_per_step: int = None): """Generates velocity, acceleration, and kinematic summary features from temporal sequences. Extracts kinematic quantities from multi-step time series data: last velocity, last acceleration, mean speed, kinetic energy, and directional persistence. Parameters ---------- features : str or tuple, default=None Features to use (treated as flat temporal sequence). If None, all numerical features are used. dataset : {"main", "train", "test"}, default="main" Dataset used to fit the transformer. n_timesteps : int, default=None Number of time steps. If None, inferred from data. n_features_per_step : int, default=None Features per time step. If None, inferred from data. """ from .gaml.kinematics import KinematicsTransformer inputs = locals() inputs.pop('self', None) if features is None: features = [fn for fn, ft in zip(self.dataset.all_feature_names, self.dataset.all_feature_types) if ft == NUMERICAL] if isinstance(features, str): features = [features] self.all_feature_names_in_ = copy.copy(self.dataset.all_feature_names) self.feature_names_in_ = list(features) data = self.dataset.get_data(dataset=dataset) feature_indices = [self.dataset.all_feature_names.index(fn) for fn in features] X = data[:, feature_indices].astype(np.float32) self.gaml_transformer_ = KinematicsTransformer(n_timesteps=n_timesteps, n_features_per_step=n_features_per_step) self.gaml_transformer_.fit(X) self.feature_names_out_ = self.gaml_transformer_.get_feature_names() self.fitted_ = True result = ValidationResult(key=self.key, data=self.dataset.name, inputs=inputs, value={"n_features_out": len(self.feature_names_out_), "feature_names_out": self.feature_names_out_}) return result