计算新行特征时更新 pandas 数据帧的惯用方法

Idiomatic way to update pandas dataframe when computing features for new row

提问人:harryjulian 提问时间:7/26/2023 最后编辑:harryjulian 更新时间:7/26/2023 访问量:39

问:

我有一个 pandas 数据帧,其中包含时间序列数据行。

我想定义一个函数,可用于在机器学习模型的现有时间序列数据帧(5 列)上计算某些特征(20+ 列)。compute_features(*args **kwargs)

在实时应用程序中使用该模型时,我将收到新的数据行(5 列)——我必须计算这些数据的特征——然后添加到数据帧中。小问题是其中一些功能是滚动的,并且在某些列中需要过去的 N 个值。

因此,我想使用该函数来建立我所有的特征工程逻辑,并且在更改标志时(假设)我可以传递一个预先存在的特征数据帧和一行新的数据,我们将 i) 计算特征和 ii) 附加该行。compute_featuresupdate=True

我可以想到“快速而肮脏”的方法来解决这个问题,但我想知道是否可能有一种更惯用的、pythonic 的和不那么复杂的方法来解决这个问题。

编辑:

例如:

import pandas as pd

path = ...
df = pd.read_csv(path)


def _compute_features_inner(df, new_row = None):
    # contains logic for computing features
    # here if there's a new row, we want to use the existing df and 
    # only run transforms on the final row
    df['feature_1'] = df['a'].rolling(window = 10)
    df['feature_2'] = df['a'].rolling(window = 20)
    ...

def compute_features(df, new_row: Optional[pd.DataFrame] = None) -> pd.DataFrame:
    if new_row is None:
         df = _compute_features_inner(df)
    else:
         df = _compute_features_inner(df, new_row)

    return df

然后在实时环境中,我们可能每 15 分钟获得一个新行(因此我们不介意在这种情况下简单地附加到 DataFrame)。我只想对最后一行运行转换,但您不能直接附加 因为它没有必要的列。compute_featuresnew_row

Python Pandas DataFrame 机器学习 特征工程

评论

0赞 mozway 7/26/2023
我一般你不应该迭代地追加到DataFrame,复杂性很糟糕。您能举一个最小的例子来说明您正在用数据、虚拟函数和 2/3 迭代做什么吗?
0赞 harryjulian 7/26/2023
我在上面做了一个编辑。

答: 暂无答案