Не удается перебрать столбцы CSV - PullRequest
0 голосов
/ 23 сентября 2018

Я строю скрининг склада, который применяет вычисления для каждого столбца файла CSV.Однако, когда я запускаю цикл for, я получаю только один результат.

    String path = "C:/Users/0/Desktop/Git/Finance/Data/NQ100.csv";
    Reader buf = Files.newBufferedReader(Paths.get(path));
    CSVParser parsed = new CSVParser(buf, CSVFormat.DEFAULT.withFirstRecordAsHeader()
            .withIgnoreHeaderCase().withTrim());

    // Parse tickers
    Map<String, Integer> header = parsed.getHeaderMap();
    List<String> tickerList = new ArrayList<>(header.keySet());

    for (int x=1; x < tickerList.size(); x++) { <----------------------- PROBLEM

        // Accessing closing price by Header names
        List<Double> closeList = new ArrayList<>();
        for (CSVRecord record : parsed) {
            String stringClose = record.get(x);
            Double close = Double.valueOf(stringClose);
            closeList.add(close);
        }

        // Percentage Change
        List<Double> pctList = new ArrayList<>();
        for (int i=1; i < closeList.size(); i++) {
            Double pct = closeList.get(i) / closeList.get(i-1) - 1;
            pctList.add(pct);
        }

        // Statistics
        Double sum = 0.0, var = 0.0, mean, sd, rfr, sr;
        // Mean
        for (Double num : pctList) sum += num;
        mean = sum/pctList.size();
        // Standard Deviation
        for (Double num: pctList) var += Math.pow(num - mean, 2);
        sd = Math.sqrt(var/pctList.size());
        // Risk Free Rate
        rfr = Math.pow((1+0.03),(1/252.0))-1;
        // Sharpe Ratio
        sr = Math.sqrt(252) * ((mean-rfr)/sd);

        System.out.println(tickerList.get(x) + " " + sr);
    }

Мои данные выглядят так:

,AAL,AAPL,ADBE
2007-10-25,26.311651,23.141403,47.200001
2007-10-26,26.273216,23.384495,47.0
2007-10-29,26.004248,23.43387,47.0

Итак, я ожидал:

AAL XXX
AAPL XXX
ADBE XXX

Но я получил только:

AAL 0.3604941921663456

Буду благодарен, если вы, ребята, поможете мне найти проблему!

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Вы можете перебирать Iterable в Java только один раз, в вашем случае CSVParser parsed реализует Iterable<CSVRecord>.

Таким образом, вы перебираете его только в первый раз, когда вырассчитать статистику для AAL , при анализе данных для AAPL и ADBE она будет обрабатываться как пустая.

Вы можете обработать это с помощьювведение списка вспомогательных функций с помощью parsed, добавление следующего кода (это, конечно, однострочное решение, например, в Java 8, но эта опция будет работать и для более ранних версий) перед циклом for:

    List<CSVRecord> records = new ArrayList<>();
    for (CSVRecord record : parsed) {
        records.add(record);
    }

И измените следующую строку:

for (CSVRecord record : records) {

на:

for (CSVRecord record : parsed) {

Для предоставленного вами CSV у вас будет следующий вывод:

AAL -21.583101145880306
AAPL 23.417753561072438
ADBE -16.75343297000953
0 голосов
/ 23 сентября 2018

Итак, вот блок кода, который работает для меня, если я понимаю ваш вопрос, вы хотите только «прочитать» каждый столбец и строку из файла CSV, надеюсь, поможет.

        br = new BufferedReader(new InputStreamReader(new FileInputStream(archivo), "UTF8"));
        while ((line = br.readLine()) != null) {                
            if(a!=0){
                String[] datos = line.split(cvsSplitBy);
                System.out.println(datos[0] + " - " + datos[1] + " - " + datos[2]);
            }
            a++;
        }         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...