【问题标题】:R (or Python) functions for time series interpolation [closed]用于时间序列插值的 R(或 Python)函数 [关闭]
【发布时间】:2018-01-21 13:34:08
【问题描述】:

时间序列插值有哪些 R(或 Python)函数?

线性插值的基本示例:

Day  x       --->    Day  x
1    4               1    4
2    NA              2    3
3    2               3    2
4    NA              4    4
5    NA              5    6
6    8               6    8

是否有使用移动平均线或类似函数进行插值的函数?

谢谢。

【问题讨论】:

  • 请看我更新的答案。我提供了一种做移动平均线的方法。至于您在其他 cmets 中提到的更高级的方法。在提问之前做一些研究可能是一个好主意,因为 SO 不是代码编写服务的站点。鼓励进行一些具有良好可重现示例和代码的研究工作。

标签: python r time-series interpolation moving-average


【解决方案1】:

在 R 中, 包中的 na.interpolation 函数可以使用线性、样条或 Stineman 方法进行插值。假设你的数据框叫dat,这里是一个进行线性插值的例子,这是na.interpolation函数的默认设置。

# Load package
library(imputeTS)

# View dat
dat
#   Day  x
# 1   1  4
# 2   2 NA
# 3   3  2
# 4   4 NA
# 5   5 NA
# 6   6  8

# Linear interpolation
dat$x <- na.interpolation(dat$x)

# View dat again
dat
#   Day x
# 1   1 4
# 2   2 3
# 3   3 2
# 4   4 4
# 5   5 6
# 6   6 8

如果要使用样条 Stineman 插值方法,请将 option 参数更改为 splinestine

至于移动平均,我们可以使用 包中的rollapply 函数。这是一个显示窗口宽度为 3 的移动平均线的示例。

# Load package
library(zoo)

# View dat
dat
#   Day  x
# 1   1  4
# 2   2 NA
# 3   3  2
# 4   4 NA
# 5   5 NA
# 6   6  8

# Create a new column with moving average with window = 3
dat$y <- rollapply(dat$x, width = 3, FUN = function(x) mean(x, na.rm = TRUE),
                   fill = NA, align = "center")

# View dat again
dat
#   Day  x  y
# 1   1  4 NA
# 2   2 NA  3
# 3   3  2  2
# 4   4 NA  2
# 5   5 NA  8
# 6   6  8 NA

# Filling NA in x based on y
dat$x <- ifelse(is.na(dat$x), dat$y, dat$x)
# Remove y
dat$y <- NULL

# View dat again
# dat
#   Day x
# 1   1 4
# 2   2 3
# 3   3 2
# 4   4 2
# 5   5 8
# 6   6 8

数据

dat <- read.table(text = "Day  x
1    4
                  2    NA
                  3    2
                  4    NA
                  5    NA
                  6    8",
                  header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    R 中,另一个选项是na.approx 来自zoo

    library(zoo)
    df1$x <- na.approx(df1$x)
    df1$x
    #[1] 4 3 2 4 6 8
    

    【讨论】:

    • 感谢您的回答。一些更高级的方法呢? (即 Arima、移动平均线等)
    • @mac 您可以签入forecast 包。对于移动平均线,可以使用来自imputeTSna.ma,即na.ma(df1$x)
    • zoo 包还有大约六种其他 na.* 函数。也是。 na.spline 使用季节性卡尔曼滤波器进行 NA 填充,na.StructTS 使用季节性卡尔曼滤波器进行 NA 填充。
    【解决方案3】:

    在 numpy 中有简单的插值 numpy.interp()

    如果 x 有 nan 值,我会使用代码,例如:

    xnan = numpy.isnan(x)  
    x_interpolated = numpy.interp(Day, Day[~xnan], x[~xnan])
    

    在您的第二组数字中,Days 是 1、2、2,... 也许它们应该与第一组相同。

    听听如何(有效地)计算移动平均线会很有趣,是否有一些函数可以解决这个问题?

    【讨论】:

    • 感谢您的回答。我也会对移动平均线感兴趣
    • 还有一个讨论,比较有效的方法是使用 cumsums 的差异,像这样: N=6, Xadd = np.ones((N-1))*X[0 ], X = np.concatenate((Xadd, X)), Xsum = np.cumsum(X, axis=0), Xfilt = Xsum[N:] - Xsum[:-N]。同样的想法也适用于多维数组。抱歉,所有内容都在一个段落中...
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2014-07-06
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多