З огляду на фрейми даних інтервалів ("час початку" та "час закінчення"), який би був ефективний спосіб генерувати гістограму, яка показує для кожної часової точки Т, скільки інтервалів "активні" в ній?
Код для створення вибіркового фрейму даних (вибачте, я впевнений, що для цього є кращий спосіб):
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