推断Pandas DataFrame

10

使用Series.interpolatePandas.DataFrame中插值很容易,如何进行外推呢?

例如,给定如下的DataFrame,如何将其外推14个月到2014年12月31日?线性外推就可以了。

X1 = range(10)
X2 = map(lambda x: x**2, X1)
df = pd.DataFrame({'x1': X1, 'x2': X2},  index=pd.date_range('20130101',periods=10,freq='M'))

我认为首先必须创建一个新的DataFrame,其DateTimeIndex从2013-11-31开始,并延伸14个M周期。除此之外,我陷入了困境。

输入图像描述


24替换10有什么问题? - Mel
@tmoreau df 可以从 .CSV 文件中读取,因此我们无法访问 periods 参数。 - Nyxynyx
这个回答解决了你的问题吗?在 Pandas DataFrame 中外推数值 - rdmolony
1个回答

19

使用具有DatetimeIndex索引的DataFrame进行外推

这可以通过两个步骤完成:

  1. 扩展DatetimeIndex
  2. 外推数据。

扩展索引

使用新的 DataFrame 覆盖 df,其中数据基于原始 index's start, period and frequency 的新 扩展 索引进行 resampled。这使得原始的 df 可以来自任何地方,就像 csv 示例案例一样。这样,列会方便地 填充 NaN
# Fake DataFrame for example (could come from anywhere)
X1 = range(10)
X2 = map(lambda x: x**2, X1)
df = pd.DataFrame({'x1': X1, 'x2': X2},  index=pd.date_range('20130101',periods=10,freq='M'))

# Number of months to extend
extend = 5

# Extrapolate the index first based on original index
df = pd.DataFrame(
    data=df,
    index=pd.date_range(
        start=df.index[0],
        periods=len(df.index) + extend,
        freq=df.index.freq
    )
)

# Display
print df

    x1  x2
2013-01-31   0   0
2013-02-28   1   1
2013-03-31   2   4
2013-04-30   3   9
2013-05-31   4  16
2013-06-30   5  25
2013-07-31   6  36
2013-08-31   7  49
2013-09-30   8  64
2013-10-31   9  81
2013-11-30 NaN NaN
2013-12-31 NaN NaN
2014-01-31 NaN NaN
2014-02-28 NaN NaN
2014-03-31 NaN NaN

推断数据

大多数推断方法需要输入为数字而非日期。可以通过以下方式实现:

# Temporarily remove dates and make index numeric
di = df.index
df = df.reset_index().drop('index', 1)

查看此 答案 以了解如何使用 三次多项式DataFrame 的每列值进行外推。

Snippet from answer

# Curve fit each column
for col in fit_df.columns:
    # Get x & y
    x = fit_df.index.astype(float).values
    y = fit_df[col].values
    # Curve fit column and get curve parameters
    params = curve_fit(func, x, y, guess)
    # Store optimized parameters
    col_params[col] = params[0]

# Extrapolate each column
for col in df.columns:
    # Get the index values for NaNs in the column
    x = df[pd.isnull(df[col])].index.astype(float).values
    # Extrapolate those points with the fitted function
    df[col][x] = func(x, *col_params[col])
一旦列被外推,将日期放回。
# Put date index back
df.index = di

# Display
print df

x1   x2
2013-01-31   0    0
2013-02-28   1    1
2013-03-31   2    4
2013-04-30   3    9
2013-05-31   4   16
2013-06-30   5   25
2013-07-31   6   36
2013-08-31   7   49
2013-09-30   8   64
2013-10-31   9   81
2013-11-30  10  100
2013-12-31  11  121
2014-01-31  12  144
2014-02-28  13  169
2014-03-31  14  196

我只有一个问题。我按照您的步骤进行操作,一切似乎都很顺利,但是我从scipy中收到了一个警告:OptimizeWarning: Covariance of the parameters could not be estimated category=OptimizeWarning)。您知道这可能是什么原因吗? - Euler_Salter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接