如何在feature-engine中实现分组滚动窗口函数?求替代方案
问题解答
一、Feature-engine中实现分组窗口函数的方案
Feature-engine的WindowFeatures类目前确实没有内置的分组参数,无法直接通过传入groupby_cols实现分组滚动计算。不过可以通过以下两种方式实现需求:
1. 手动分组+窗口特征转换
利用pandas的groupby结合WindowFeatures,对每个分组单独应用窗口转换后再合并结果:
import pandas as pd from feature_engine.timeseries.forecasting import WindowFeatures # 构造示例数据 df = pd.DataFrame({'group': ['A', 'A','A', 'B', 'B', 'B','B', 'C', 'C', 'C','C'], 'value': [1, 2, 3, 4, 5, 6, 7, 8,9,10,11]}) # 初始化窗口特征转换器 wf = WindowFeatures( window_size=2, variables=["value"], operation=["mean"] ) # 分组应用转换并合并 transformed_df = df.groupby('group').apply(lambda x: wf.fit_transform(x)).reset_index(drop=True) print(transformed_df)
这种方式完全复用WindowFeatures的功能,同时实现分组逻辑,结果和你用pandas原生rolling的输出结构一致(会自动填充NaN对应窗口不足的行)。
2. 自定义Transformer(进阶)
如果需要频繁使用分组窗口转换,可以继承Feature-engine的BaseTransformer自定义支持分组的窗口转换器,封装分组逻辑:
from feature_engine.base_transformers import BaseTransformer import pandas as pd class GroupedWindowFeatures(BaseTransformer): def __init__(self, groupby_cols, window_size, variables, operations): self.groupby_cols = groupby_cols self.window_size = window_size self.variables = variables self.operations = operations def fit(self, X, y=None): return self def transform(self, X): for var in self.variables: for op in self.operations: col_name = f"{var}_rolling_{op}_window{self.window_size}" X[col_name] = X.groupby(self.groupby_cols)[var].rolling(self.window_size).agg(op).reset_index(level=0, drop=True) return X # 使用自定义转换器 gwf = GroupedWindowFeatures( groupby_cols=["group"], window_size=2, variables=["value"], operations=["mean"] ) transformed_df = gwf.fit_transform(df) print(transformed_df)
二、sktime中的标准化时序特征工程方法
sktime提供了更体系化的时序特征处理工具,针对分组时序场景,常用方案如下:
1. 窗口特征提取:WindowSummarizer
WindowSummarizer是sktime专门用于提取滚动窗口特征的工具,支持结合分组逻辑实现计算:
import pandas as pd from sktime.transformations.series.summarize import WindowSummarizer df = pd.DataFrame({'group': ['A', 'A','A', 'B', 'B', 'B','B', 'C', 'C', 'C','C'], 'value': [1, 2, 3, 4, 5, 6, 7, 8,9,10,11]}) # 定义窗口特征配置 window_config = { "value": [ ("rolling_mean", "mean", 2), ] } ws = WindowSummarizer(window_config=window_config) # 分组应用转换 transformed_df = df.groupby('group').apply(lambda x: ws.fit_transform(x)).reset_index(drop=True) print(transformed_df)
2. 时序特征流水线:ForecastingPipeline
如果需要组合多种时序特征(比如时间戳特征、窗口特征),可以用ForecastingPipeline构建标准化流程,配合分组逻辑处理:
from sktime.pipeline import ForecastingPipeline from sktime.transformations.series.date import DateTimeFeatures from sktime.transformations.series.summarize import WindowSummarizer # 给数据添加时间戳字段 df['timestamp'] = pd.date_range(start='2023-01-01', periods=len(df)) # 构建特征流水线 pipeline = ForecastingPipeline(steps=[ ("date_features", DateTimeFeatures(features=["hour", "day_of_week"])), ("window_features", WindowSummarizer(window_config={"value": [("rolling_mean", "mean", 2)]})), ]) # 分组执行流水线 transformed_df = df.groupby('group').apply(lambda x: pipeline.fit_transform(x)).reset_index(drop=True)
3. 面板数据特征提取
如果你的分组时序属于面板数据格式(每个分组是独立的时间序列样本),可以用sktime的PanelToTabular或TabularToPanel转换器,配合面板特征提取工具实现批量标准化处理。
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

