Используйте pandas для преобразования csv в json для построения двух рядов вместо одного в старшем графике - PullRequest
0 голосов
/ 13 января 2019

Проблема состоит в том, чтобы показать две серии, для скорректированного максимума и скорректированного минимума, на графике High-Stocks старших графиков, подобном следующему, который показывает только одну серию:

Highstock chart with one series for adjusted high

Ссылки на похожие вопросы Хайстока и JSFiddle:

https://forum.highcharts.com/viewtopic.php?f=12&t=40964&p=142595&hilit=multiple+series#p142595

https://jsfiddle.net/BlackLabel/xqgv2b4k/

Ниже приведены мои рабочие файлы, использованные для построения приведенного выше графика.

sample.csv (вход)

DATE,ADJ_HIGH,ADJ_LOW
2018-04-27,164.33,160.630
2018-04-30,167.26,161.840
2018-05-01,169.20,165.270
2018-05-02,177.75,173.800
2018-05-03,177.50,174.441

csv_to_json_testing.py

import numpy as np
import pandas as pd

input_file = 'sample.csv'

df = pd.read_csv(input_file, usecols=[0,1,2], parse_dates=['DATE'], date_parser = pd.to_datetime) #  keep_default_na = False

with open('overflow.txt', 'w') as f:
    df['DATE'] = df['DATE'].values.astype(np.int64) // 10 ** 6
    print(file=f)
    print('DATE, ADJ_HIGH (json)', file=f)
    print(file=f)
    print(df[['DATE','ADJ_HIGH']].tail(5).to_json(orient='values'), file=f)
    print(file=f)
    print('DATE, ADJ_LOW (json)', file=f)
    print(file=f)
    print(df[['DATE','ADJ_LOW']].tail(5).to_json(orient='values'), file=f)
    print(file=f)
    print('DATE, ADJ_HIGH, ADJ_LOW (json)', file=f)
    print(file=f)
    print(df[['DATE','ADJ_HIGH','ADJ_LOW']].tail(5).to_json(orient='values'), file=f)

overflow.txt (вывод)

DATE, ADJ_HIGH (json)

[[1524787200000,164.33],[1525046400000,167.26],[1525132800000,169.2],[1525219200000,177.75],[1525305600000,177.5]]

DATE, ADJ_LOW (json)

[[1524787200000,160.63],[1525046400000,161.84],[1525132800000,165.27],[1525219200000,173.8],[1525305600000,174.441]]

DATE, ADJ_HIGH, ADJ_LOW (json)

[[1524787200000,164.33,160.63],[1525046400000,167.26,161.84],[1525132800000,169.2,165.27],[1525219200000,177.75,173.8],[1525305600000,177.5,174.441]]

sample.json (DATE, ADJ_HIGH)

[[1524787200000,164.33],[1525046400000,167.26],[1525132800000,169.2],[1525219200000,177.75],[1525305600000,177.5]]

highstock_test.html

<html>
  <head>
    <title>
      Chart
    </title>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script src="https://code.highcharts.com/stock/highstock.js"></script>
    <script src="https://code.highcharts.com/stock/modules/exporting.js"></script>
    <script src="https://code.highcharts.com/stock/modules/export-data.js"></script>
    <script type="text/javascript">
    $.getJSON('sample.json', function (data) {
    // Create the chart
    Highcharts.stockChart('container', {

        rangeSelector: {
            selected: 1
        },

        title: {
            text: 'XYZ Stock Price'
        },

        series: [{
            name: 'XYZ',
            data: data,
            tooltip: {
                valueDecimals: 2
            }
        }]
    });
});
    </script>
  </head>
  <body>
    <div id="container" style="width: 400px; height: 350px; margin: 0 auto"></div>
  </body>
</html>

Когда я сохраняю sample.json и highstock_test.html в папке, а затем открываю html-файл в браузере, я получаю приведенный выше график high -tock для одной серии. Моя задача состоит в том, чтобы правильно заполнить и отформатировать sample.json данными DATE, ADJ_HIGH и ADJ_LOW, а также отредактировать highstock_test.html, чтобы график правильно отображал две серии вместо одной. Хотелось бы использовать метод, который проще всего понять, и который также может быть адаптирован для обслуживания диаграмм из колбы.

1 Ответ

0 голосов
/ 14 января 2019

Для отображения двух серий необходимо создать два объекта конфигурации серии:

Highcharts.stockChart('container', {
    series: [{
        data: data1
    }, {
        data: data2
    }]
});

Если вы хотите использовать две отдельные данные JSON, вам нужно будет только назначить правильные значения: http://jsfiddle.net/BlackLabel/fho6na5r/,, но чтобы использовать только одно, вам нужно преобразовать его в структуру данных, требуемую Highcharts:

var data = [
        [1524787200000, 164.33, 160.63],
        [1525046400000, 167.26, 161.84],
        [1525132800000, 169.2, 165.27],
        [1525219200000, 177.75, 173.8],
        [1525305600000, 177.5, 174.441]
    ],
    dataS1 = [],
    dataS2 = [];

data.forEach(function(el) {
    dataS1.push([el[0], el[1]]);
    dataS2.push([el[0], el[2]]);
});

Highcharts.stockChart('container', {
    series: [{
        data: dataS1
    }, {
        data: dataS2
    }]
});

Демонстрационная версия: http://jsfiddle.net/BlackLabel/gv7mph8x/6/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...