You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:05:36