Пользовательский ввод гистограммы для очень большого набора данных - PullRequest
0 голосов
/ 16 июня 2020

У меня есть вариант использования для создания более значимой гистограммы, чем гистограммы по умолчанию.

У меня есть elasticsearch в качестве хранилища данных, где хранятся все мои числовые данные. поле цен с очень разными значениями. большая часть цен в диапазоне от 100 до 999 сосредоточена в районе 399-500, от 501 до 999 немного, затем снова от 999 до 1299 огромный диапазон и т. д.

пример:

 399-500: 1542
 501-999: 7501
 1000-1299: 10214
 1299-2000: 154
 ...

При создании гистограммы с размером сегмента 200 только 2 из 8 имеют 75% высоты полосы, другие очень малы.

Если я выбрал небольшой размер сегмента, тогда диаграмма станет тяжелой для рендеринга с 1000 + ведра.

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

Я хочу сделать интеллектуальное сегментирование, в котором я могу разделить большие сегменты на небольшие диапазоны say of 50-70 и заодно объединить маленькие ведра в одно большое say of 1000. чтобы диаграммы были более значимыми.

Существует ли код python для такого варианта использования.

Отредактировано:

Из-за двух всплесков я не могу визуализировать плоские области, чтобы показать фактические вариации, и я не могу показать распределение мощности в пиках, чтобы сказать, что диапазон цен, скажем, от 449 до 499 является наиболее значимым в пике от 399 до 500

1 Ответ

0 голосов
/ 16 июня 2020

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

Почему бы вам вместо этого не использовать обычный график, чтобы показать результат? Вот простой код для этого, например:

import numpy as np
import matplotlib.pyplot as plt


data_1 = np.random.normal(450, 50, 1542)
data_2 = np.random.normal(700, 200, 7501)
data_3 = np.random.normal(1150, 150, 10214)
data_4 = np.random.normal(1650, 350, 154)

data = np.concatenate((data_1, data_2, data_3, data_4))

nr_of_samples = len(data)
nr_of_bins = 1000
offset = min(data)
range = max(data) - min(data)

bins = np.zeros(nr_of_bins)

for d in data:
    bin_index = int(((d-offset)/range)*nr_of_bins)-1
    bins[bin_index] += 1

plt.plot(np.linspace(min(data), max(data), nr_of_bins), bins)
plt.xlabel("Value")
plt.ylabel(f"Nr of values, binwidth = {round(range/nr_of_bins,2)}")
plt.show()

Получение следующего конечного результата: enter image description here

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