Pandas 在Sklearn Custom Transformer中添加TimeSeries功能

Pandas 在Sklearn Custom Transformer中添加TimeSeries功能,pandas,scikit-learn,time-series,pipeline,feature-engineering,Pandas,Scikit Learn,Time Series,Pipeline,Feature Engineering,我使用的是一个时间序列数据集,如下所示: 我想添加一些功能,如SMA、EWMA和其他可能的指标,让我的数据集保持这样: 在开发和调整模型时,我想使用Sklearn管道在我的train datatset中添加特性。但是,当我将nan值放入管道中时,会收到以下错误: "ValueError: Found input variables with inconsistent numbers of samples:" 我知道在删除nan值后,我的X小于Y。但我找不到解释我如何做到

我使用的是一个时间序列数据集,如下所示:

我想添加一些功能,如SMA、EWMA和其他可能的指标,让我的数据集保持这样:

在开发和调整模型时,我想使用Sklearn管道在我的train datatset中添加特性。但是,当我将nan值放入管道中时,会收到以下错误:

"ValueError: Found input variables with inconsistent numbers of samples:"
我知道在删除nan值后,我的X小于Y。但我找不到解释我如何做到这一点的东西

有没有办法在Sklearn管道中创建这些时间序列功能

示例代码:

import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.base import TransformerMixin, BaseEstimator
from sklearn.linear_model import LinearRegression

dates = pd.date_range('2000-1-1', '2010-1-1')

df = pd.DataFrame()
df["dates"] = dates
df["values"] = np.arange(1, len(dates)+1) * 1000
df["next_values"] = df["values"].shift(1)
df.set_index("dates", inplace=True)
df.dropna(inplace=True)

X = df.drop("next_values", axis=1)
y = df["next_values"]


class ExampleTransformer(BaseEstimator, TransformerMixin):

    def __init__(self, sma1_period, sma2_period):
        self.sma1_period = sma1_period
        self.sma2_period = sma2_period

    def fit(self, X, y):
        return self
    
    def transform(self, X):
        out_df = pd.DataFrame()
        out_df["values"] = X["values"]
        out_df["sma1"] = X["values"].rolling(self.sma1_period).mean()
        out_df["sma2"] = X["values"].rolling(self.sma2_period).mean()

        # Drop NaN values
        out_df.dropna(inplace=True)

        return out_df


pipe = Pipeline(steps=[
    ("exe_trans", ExampleTransformer(10, 20)),
    ("lin_reg", LinearRegression())
])

pipe.fit(X, y)

# ValueError: Found input variables with inconsistent numbers of samples: [3634, 3653]


这个问题是由于您正在删除X的行,而不是y的行,结果是不同的形状。然而,正如回答的那样,您不能使用转换器来改变y