Как показать N значени в окне шириной М?
От: Holms США  
Дата: 20.10.10 21:24
Оценка:
Есть масив значений

double[] _values = new double[N] {...} ;


Как правильно нарисовать гистограмму исходя из этих значений в окне шириной М пикселей (N != M).

Проблемы возникают когда N > M.
Надо получить масив длиною М, что-бы по одному пикселю на значение, и при этом сохранить кривизну исходного масива.
Как правильно усреднить значения из _values?

в идеале должна получится функция

List<double> CreateWindowedArray(IEnumerable<double> values, int valuesCount, int windowWidth)
{
    List<double> res = new List<double>();
    ... // do here the math
    
    if (valuesCount > windowWidth)
    {
        Debug.Assert(res.Count == windowWidth);
    }
    
    return res;
}


Спасибо
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
The life is relative and reversible.
Re: Как показать N значени в окне шириной М?
От: andy1618 Россия  
Дата: 21.10.10 01:21
Оценка:
Здравствуйте, Holms, Вы писали:

H>Как правильно нарисовать гистограмму исходя из этих значений в окне шириной М пикселей (N != M).

H>Проблемы возникают когда N > M.

В финансовом анализе, где очень важно знать пиковые значения котировок, при агрегации данных по временнОму интервалу используют "Open-High-Low-Close" диаграммы.
Конкретные реализации можно посмотреть в Excel (подгруппа "Биржевые диаграммы").

Но, поскольку в нашем случае вряд ли важны значения "открытия" и "закрытия", то можно вместо этого вычислять "среднее арифметическое" и как-то его помечать, например, подкрашенным пикселем.
Re[2]: Как показать N значени в окне шириной М?
От: Holms США  
Дата: 21.10.10 05:21
Оценка:
Здравствуйте, andy1618, Вы писали:


A>В финансовом анализе, где очень важно знать пиковые значения котировок, при агрегации данных по временнОму интервалу используют "Open-High-Low-Close" диаграммы.

здесь я работаю, что такое OHLC вроде знаю немного


A>Но, поскольку в нашем случае вряд ли важны значения "открытия" и "закрытия", то можно вместо этого вычислять "среднее арифметическое" и как-то его помечать, например, подкрашенным пикселем.

так в этом и проблема как правильно сгрупировать N/M в одну запись. Думал использовать SMA indicator, но он плохо подходит.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
The life is relative and reversible.
Re: Как показать N значени в окне шириной М?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 21.10.10 07:12
Оценка:
Здравствуйте, Holms, Вы писали:

H>Как правильно нарисовать гистограмму исходя из этих значений в окне шириной М пикселей (N != M).


Douglas-Pecker algorithm?
Re: Как показать N значени в окне шириной М?
От: ootync  
Дата: 21.10.10 12:35
Оценка:
H>Проблемы возникают когда N > M.

Для каждого пикселя окна (диапазон 0..M) линейно перевычисляем его координаты в (0..N). Получится дробное число, попадающее между двумя "столбцами" массива. Например, 3.23.
Округлим вниз, и вверх: это столбцы 3 и 4. Складываем их с коэфициентами: (0.23 * data[3] + (1-0.23)*data[4]). Вуаля!

Если окно очень уж маленькое — нужно ещё прикинуть как влить в эту формулу ещё несколько соседних столбцов, чтоб не было "отбрасываний"

H>Спасибо
Re[3]: Как показать N значени в окне шириной М?
От: andy1618 Россия  
Дата: 26.10.10 08:01
Оценка:
Здравствуйте, Holms, Вы писали:

H>здесь я работаю, что такое OHLC вроде знаю немного




A>>Но, поскольку в нашем случае вряд ли важны значения "открытия" и "закрытия", то можно вместо этого вычислять "среднее арифметическое" и как-то его помечать, например, подкрашенным пикселем.

H>так в этом и проблема как правильно сгрупировать N/M в одну запись.

Дык вроде особых проблем не должно быть: идём по горизонтальными пикселям (1 to M) и для каждого пикселя m вычисляем диапазон индексов n1..n2 попадающих в него исходных элементов (формула должна быть несложной). По этому диапазону вычисляем min, max, average и отображаем на графике.
Можно ещё, конечно, пытаться аппроксимировать крайние элементы, как предложили ниже, но ИМХО это сильно на графике не скажется. Хотя, это может помочь в случае, когда N < M и данные придётся растягивать по пикселям.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.