HighCharts / Javascript: пересчитывать ежемесячные ряды данных в ежеквартальные / годовые?

#javascript #highcharts #time-series #momentjs #resampling

#javascript #highcharts #временные ряды #momentjs #Повторная выборка

Вопрос:

В приложении React, которое использует Highcharts для построения диаграммы с использованием месячных данных, как мы можем пересчитать ежемесячные данные в квартальные или годовые данные, а затем отобразить их с помощью Highcharts?

Если Highcharts не предоставляет функцию повторной выборки, при необходимости решение может использовать другие библиотеки JS, такие как Moment.js . Однако Highcharts не следует заменять другой библиотекой диаграмм, такой как Highstocks.

Заранее благодарю!

Исходные месячные данные:

 const monthlyData = [[946702800000,261],[949381200000,251],[951886800000,282],[954565200000,289],[957153600000,259],[959832000000,259],[962424000000,256],[965102400000,264],[967780800000,289],[970372800000,291],[973054800000,254],[975646800000,275],[978325200000,250],[981003600000,254],[983422800000,227],[986101200000,262],[988689600000,248],[991368000000,237],[993960000000,257],[996638400000,250],[999316800000,239],[1001908800000,253],[1004590800000,235],[1007182800000,259],[1009861200000,259],[1012539600000,264],[1014958800000,243],[1017637200000,240],[1020225600000,214],[1022904000000,238],[1025496000000,251],[1028174400000,255],[1030852800000,259],[1033444800000,248],[1036126800000,260],[1038718800000,268],[1041397200000,246],[1044075600000,259],[1046494800000,264],[1049173200000,273]]
 

введите описание изображения здесь

Минимальный воспроизводимый код

 export function Chart({ data }) {

    const options = {
        title: { text: 'Time series data' },
        xAxis: { type: 'datetime' },
    }
    options.series = [{
        name: 'foo',
        type: 'line',
        data: [[946702800000,261],[949381200000,251],[951886800000,282],[954565200000,289],[957153600000,259],[959832000000,259],[962424000000,256],[965102400000,264],[967780800000,289],[970372800000,291],[973054800000,254],[975646800000,275],[978325200000,250],[981003600000,254],[983422800000,227],[986101200000,262],[988689600000,248],[991368000000,237],[993960000000,257],[996638400000,250],[999316800000,239],[1001908800000,253],[1004590800000,235],[1007182800000,259],[1009861200000,259],[1012539600000,264],[1014958800000,243],[1017637200000,240],[1020225600000,214],[1022904000000,238],[1025496000000,251],[1028174400000,255],[1030852800000,259],[1033444800000,248],[1036126800000,260],[1038718800000,268],[1041397200000,246],[1044075600000,259],[1046494800000,264],[1049173200000,273]],
    }]

    return (
        <HighchartsReact
            highcharts={Highcharts}
            options={options}
        />
    )
}
 

Комментарии:

1. Привет @Nyxynyx, у вас другой набор данных для квартального / годового периода или его следует рассчитывать на основе ежемесячных данных?

2. @ppotaczek Ежеквартальные / годовые данные должны быть рассчитаны / агрегированы / пересчитаны на основе исходных месячных данных. Спасибо за разъяснение!

Ответ №1:

Вам нужно рассчитать квартальные и годовые данные вручную. Ниже вы можете найти простой пример того, как вы можете сделать это в React. Я использовал isSameQuarter isSameYear методы и из date-fns библиотеки.

 function Chart() {
  const [options, setOptions] = useState({...});

  const getProcessedData = (method) => {
    const processedData = [];
    const monthlyData = getData();

    monthlyData.forEach((el, index) => {
      if (
        index === 0 ||
        !method(new Date(el[0]), new Date(monthlyData[index - 1][0]))
      ) {
        processedData.push(el);
      } else {
        processedData[processedData.length - 1][1]  = el[1];
      }
    });

    return processedData;
  };

  const yearlyData = useMemo(() => getProcessedData(isSameYear), []);
  const quarterlyData = useMemo(() => getProcessedData(isSameQuarter), []);

  const setData = (period) => {
    const processedData =
      period === "month"
        ? getData()
        : period === "year"
        ? yearlyData
        : quarterlyData;

    setOptions({
      series: [{
        data: processedData
      }]
    });
  };

  return (
    <>
      <HighchartsReact highcharts={Highcharts} options={options} />
      <button onClick={() => setData("month")}>Monthly Data</button>
      <button onClick={() => setData("quarter")}>Quarterly Data</button>
      <button onClick={() => setData("year")}>Yearly Data</button>
    </>
  );
}
 

Живая демонстрация: https://codesandbox.io/s/highcharts-react-demo-forked-w6g6b?file=/demo.jsx

Документы:

https://date-fns.org/v2.17.0/docs/isSameQuarter

https://date-fns.org/v2.17.0/docs/isSameYear