【问题标题】:How to replace NaNs using regression model estimates as forecasts如何使用回归模型估计作为预测来替换 NaN
【发布时间】:2021-10-20 10:03:18
【问题描述】:

我有以下数据框,其中显示了每月平均每日销售量 (adv) 和平均售价 (pkg_yld) 以及每个指标在 12 个月内的百分比变化:

df:

在 2021 年 7 月至 2021 年 12 月期间,我需要: (1) 使用线性回归模型预测 pkg_yld,然后 (2) 计算 yoy_pkg_yld。

如上所示,两列均显示预测范围内的 NaN。

我估计了一个粗略的回归,其中 Y = adv 和 X = pkg_yld;估计在 2020 年 7 月至 2021 年 6 月之间:

X = df['adv']
y = df['pkg_yld']

X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
model.summary()

估计的回归是: pkg_yld = 93.3 – 0.68 * adv

我想将提供的每月“adv”列值输入公式中,以填充 2021 年 7 月至 2021 年 12 月期间每个月的预测每月“pkg_yld”,然后计算同期的 yoy_pkg_yld。

For July 2021:
pkg_yld = 93.3 – (0.68 x 9.0) = 87.18
yoy_pkg_yld= ((87.2 / 97.5) -1 ) x 100 = -10.6%

以此类推到 2021 年 12 月。 用我现有数据框中的估计值覆盖 pkg_yld 和 yoy_pkg_yld 列中的 NaN 的最简单方法是什么?

【问题讨论】:

    标签: python regression nan forecast


    【解决方案1】:

    我能想出的第一个解决方案是定义一个自定义函数,该函数将一个序列作为输入并计算缺失值(如果它们是 NaN)。然后用df.apply将这个函数应用到DataFrame的每一行

    import pandas as pd
    import numpy as np
    
    # setup example dataframe
    
    data = {
            "A": [1, 2, 3, 4],
            "B": [4, 6, np.nan, 35],
            "C": [np.nan, 7, np.nan, 1]
            }
    df = pd.DataFrame(data)
    
    # Function to apply on each row
    # Insert your column names and coefficients
    def func(row):
        if np.isnan(row["B"]):
            row["B"] = row["A"] * 0.5 + 3
        if np.isnan(row["C"]):
            row["C"] = row["A"] * 0.7 + 15
        return row
    
    result = df.apply(func, axis=1) #Apply the function, axis=1 defines to apply on rows
    

    您还可以将位置或关键字参数添加到func,并将它们传递给applyvalues 参数或直接作为关键字参数。请查看documentation 了解更多详情。

    或者,您可以提前计算所有回归结果,并在必要时使用df.fillna 填充缺失值

    import copy
    
    values = copy.deepcopy(df) # copy df to avoid overriding existing values
    values["B"] = values["A"] * 0.5 + 3
    values["C"] = values["A"] * 0.7 + 15
    
    result = df.fillna(value=values)
    

    第二种方法在 IMO 上更具可读性,但是您正在计算所有可能的结果,这可能比第一种方法效率低很多,具体取决于您的计算复杂性和数据框的大小。

    【讨论】:

      猜你喜欢
      • 2020-04-14
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多