/ / Як побудувати гістограму часових інтервалів за допомогою панди? - панди

Як розподілити гістограму з часовими інтервалами за допомогою панд? - панд

З огляду на фрейми даних інтервалів ("час початку" та "час закінчення"), який би був ефективний спосіб генерувати гістограму, яка показує для кожної часової точки Т, скільки інтервалів "активні" в ній?

Код для створення вибіркового фрейму даних (вибачте, я впевнений, що для цього є кращий спосіб):

from random import randint

intervals = []

for i in range(50):
start = randint(0,50)
intervals.append({"start":start, "end":start+randint(0,50)})

intervals_df = pd.DataFrame(intervals)

Приклад:

Для наступного фрейму даних:

import pandas as pd
pd.DataFrame([{"start":2,"end":5},{"start":3,"end":8},{"start":9,"end":10},{"start":4,"end":5}])

Графік відповідності буде подібний до:

введіть опис зображення тут

Моя інтуїція полягає в тому, що тимчасові проміжки потрібно якось порушувати, щоб дискретизувати значення, щоб їх можна було поповнити, але як?

Відповіді:

3 для відповіді № 1

Ви могли б використовувати apply щоб потім створити значення для кожного діапазону melt переформатувати дані у довгу форму.

In [113]: expanded = df.apply(lambda row: pd.Series(np.arange(row["start"], row["end"] + 1)), axis=1)

In [114]: expanded
Out[114]:
0   1   2   3   4   5
0  2   3   4   5 NaN NaN
1  3   4   5   6   7   8
2  9  10 NaN NaN NaN NaN
3  4   5 NaN NaN NaN NaN

In [115]: expanded = pd.melt(expanded)["value"].dropna()

In [116]: expanded
Out[116]:
0      2
1      3
2      9
3      4
4      3
5      4
6     10
7      5
8      4
9      5
12     5
13     6
17     7
21     8
Name: value, dtype: float64

Звідти ви можете використовувати вбудований графік гістограми чи інший вид бінінгу.

In [117]: expanded.hist()

істор


1 для відповіді № 2

відповідь Крісба - чудова, але причина, чому вимати проміжок між 5 і 6, тому що за замовчуванням кількість бункерів за замовчуванням становить 10. Це означає, що у вашому випадку бункери віддалені на 0,8, тому розрив фактично становить від 5,2 до 6.

Спосіб протидії цьому - встановити вручну кількість бункерів, рівну довжині ваших даних:

nb_bins = int(max(expanded) - min(expanded))
expanded.hist(bins = nb_bins)

Результат: введіть опис зображення тут 1