俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

时间序列分析工具箱——timetk

翻译自《Demo Week: Tidy Time Series Analysis with tibbletime》

原文链接:www.business-science.io/code-tools/2017/10/26/demo_week_tibbletime.html

注意:由于软件包的版本变化,部分代码被修改,文字有删减

STEP 3:构建未来数据

使用 tk_index() 来扩展索引。

# Retrieves the timestamp informationbeer_sales_idx <- beer_sales_tbl %>%    tk_index()tail(beer_sales_idx)

## [1] "2016-07-01" "2016-08-01" "2016-09-01" "2016-10-01" "2016-11-01"## [6] "2016-12-01"

通过 tk_make_future_timeseries 函数从现有索引构造未来索引。函数会在内部检查索引的周期性,并返回正确的序列。我们在 whole vignette on how to make future time series 介绍了该主题更详尽的内容。

# Make future indexfuture_idx <- beer_sales_idx %>%    tk_make_future_timeseries(        n_future = 12)future_idx

##  [1] "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01" "2017-05-01"##  [6] "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01"## [11] "2017-11-01" "2017-12-01"

tk_get_timeseries_signature() 将未来索引转换成时间序列签名数据框。

new_data_tbl <- future_idx %>%    tk_get_timeseries_signature()new_data_tbl

## # A tibble: 12 x 29##         index  index.num    diff  year year.iso  half quarter month##        <date>      <int>   <int> <int>    <int> <int>   <int> <int>##  1 2017-01-01 1483228800      NA  2017     2016     1       1     1##  2 2017-02-01 1485907200 2678400  2017     2017     1       1     2##  3 2017-03-01 1488326400 2419200  2017     2017     1       1     3##  4 2017-04-01 1491004800 2678400  2017     2017     1       2     4##  5 2017-05-01 1493596800 2592000  2017     2017     1       2     5##  6 2017-06-01 1496275200 2678400  2017     2017     1       2     6##  7 2017-07-01 1498867200 2592000  2017     2017     2       3     7##  8 2017-08-01 1501545600 2678400  2017     2017     2       3     8##  9 2017-09-01 1504224000 2678400  2017     2017     2       3     9## 10 2017-10-01 1506816000 2592000  2017     2017     2       4    10## 11 2017-11-01 1509494400 2678400  2017     2017     2       4    11## 12 2017-12-01 1512086400 2592000  2017     2017     2       4    12## # ... with 21 more variables: month.xts <int>, month.lbl <ord>,## #   day <int>, hour <int>, minute <int>, second <int>, hour12 <int>,## #   am.pm <int>, wday <int>, wday.xts <int>, wday.lbl <ord>,## #   mday <int>, qday <int>, yday <int>, mweek <int>, week <int>,## #   week.iso <int>, week2 <int>, week3 <int>, week4 <int>,## #   mday7 <int>

时间序列分析工具箱——tibbletime

俄罗斯贵宾会 1

STEP 1:扩充时间序列签名

tk_augment_timeseries_signature() 函数将时间戳信息逐列扩展到机器学习特征集中,并将时间序列信息列添加到初始数据表。

# Augment (adds data frame columns)beer_sales_tbl_aug <- beer_sales_tbl %>%    tk_augment_timeseries_signature()beer_sales_tbl_aug

## # A tibble: 84 x 30##          date price  index.num    diff  year year.iso  half quarter##        <date> <int>      <int>   <int> <int>    <int> <int>   <int>##  1 2010-01-01  6558 1262304000      NA  2010     2009     1       1##  2 2010-02-01  7481 1264982400 2678400  2010     2010     1       1##  3 2010-03-01  9475 1267401600 2419200  2010     2010     1       1##  4 2010-04-01  9424 1270080000 2678400  2010     2010     1       2##  5 2010-05-01  9351 1272672000 2592000  2010     2010     1       2##  6 2010-06-01 10552 1275350400 2678400  2010     2010     1       2##  7 2010-07-01  9077 1277942400 2592000  2010     2010     2       3##  8 2010-08-01  9273 1280620800 2678400  2010     2010     2       3##  9 2010-09-01  9420 1283299200 2678400  2010     2010     2       3## 10 2010-10-01  9413 1285891200 2592000  2010     2010     2       4## # ... with 74 more rows, and 22 more variables: month <int>,## #   month.xts <int>, month.lbl <ord>, day <int>, hour <int>,## #   minute <int>, second <int>, hour12 <int>, am.pm <int>,## #   wday <int>, wday.xts <int>, wday.lbl <ord>, mday <int>,## #   qday <int>, yday <int>, mweek <int>, week <int>, week.iso <int>,## #   week2 <int>, week3 <int>, week4 <int>, mday7 <int>

时间序列函数

让我们看看可以用新的 tbl_time 对象做些什么。

PART 2:转换

  • 问题:R 中不同类型的时间序列数据难以方便一致地实现相互转换。
  • 解决方案tk_tbltk_xtstk_zootk_ts

as_period

函数 as_period() 可以改变 tbl_time 对象的周期。与传统方法相比,使用此方法有两个优点:

  1. 函数标记非常灵活:yearly == y == 1 y
  2. 函数标记提供了无数周期转换的可能,例如:
    • 15 d:以 15 天为一周期
    • 2 m:以 2 月为一周期
    • 4 m:以 4 月为一周期
    • 6 m:以半年为一周期

首先,让我们做一个简单的月度周期性变化。

# Convert from daily to monthly periodicity
FANG_tbl_time_d %>%
    as_period(period = "month") %>%
    # Plotting
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    labs(
        title = "Periodicity Change from Daily to Monthly") +
    geom_point()

俄罗斯贵宾会 2

让我们提升一个档次。那么每两个月一次呢? 只需使用函数标记 2 m 即可。

# Convert from daily to bi-monthly periodicity
FANG_tbl_time_d %>%
    as_period(period = '2 m') %>%
    # Plotting
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    labs(
        title = "Periodicity Change to Daily to Bi-Monthly",
        subtitle = "2~m") +
    geom_point()

俄罗斯贵宾会 3

让我们继续。那么每半年一次呢? 只需使用 6 m 即可。

# Convert from daily to bi-annually periodicity
FANG_tbl_time_d %>%
    as_period(period = '6 m') %>%
    # Plotting
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    labs(
        title = "Periodicity Change to Daily to Bi-Annually",
        subtitle = "6~m") +
    geom_point()

俄罗斯贵宾会 4

函数标记几乎提供了无限可能,感兴趣的话可以查看 vignette on periodicity change with tibbletime

  • 时间序列分析工具箱——timetk
    • timetk 的主要用途
    • 加载包
    • 数据
    • timetk 教程:
      • PART 1:时间序列机器学习
      • PART 2:转换

目录

目录

加载包

需要加在两个包:

  • tidyquant:用于获取数据并在后台加载 tidyverse
  • timetk:R 中用于处理时间序列的工具包

如果还没有安装过,请用下面的命令安装:

# Install packagesinstall.packagesinstall.packages("tidyquant")

加载包。

# Load librarieslibrary     # Toolkit for working with time series in Rlibrary(tidyquant)  # Loads tidyverse, financial pkgs, used to get data

初始化一个 tbl_time 对象

在我们使用这些新函数之前,我们需要创建一个 tbl_time 对象。新类的操作几乎与普通的 tibble 对象相同。然而,它会在背后自动跟踪时间信息。

使用 as_tbl_time() 函数初始化对象。指定 index = date,这告诉 tbl_time 对象要跟踪哪个索引。

# Convert to tbl_time
FANG_tbl_time_d <- FANG_tbl_d %>%
    as_tbl_time(index = date) 

我们可以打印 tbl_time 对象。看起来几乎与分组的 tibble 相同。请注意,“Index: date”通知我们“time tibble”已正确初始化。

# Show the tbl_time object we created
FANG_tbl_time_d

## # A time tibble: 3,024 x 8
## # Index:  date
## # Groups: symbol [4]
##    symbol       date  open  high   low close   volume adjusted
##     <chr>     <date> <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1     FB 2014-01-02 54.83 55.22 54.19 54.71 43195500    54.71
##  2     FB 2014-01-03 55.02 55.65 54.53 54.56 38246200    54.56
##  3     FB 2014-01-06 54.42 57.26 54.05 57.20 68852600    57.20
##  4     FB 2014-01-07 57.70 58.55 57.22 57.92 77207400    57.92
##  5     FB 2014-01-08 57.60 58.41 57.23 58.23 56682400    58.23
##  6     FB 2014-01-09 58.65 58.96 56.65 57.22 92253300    57.22
##  7     FB 2014-01-10 57.13 58.30 57.06 57.94 42449500    57.94
##  8     FB 2014-01-13 57.91 58.25 55.38 55.91 63010900    55.91
##  9     FB 2014-01-14 56.46 57.78 56.10 57.74 37503600    57.74
## 10     FB 2014-01-15 57.98 58.57 57.27 57.60 33663400    57.60
## # ... with 3,014 more rows

我们可以使用绘图函数 ggplot_facet_by_symbol() 绘制它,我们看到 tbl_time俄罗斯贵宾会, 对象与 tbl 对象的反应相同。

# Plot the tbl_time object
FANG_tbl_time_d %>%
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    labs(
        title = "Working with tbltime: Reacts same as tbl class")

俄罗斯贵宾会 5

STEP 5:比较实际值与预测值

我们可以使用 tq_get() 来检索实际数据。注意,我们没有用于比较的完整数据,但我们至少可以比较前几个月的实际值。

actuals_tbl <- tq_get(    "S4248SM144NCEN",    get = "economic.data",    from = "2017-01-01",    to = "2017-12-31")

可视化我们的预测。

# Plot Beer Sales Forecastbeer_sales_tbl %>%    ggplot(aes(x = date, y = price)) +    # Training data    geom_line(color = palette_light +    geom_point(color = palette_light +    # Predictions    geom_line(        aes(y = value),        color = palette_light()[[2]],        data = predictions_tbl) +    geom_point(        aes(y = value),        color = palette_light()[[2]],        data = predictions_tbl) +    # Actuals    geom_line(        color = palette_light()[[1]],        data = actuals_tbl) +    geom_point(        color = palette_light()[[1]],        data = actuals_tbl) +    # Aesthetics    theme_tq() +    labs(        title = "Beer Sales Forecast: Time Series Machine Learning",        subtitle = "Using basic multivariate linear regression can yield accurate results")

俄罗斯贵宾会 6

我们可以检查测试集上的错误(实际值 vs 预测值)。

# Investigate test errorerror_tbl <- left_join(    actuals_tbl, predictions_tbl) %>%    rename(        actual = price, pred = value) %>%    mutate(        error     = actual - pred,        error_pct = error / actual)         error_tbl

## # A tibble: 8 x 5##         date actual      pred     error    error_pct##       <date>  <int>     <dbl>     <dbl>        <dbl>## 1 2017-01-01   8664  9509.122 -845.1223 -0.097544127## 2 2017-02-01  10017 10909.189 -892.1891 -0.089067495## 3 2017-03-01  11960 12281.835 -321.8352 -0.026909301## 4 2017-04-01  11019 11378.678 -359.6777 -0.032641592## 5 2017-05-01  12971 13080.710 -109.7099 -0.008458092## 6 2017-06-01  14113 13583.471  529.5292  0.037520667## 7 2017-07-01  10928 11529.085 -601.0854 -0.055004156## 8 2017-08-01  12788 12984.939 -196.9386 -0.015400265

接着,我们可以做一些误差度量。预测值和实际值的 MAPE接近 4.5%,对于简单的多元线性回归模型来说是相当好的结果。更复杂的算法可以产生更精确的结果。

# Calculating test error metricstest_residuals <- error_tbl$errortest_error_pct <- error_tbl$error_pct * 100 # Percentage errorme   <- mean(test_residuals, na.rm=TRUE)rmse <- mean(test_residuals^2, na.rm=TRUE)^0.5mae  <- mean(abs(test_residuals), na.rm=TRUE)mape <- mean(abs(test_error_pct), na.rm=TRUE)mpe  <- mean(test_error_pct, na.rm=TRUE)tibble(me, rmse, mae, mape, mpe) %>% glimpse()

## Observations: 1## Variables: 5## $ me   <dbl> -349.6286## $ rmse <dbl> 551.7818## $ mae  <dbl> 482.0109## $ mape <dbl> 4.531821## $ mpe  <dbl> -3.593805

时间序列机器学习可能产生异常预测。对这个议题感兴趣的人可以阅读我们的短文 time series forecasting using timetk。

教程:tibbletime

本教程将介绍下列函数的用法:

  • filter_time:对时间索引的过滤
  • as_period:改变数据的周期
  • rollify:将任意函数转换成为滚动函数

PART 1:时间序列机器学习

时间序列机器学习是预测时间序列数据的一种很好的方法,但在我们开始之前,这里有几个注意点:

  • 关键洞察力:将时间序列签名(时间戳信息按列扩展到特征集)用于执行机器学习。
  • 目标:我们将使用时间序列签名预测未来 12 个月的时间序列数据。

我们将遵循可用于执行时间序列机器学习的工作流程。你将看到几个 timetk 函数如何帮助完成此过程。我们将使用简单的 lm() 线性回归进行机器学习,你将看到使用时间序列签名会使机器学习更强大和准确。此外,你还应该考虑使用其他更强大的机器学习算法,例如 xgboostglmnet等。

filter_time

filter_time() 函数根据按日期简便快捷地过滤 tbl_time 对象,它使用一个函数格式(例如 'date_operator_start' ~ 'date_operator_end')。我们使用标准日期格式 YYYY-MM-DD + HH:MM:SS 指定日期运算符,但也有强大的简化标记来更有效地指定日期子集。

假设我们想要过滤出 2014-06-012014-06-15 之间的所有观察结果。我们可以使用函数标记 filter_time('2014-06-01' ~ '2014-06-15') 来完成。

# filter_time by day
FANG_tbl_time_d %>%
    filter_time('2014-06-01' ~ '2014-06-15') %>%
    # Plotting
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    geom_point() +
    labs(
        title = "Time Filter: Use functional notation to quickly subset by time",
        subtitle = "2014-06-01 ~ 2014-06-15")

俄罗斯贵宾会 7

我们可以按月完成同样的工作。假设我们只想在 2014 年 3 月进行观察。使用简化函数标记 ~ '2014-03'

# filter_time by month
FANG_tbl_time_d %>%
    filter_time(~ '2014-03') %>%
    # Plotting
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    geom_point() +
    labs(
        title = "Time Filter: Use shorthand for even easier subsetting",
        subtitle = "~ 2014-03")

俄罗斯贵宾会 8

tbl_time 对象也响应括号符号运算符——[。在这里,我们提取 2014 年所有日期的数据。

# time filter bracket [] notation
FANG_tbl_time_d[~ '2014'] %>%
    # Plotting
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    labs(
        title = "Time Filter: Bracket Notation Works Too",
        subtitle = "FANG_tbl_time_d[~ 2014]")

俄罗斯贵宾会 9

filter_time() 有许多功能和简化标记,感兴趣的读者可以查看 filter_time vignettefilter_time function documentation

timetk 的主要用途

三个主要用途:

  1. 时间序列机器学习:使用回归算法进行预测;
  2. 构造时间序列索引:基于时间模式提取、探索和扩展时间序列索引;
  3. 转换不同类型的时间序列数据(例如 tblxtszoots 之间):轻松实现不同类型的时间序列数据之间的相互转换。

我们今天将讨论时间序列机器学习和数据类型转换。第二个议题(提取和构造未来时间序列)将在时间序列机器学习中涉及,因为这对预测准确性非常关键。

本文由俄罗斯贵宾会发布于编程,转载请注明出处:时间序列分析工具箱——timetk

您可能还会对下面的文章感兴趣: