найти строку Math.min - PullRequest
       7

найти строку Math.min

0 голосов
/ 27 января 2020

Я уже нашел самое низкое значение в столбце в CSV-файле, но я не могу найти, в какой строке хранится это значение. Может кто-то мне помочь, пожалуйста? В любом случае я могу найти ответ сам, хотя я гуглил в течение многих дней и сайтов. Заранее спасибо.

function getDataPointsFromCSV(csv) {
            var dataPoints = csvLines =   [];   
            var mini, a
            var minIndex = 0
            csvLines = csv.split(/[\r?\n|\r|\n]+/);
            for (var i = 1; i <= csvLines.length; i++)
                if (csvLines[i] > 0) {
                    points = csvLines[i].split(",");
//points instead of csvLines
                    mini = points[4]
                }
            var a = mini                
            for (var i = 1; i <= csvLines.length; i++)
                if (csvLines[i] < mini) {
                    points = csvLines[i].split(",");                    

                    minIndex = i
                    mini = csvLines[i]                                      
// Find lowest value in a column5(=points[4])( but how to find the row that store the lowest value, can someone help me please?)                
                    lowestv = Math.min(price, lowestv)
             }
// example; mini.length          
            for (var i = mini.length; i <= mini.length+10; i++)
                if (csvLines[i].length > 0) {
                    points = csvLines[i].split(",");
                    price = points[4]
            }
                dataPoints.push({x: new Date(),y: parseFloat(minIndex)});   
        return dataPoints;
        }

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Я бы разбил это на два шага. Сначала мы анализируем CSV, чтобы получить массив объектов. Затем мы перебираем их, чтобы найти статистику, такую ​​как minVal и minRow (и любые другие, которые нам могут понадобиться.) Хотя это немного менее эффективно, чем делать это за один проход, это приводит к более простому, более поддерживаемому коду.

Итак, у нас есть csv2arr, который преобразует вашу CSV-строку в объекты, которые выглядят следующим образом:

{
    date: "31/10/2019",
    open: 9202.457589,
    high: 9383.160892,
    low: 9028.71744,
    close: 9199.584833
}

и stats, который принимает массив таких объектов для поиска такой статистики как maxVal и minRow для каждого столбца. Мы могли бы улучшить это, чтобы найти другие характеристики, такие как mean и median при желании. Его вывод выглядит так:

{
    date: { /* ... */ },
    open: { /* ... */ },
    high: { /* ... */ },
    low: { /* ... */ },
    close: {
        minVal: 9199.584833,
        maxVal: 9427.687584,
        minRow: {date: "31/10/2019", open: 9202.457589, high: 9383.160892, low: 9028.71744, close: 9199.584833},
        maxRow: {date: "29/10/2019", open: 9248.440562, high: 9516.181048, low: 9232.648086, close: 9427.687584}
    }
}

Это один из способов сделать это:

// Naive, but useful for some data
const csv2arr = (csv) => {
  const [headers, ...rows] = csv .trim () .split ('\n') .map (r => r .split (','))
  return rows .reduce ((a, r) => [
    ... a, 
    Object .assign (... (r .map ((c, i) => ({[headers [i]]: isNaN(c) ? c : Number(c)}))))
  ], [])
}

const stats = (rows) => rows .reduce (
  (stats, row) => Object .assign (
    ... Object .entries (row) .map (([key, val]) => ({[key]: ({
      minVal: key in stats && stats [key] .minVal < val ? stats [key] .minVal : val,
      maxVal: key in stats && stats [key] .maxVal > val ? stats [key] .maxVal : val,
      minRow: key in stats && stats [key] .minRow [key] < val ? stats [key] .minRow : row,
      maxRow: key in stats && stats [key] .maxRow [key] > val ? stats [key] .maxRow : row,
    })}))
  ),
  {}
)

const csv = `
date,open,high,low,close
31/10/2019,9202.457589,9383.160892,9028.71744,9199.584833
30/10/2019,9422.463325,9426.874217,9085.370357,9205.726559
29/10/2019,9248.440562,9516.181048,9232.648086,9427.687584
28/10/2019,9565.101883,9805.118089,9256.148389,9256.148389
`

const rows = csv2arr (csv)
const statistics = stats (rows)

console .log (rows)
console .log (statistics)

Обратите внимание, что минимальные / максимальные значения для дат здесь не имеют большого смысла. Если бы они были в формате ISO (например, «2019-10-31»), то эти значения также получили бы значимые максимумы и минимумы.

csv2arr полезно для достаточно широкого диапазона случаев. Но не принимайте это за полный анализатор CSV. Например, если ваши данные содержат ячейки с запятыми, произойдет сбой. Это также наивно о выходе. По сути, если оно выглядит как число, оно становится числом, даже если другие вещи в столбце не совпадают. Есть и другие проблемы. Но это все еще полезно для многих форматов, разделенных запятыми.

0 голосов
/ 27 января 2020

Я предоставляю фрагмент, который использует примеры данных в вашем комментарии:

const csv = "date,open,high,low,close\n31/10/2019,9202.457589,9383.160892,9028.71744,9199.584833\n30/10/2019,9422.463325,9426.874217,9085.370357,9205.726559\n29/10/2019,9248.440562,9516.181048,9232.648086,9427.687584\n28/10/2019,9565.101883,9805.118089,9256.148389,9256.148389"
const lines = csv.split(/[\r?\n|\r|\n]+/)
const header = lines.shift().split(',') // chop off header, and store it in a variable
const cells = lines.map(e => e.split(',').map(n => !isNaN(n) ? Number(n) : n))

// transpose the array, so it's easier to get min/max
// transposing (rows become columns and columns become rows)
// [[a, b],[c, d]] ==> [[a, c], [b, d]]
const transpose = cells[0].map((e, i) => {
  return cells.map(el => {
    return el[i]
  })
})
const dates = transpose.shift() // chop off dates, and store them in a variable

const rowRange = transpose.map((e, i) => {
  const min = Math.min(...e)
  const max = Math.max(...e)
  return {
    col: i + 1, // +1, because dates are chopped off
    colName: header[i + 1],
    max,
    maxRow: e.indexOf(max) + 1, // +1, because header is chopped off
    maxRowDate: dates[e.indexOf(max)],
    min,
    minRow: e.indexOf(min) + 1, // +1, because header is chopped off
    minRowDate: dates[e.indexOf(min)]
  }
})

console.log("result:", rowRange)

Я добавил мин И макс (и пару других свойств), чтобы вы могли использовать его в других случаях.

ВАЖНОЕ ПРИМЕЧАНИЕ

Это решение изменяет массив, проанализированный из CSV.

...