Java.Lang.Double []为Double []从CSV发出多项式

时间:2016-02-24 14:34:13

标签: java arrays csv double

首先感谢你的帮助。

我正在编写投资算法,目前正在预处理CSV历史数据。这部分过程的最终目标是创建一个2k x 2k / 2(200万)个条目的对称协方差矩阵。

我正在编写的Java类带有一个CSV文件夹,每个文件夹有8位信息,关键的是Date,Time&开盘价。日期&时间已经合并到一个'秒'三角洲'时间测量和开放股票价格保持不变。输出CSV包含上述两条信息,还带有文件名索引,供以后引用。

为了创建协方差矩阵,纽约证券交易所的每只股票必须每次都有价格值,如果缺少价值,则矩阵无法正确完成。由于历史训练CSV中的时间条目之间存在差异,我必须使用多项式函数来估计遗漏值,然后可以将其输入链中的下一个过程。

我的问题听起来相当简单,应该很容易克服(我可能是一个大笨蛋)。我正在使用的多项式包有两个双精度数组(Double [] x,Double [] y)。 X属于特定股票的“秒过去delta”时间值的数组,Y是相应的价格。当我尝试提供这些时,我得到一个类型错误,因为我实际上想要输入的是'java.lang.Double'对象。任何人都可以帮助我将后者的数组转换为前者的数组吗?

我发现在主要的印刷声明之后有一种荒谬的感觉,这些只是我修补试图奇迹般地改变类型。

再次感谢您的时间,我期待您的回复!

请找到以下相关方法:

public void main(String filePath) throws IOException {

    String index = filePath;
    index = index.replace("/Users/louislimon/Desktop/Invest Algorithm/Data/Samples US Stock Data/data-1/5 min/us/nyse stocks/1/", "");
    index = index.replace(".us.txt", "");

    File fout = new File("/Users/louislimon/Desktop/Invest Algorithm/Data.csv");
    FileOutputStream fos = new FileOutputStream(fout);
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));


    Reader in = new FileReader(filePath);

    Iterable<CSVRecord> records;

    try {

        records = CSVFormat.EXCEL.withSkipHeaderRecord(true).parse(in);

    } catch ( IOException ex ) {
        System.out.println ( "[ERROR] " + ex );
        return;
    }

    ZoneId zoneId = ZoneId.of("America/New_York");

    boolean tmp = true;

    Instant firstInstant = null; // Track the baseline against which we calculate the increasing time


    ArrayList<Double> timeVals = new ArrayList<Double>();
    ArrayList<Double> priceVals = new ArrayList<Double>();

    for ( CSVRecord record : records ) {

        if(tmp){
            tmp = false;
        }
        else {
            //System.out.println(record.toString());

            String dateInput = record.get(0);
            String timeInput = record.get(1);
            Double price = Double.parseDouble(record.get(2));

            LocalDate date = LocalDate.parse(dateInput);
            LocalTime time = LocalTime.parse(timeInput);
            //Double price = Double.parseDouble(priceInput);

            LocalDateTime ldt = LocalDateTime.of(date, time);

            ZonedDateTime zdt = ldt.atZone(zoneId);

            Instant instant = zdt.toInstant();  // Use Instant (moment on the timeline in UTC) for data storage, exchange, serialization, database, etc.
            if (null == firstInstant) {
                firstInstant = instant;  // Capture the first instant.
            }

            Duration duration = Duration.between(firstInstant, instant);
            Long deltaInSeconds = duration.getSeconds();

            double doubleDeltaInSeconds = deltaInSeconds.doubleValue();

            timeVals.add(doubleDeltaInSeconds);
            priceVals.add(price);

            //System.out.println("deltaInSeconds: " + deltaInSeconds + " | price: " + price + " | index: " + index);
        }


        Double [] timeValsArray = timeVals.toArray(new Double[timeVals.size()]);
        Double [] priceValsArray = timeVals.toArray(new Double[priceVals.size()]);


        Double[] timeFeed = new Double[timeVals.size()];
        Double[] priceFeed = new Double[priceVals.size()];

        for(int x = 0;x<timeVals.size(); x++) {
            timeFeed[x] = new Double (timeValsArray[x].doubleValue());
            priceFeed[x] = new Double (priceValsArray[x]);
        }

       PolynomialFunctionLagrangeForm pflf =  new PolynomialFunctionLagrangeForm(timeFeed,priceFeed);
    }

1 个答案:

答案 0 :(得分:1)

根据the documentationPolynomialFunctionLagrangeForm构造函数需要两个double[]数组,而不是Double[]

因此,您需要创建一个原始数组并传递:

...
double[] timeFeed = new double[timeVals.size()];
double[] priceFeed = new double[priceVals.size()];

for(int x = 0; x < timeVals.size(); x++) {
    timeFeed[x] = timeValsArray[x].doubleValue();
    priceFeed[x] = priceValsArray[x].doubleValue();
}
...

另请参阅How to convert an ArrayList containing Integers to primitive int array?了解将ArrayList<T>(其中T是基本类型的包装器)转换为相应原始数组T[]的其他方法。

请注意,您的代码中也存在拼写错误:

 Double [] priceValsArray = timeVals.toArray(new Double[priceVals.size()]);

需要

 Double [] priceValsArray = priceVals.toArray(new Double[priceVals.size()]);