Построить гистограмму для ряда частот - PullRequest
1 голос
/ 20 сентября 2019

У меня много разных панд. Серия выглядит следующим образом:

my_series:
0.0         10490405.0
1.0          3334931.0
2.0          2770406.0
3.0          2286555.0
4.0          1998229.0
5.0          1636747.0
6.0          1449938.0
7.0          1180900.0
8.0          1054964.0
9.0           869783.0
10.0          773747.0
11.0          653608.0
12.0          595688.0
...
682603.0           1.0
734265.0           1.0
783295.0           1.0
868135.0           1.0

Это частоты моих данных: это означает, что в моих данных 10490405 нулей, 3334931 из 1 и т. Д. Я хочупостроение гистограммыЯ знаю, что могу сделать это, используя plt.bar:

plt.bar(my_series.index, my_series.values)

Но он работает плохо из-за большого количества уникальных значений в my_series (это может быть тысячи!).Так что бары на участке слишком узкие и стали невидимыми!Поэтому я действительно хочу использовать hist для ручной установки количества бинов и т. Д. Но я не могу использовать my_series.hist (), потому что у него нет такого количества нулей, как у него только одно значение для нулевой метки!


код для воспроизведения проблемы:

val = np.round([1000000/el**2 for el in range(1,1000)])
ind = [el*10+np.random.randint(10) for el in range(1,1000)]
my_series = pd.Series(val, ind)

plt.bar(my_series.index, my_series.values)

enter image description here


Поскольку у меня уже есть закрытое голосованиеи неправильный ответ, я получил описание моей проблемы действительно плохо.Я хочу добавить пример:

val1 = [100, 50, 25, 10, 10, 10]
ind1 =  [0, 1, 2, 3, 4, 5]
my_series1 = pd.Series(val1, ind1)
my_series.hist()

enter image description here

Это просто history () для значений ряда!Итак, мы можем видеть, что 10 имеет значение 3 (потому что их три в ряду), а все остальные имеют значение 1 в истории.Что я хочу получить:

enter image description here

0 метка имеет значение 100, 1 метка имеет значение 50 и т. Д.

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Вы можете группировать по index значениям и графику:

# change bins as needed
bins = np.linspace(my_series.index[0], my_series.index[-1], 25)

my_series.groupby(pd.cut(my_series.index, bins)).sum().plot.bar()

# your data is very skewed, so log scale helps.
plt.yscale('log');

вывод:

enter image description here

0 голосов
/ 20 сентября 2019

Я нашел еще одно неэффективное решение :), но оно выглядело так, как я хотел, поэтому:

func = lambda x,y: x*y
all_data = list(map(func, [[el] for el in my_series.index], [int(el) for el in my_series.values]))
merged = list(itertools.chain(*all_data))

plt.hist(merged, bins=6)
plt.show()

enter image description here

Идея здесь такова:

  1. упаковать все индексы в списки: [[el] for el in my_series.index]
  2. преобразовать число в целое число: [int(el) for el in my_series.values]
  3. теперь мы можем умножить его и восстановить полные данные: list(map(func, ...))
  4. теперь у нас есть все данные и мы можем использовать hist().

Это явно неэффективно, но в моей задаче мне нужно вычислить множество различных параметров как mean, std и т. Д. Поэтому мне нужно написать для них функцию как рассчитать.Поэтому я нашел более быстрый способ - просто восстановить данные и затем использовать встроенные функции.

0 голосов
/ 20 сентября 2019

Взято из https://matplotlib.org/3.1.1/gallery/statistics/hist.html:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import colors
from matplotlib.ticker import PercentFormatter

# Fixing random state for reproducibility
np.random.seed(19680801)

N_points = 100000
n_bins = 20

# Generate a normal distribution, center at x=0 and y=5
x = np.random.randn(N_points)
y = .4 * x + np.random.randn(100000) + 5

fig, axs = plt.subplots(1, 2, sharey=True, tight_layout=True)

# We can set the number of bins with the `bins` kwarg
axs[0].hist(x, bins=n_bins)
axs[1].hist(y, bins=n_bins)

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

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