Ahead (Prognoza serii temporale cu cuantificarea incertitudinii) devine mult mai rapid de instalat: majoritatea dependențelor sunt acum opționale

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Dacă ai folosit ahead înainte, poate vă amintiți install.packages("ahead")
sau pip install ahead durează ceva timp, deoarece a târât în ​​două duzini de pachete de modelare în față, indiferent de care ați plănuit să îl utilizați. Asta e rezolvat acum.

Problema: dependența unei singure funcții, timpul de instalare al tuturor

ahead acceptă o mulțime de metode de prognoză și fiecare se poate baza pe un pachet de modelare diferit: forecast, randomForest, e1071, glmnet,
gam, quantreg, vars, fGarch, VineCopula, mboost, ranger,
ForecastComb. Din punct de vedere istoric, cele mai multe dintre acestea au fost simple Imports
în DESCRIPTIONceea ce înseamnă că R se instalează toate dintre ele înainte de a putea încărca pachetul – indiferent dacă intenționați să le utilizați ahead::dynrmf cu o pădure la întâmplare sau ahead::ridge2f pentru un model multivariat cu niciuna dintre cele de mai sus.

Remedierea: (aproape) totul devine un Sugestie

Noul DESCRIPTION păstrează doar ceea ce are nevoie codul de bază al pachetului la momentul încărcării:

Imports:
    Rcpp (>= 1.0.6),
    foreach,
    tseries
Depends: R (>= 3.5.0)
Suggests:
    caret, cclust, dfoptim, doSNOW, doParallel, knitr, rmarkdown,
    testthat, fpp2, glmnet, e1071, gam, quantreg, randomForest,
    spatial, vars, roxygen2, ForecastComb, ranger, mboost, misc,
    Mcomp, fGarch, VineCopula, forecast (>= 8.0),
    ggplot2 (>= 3.0.0), randtoolbox (>= 1.17), simulatetimeseries

Orice altceva – randomForest, e1071, forecast, glmnet, vars,
fGarch, VineCopulaiar restul — mutat la Suggests. Asta înseamnă că R se instalează în câteva secunde, pentru că Rcpp, foreachși tseries sunt singurele cerințe grele.

Instalarea piesei lipsă, exact când aveți nevoie

Mutarea pachetelor în Suggests ajută doar dacă pachetul încă funcționează fără probleme atunci când apelați de fapt o funcție care are nevoie de una dintre ele. Asta este un mic ajutor intern, check_suggested()se ocupă de:

check_suggested <- function(pkg, ask = interactive()) {
  if (requireNamespace(pkg, quietly = TRUE)) {
    return(invisible(TRUE))
  }
  do_install <- TRUE
  if (ask) {
    do_install <- utils::askYesNo(
      sprintf("Package '%s' is required but not installed. Install it now?", pkg)
    )
    do_install <- isTRUE(do_install)
  }
  if (do_install) {
    utils::install.packages(
      pkg,
      repos = c("https://techtonique.r-universe.dev", "https://cloud.r-project.org")
    )
  }
  if (!requireNamespace(pkg, quietly = TRUE)) {
    stop(
      sprintf(
        "Package '%s' is required. Install it with install.packages('%s', repos = c('https://techtonique.r-universe.dev', 'https://cloud.r-project.org')).",
        pkg, pkg
      ),
      call. = FALSE
    )
  }
  invisible(TRUE)
}

Fiecare funcție (sperăm că toate!) care se bazează pe un pachet sugerat apelează acum
check_suggested("that_package") primul. În practică, aceasta înseamnă:

  • Dacă pachetul este deja instalat, nimic nu se schimbă – nicio solicitare, nicio întârziere.
  • Dacă lipsește și vă aflați într-o sesiune interactivă, veți fi întrebat înainte ca ceva să fie instalat în numele dvs.
  • Dacă lipsește și sesiunea nu este interactivă (un script, un job CI), se instalează automat.
  • Dacă instalarea eșuează în continuare, veți obține o eroare clară cu comanda exactă de rulat, care indică atât depozitul CRAN, cât și cel Techtonique – r-universe – util deoarece câteva dintre aceste dependențe (cum ar fi ForecastComb şi
    misc) nu sunt deloc pe CRAN.

Aşa install.packages("ahead") este rapid și prima dată când suni
dynrmf(..., fit_func = randomForest::randomForest), randomForest este instalat pentru tine, o dată, și niciodată după aceea.

Aceeași idee, dusă în ambalajul Python

aheadPachetul Python al lui este un înveliș în jurul pachetului R (prin rpy2), deci primul apel către orice prognozator a instalat întotdeauna dependențe pe partea R la cerere – acesta este comentariul „s-ar putea să dureze ceva timp, dar NUMAI prima dată când se numește” pe care îl veți vedea lângă DynamicRegressor sau Ridge2Regressor
în exemple. Odată cu instalarea proprie a pachetului R acum slabă, acea supraîncălcare a primului apel din partea Python se micșorează și: este mai puțin de făcut înainte
check_suggested() ajunge chiar la pachetul de care are nevoie metoda aleasă.

import os
import numpy as np
import pandas as pd
from ahead import DynamicRegressor, EAT
from time import time

# Forecasting horizon
h = 25

# Data frame containing the time series
df = pd.read_csv("https://raw.githubusercontent.com/Techtonique/datasets/refs/heads/main/time_series/univariate/AirPassengers.csv").set_index('date')
df.index = pd.DatetimeIndex(df.index)
print(df)

# univariate ts forecasting
print("Example 1 -----")
d1 = DynamicRegressor(h=h, date_formatting="ms")
print(d1.__module__)

start = time()
d1.forecast(df)
print(f"Elapsed: {time()-start} n")
print("averages: n")
print(d1.averages_)
print("n")
print("ranges: n")
print(d1.ranges_)
print("n")

print("Example 2 -----")
d2 = DynamicRegressor(h=h, type_pi="T", date_formatting="original")
start = time()
d2.forecast(df)
print(f"Elapsed: {time()-start} n")
print("averages: n")
print(d2.averages_)
print("n")
print("ranges: n")
print(d2.ranges_)
print("n")

d2.plot()

Primul apel la DynamicRegressor.forecast() într-un mediu proaspăt este cel care plătește costul unic (acum mult mai mic) al instalării R
ahead pachet; fiecare apel după aceea — inclusiv d2 mai sus, în aceeași sesiune — rulează la viteză maximă.

De ce contează acest lucru în practică

  • Construiri CI și Docker mai rapide — nu compilați gam, fGarch,
    VineCopulași încă o duzină doar pentru a rula câteva teste unitare care folosesc două dintre ele.
  • Instalări mai puțin fragile — un pachet de modelare lent de compilat sau dificil de construit nu mai stă între tine și o persoană care lucrează ahead instalați dacă nici măcar nu aveți nevoie de această metodă.
  • Amprentă mai mică pentru metodele pe care le utilizați de fapt — doar dacă suni vreodată ridge2fnu instalați deloc dependențele GARCH sau bazate pe copula.

Dacă doriți ca totul să fie disponibil dinainte (de exemplu, pentru a pregăti un mediu offline), puteți încă instala singur fiecare pachet sugerat:

install.packages(
  c("caret", "cclust", "dfoptim", "doSNOW", "doParallel", "fpp2",
    "glmnet", "e1071", "gam", "quantreg", "randomForest", "spatial",
    "vars", "ranger", "mboost", "Mcomp", "fGarch", "VineCopula",
    "forecast", "ggplot2", "randtoolbox", "simulatetimeseries"),
  repos = c("https://techtonique.r-universe.dev", "https://cloud.r-project.org")
)

Ia-l

  • R: vezi README pentru configurarea repo Techtonique, versiunea 0.38.1.
  • Piton: pip install ahead --verbosede la ahead_python.

Ca întotdeauna, problemele și contribuțiile sunt binevenite la ambele repo.

imagine-titlu-aici

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.