如何进行时间序列简单预测?

10

我有一组时间序列单变量数据,只包含时间戳和数值。现在我想要对接下来的一天/一个月/一年进行外推(预测)这个数值。我知道有一些方法例如Box-jenkins (ARIMA)等。

Spark有线性回归算法,我试过了,但是效果不太令人满意。有没有人在Spark中尝试过简单的时间序列预测,并可以分享他们的实现方法呢?

附注:我在用户邮件列表中查找了这个问题,几乎所有关于这个问题的提问都没有得到回答。


你可以详细说明一下“Spark有线性回归,我尝试过了,但是结果并不令人满意”的情况——包括Spark算法的链接、你已经尝试过的方法以及结果,并注明哪些方面没有达到你的期望。 - Jacek Laskowski
请查看此代码片段。欢迎在那里留下评论,我已经添加了数据和算法 https://gist.github.com/codeAshu/2ebd84b1b48834fce89b - rusty
我也看了这个问题,但是 "partitionBy" 给我报错。[https://dev59.com/vGAg5IYBdhLWcg3wm776] - rusty
1个回答

2

是的,我已经在Spark中应用了ARIMA进行单变量时间序列分析。

public static void main(String args[])
{
    System.setProperty("hadoop.home.dir", "C:/winutils");  

     SparkSession spark = SparkSession
              .builder().master("local")
              .appName("Spark-TS Example")
              .config("spark.sql.warehouse.dir", "file:///C:/Users/abc/Downloads/Spark/sparkdemo/spark-warehouse/")
              .getOrCreate();

    Dataset<String> lines = spark.read().textFile("C:/Users/abc/Downloads/thunderbird/Time series/trainingvector_arima.csv");

    Dataset<Double> doubleDataset = lines.map(line>Double.parseDouble(line.toString()),
            Encoders.DOUBLE());

    List<Double> doubleList = doubleDataset.collectAsList();
    //scala.collection.immutable.List<Object> scalaList = new

    Double[] doubleArray = new Double[doubleList.size()];
    doubleArray = doubleList.toArray(doubleArray);

    double[] values = new double[doubleArray.length];
    for(int i = 0; i< doubleArray.length; i++)
    { 
        values[i] = doubleArray[i];
    }

    Vector tsvector = Vectors.dense(values);

    System.out.println("Ts vector:" + tsvector.toString());

    //ARIMAModel arimamodel = ARIMA.fitModel(1, 0, 1, tsvector, true, "css-bobyqa", null);
    ARIMAModel arimamodel = ARIMA.autoFit(tsvector, 1, 1, 1);

    Vector forcst = arimamodel.forecast(tsvector, 10);

    System.out.println("forecast of next 10 observations: " + forcst);
   }

这段代码对我来说可行。您需要预测的任何值都可以作为输入数据传递。


值在哪里? - Waqas

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