我有一个数据集,其中包含一段记录时间内发生的事情的起始时间(比如几秒)。例如:
#each tuple includes (start, stop) of the event happening
data = [(0, 1), (5,8), (14,21), (29,30)]
我想量化这件事在我想要的任何尺寸的箱子里发生的时间百分比。例如,如果我想要每个5秒的箱子,我想要一个函数:
我在第一点上遇到了麻烦。
理想情况下,它看起来像这样,其中bin_times是我需要帮助写入的函数,输出是函数返回的内容:
data = [(0, 1), (5,8), (15,21), (29,30)]
bin_times(data, bin_size=5, total_length=40)
>> [20, 60, 0, 100, 20, 20, 0, 0]
答案 0 :(得分:1)
如果你不介意使用numpy
,这是一个策略:
import numpy as np
def bin_times(data, bin_size, total_length):
times = np.zeros(total_length, dtype=np.bool)
for start, stop in data:
times[start:stop] = True
binned = 100 * np.average(times.reshape(-1, bin_size), axis=1)
return binned.tolist()
data = [(0, 1), (5,8), (15,21), (29,30)]
bin_times(data, 5, 40)
// => [20.0, 60.0, 0.0, 100.0, 20.0, 20.0, 0.0, 0.0]
为了解释bin_times()
的逻辑,让我使用一个较小的例子:
data = [(0, 1), (3, 8)]
bin_times(data, 3, 9)
// => [33.3, 100.0, 66.6]
times
数组编码您的事件是否在每个单位时间间隔内发生。首先将每个条目设置为False
:
[False, False, False, False, False, False, False, False, False]
阅读传入的data
并将相应的条目转为True
:
[True, False, False, True, True, True, True, True, False]
将其重塑为二维矩阵,其中行的长度为bin_size
:
[[True, False, False],
[True, True, True],
[True, True, False]]
取每行的平均值:
[0.333, 1.000, 0.666]
乘以100将这些数字转换为百分比:
[33.3, 100.0, 66.6]
要隐藏函数使用者numpy
的使用,请使用.tolist()
方法将生成的numpy
数组转换为普通的Python列表。
有一点需要注意:bin_size
需要均匀划分total_length
- 否则重塑会抛出ValueError
。