给定一个间隔的数据帧('开始时间'以及'结束时间'),生成一个显示每个时间点T的直方图的有效方法是多少间隔是活跃的'在它?
生成示例数据帧的代码(道歉,我相信有更好的方法可以做到这一点):
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}])
匹配图表类似于:
我的直觉是,时间间隔需要以某种方式被破坏为离散值,以便它们可以被分箱,但是如何?
答案 0 :(得分:3)
您可以使用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 :(得分:1)
chrisb的答案很好,但是你有5到6之间的差距是因为默认的默认箱数是10。这意味着在你的情况下,箱子的距离是0.8,所以差距实际上在5.2到6之间。
一种抵消这种情况的方法是手动设置的数量等于数据的长度:
nb_bins = int(max(expanded) - min(expanded))
expanded.hist(bins = nb_bins)
结果: 1