Обнаружение пиков (чтобы найти расстояние между двумя пиками) из диаграммы, построенной в c # из файла данных CSV - PullRequest
0 голосов
/ 09 октября 2019

Я использую c # visual studio 2019 для построения линейного графика из файла CSV, и я получаю несколько пиков. Я хочу обнаружить эти пики и узнать расстояние между ними. Ниже приведен код, который я использую для построения графиков. Я хотел бы добавить в код инкрементную функцию для определения максимальных пиков и определения расстояния между ними.

Спасибо за внимание

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Drawing;


namespace GraphDemo
{
    class Plot
    {
        public Plot(Read rr, ComboBox xBox, ComboBox yBox, Chart chart)
        {
            int indX = xBox.SelectedIndex;
            int indY = yBox.SelectedIndex;
            float[,] data = rr.get_Data();
            int nLines = rr.get_nLines();

            chart.Series.Clear(); //ensure that the chart is empty
            chart.Series.Add("Series0");
            chart.Series[0].ChartType = SeriesChartType.Line;

            chart.Legends.Clear();
            for (int j = 0; j < nLines; j++)
            {
                chart.Series[0].Points.AddXY(data[j, indX], data[j, indY]);
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Я думаю, что суть проблемы в том, «Как вы определяете« пик »?»

Эмануэле предполагает, что любая точка выше, чем точки по обе стороны от нее, но в типичной зубчатой ​​акцииГрафик рынка, который может быть практически любой другой точкой. Большинство гор имеют маленькие скалы каждые несколько футов (или дюймов), которые выше, чем их окружение, но не считаются пиком.

Вы можете применить функцию сглаживания, пересчитывая каждую точку как среднее значение для несколькихуказывает на обе стороны - и затем искать пики. Тогда проблема в том, сколько сглаживания вам нужно.

Или вы можете решить, что пик считается только в том случае, если между ними есть минимум. Опять же, вам нужно решить, что это за значение;это на 10% меньше или ниже среднего или что-то еще?

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

По сути, обнаружение пиков - это нечеткое сопоставление паттернов, которое люди делают, не задумываясь, но действительно сложно описать, чтомы на самом деле имеем в виду.

0 голосов
/ 09 октября 2019

Вы можете реализовать это с помощью метода, предложенного Эмануэле. Просто определите словарь для хранения «пиковых» значений.

chart1.Titles.Add("Line Chart");

chart1.ChartAreas[0].Axes[0].MajorGrid.Enabled = false;
chart1.ChartAreas[0].Axes[1].MajorGrid.Enabled = false;

List<string> brand = new List<string>() { "a", "b", "c", "d", "e", "f", "g" };
List<int> price = new List<int>() { 1, 3, 2, 4, 1, 5, 7 };

chart1.Series.Clear();
chart1.Series.Add("Price");

chart1.Series["Price"].Points.DataBindXY(brand, price);
chart1.Series[0].ChartType = SeriesChartType.Line;
Dictionary<string, int> peak = new Dictionary<string, int>();
// Exclude the first and last point
for (int i = 1; i < price.Count - 1; i++)
{
    if (price[i] > price[i + 1] && price[i] > price[i + 1])
    {
        // save x,y value and index
        peak.Add(brand[i] + price[i], i);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...