Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据间隔的查找和排序_Python_Performance_Pandas_Numpy - Fatal编程技术网

Python 数据间隔的查找和排序

Python 数据间隔的查找和排序,python,performance,pandas,numpy,Python,Performance,Pandas,Numpy,每次我骑自行车时,都会一秒一秒地收集一些指标的数据。为了简单起见,让我们假设我有一个csv文件,看起来像: secs, watts, 1,150 2,151 3,149 4,135 . . . 7000,160 所以,我的每一秒都有一个相关的功率值,单位是瓦特 我想知道“如果我把我的车分成N秒的街区,哪个街区的平均功率最高?” 我正在使用pandas数据框架来管理我的数据,这是我用来回答我的问题的代码: def bestEffort(ride_data, metric

每次我骑自行车时,都会一秒一秒地收集一些指标的数据。为了简单起见,让我们假设我有一个csv文件,看起来像:

secs, watts,
1,150
2,151
3,149
4,135
.
.
.
7000,160
所以,我的每一秒都有一个相关的功率值,单位是瓦特

我想知道“如果我把我的车分成N秒的街区,哪个街区的平均功率最高?”

我正在使用pandas数据框架来管理我的数据,这是我用来回答我的问题的代码:

def bestEffort(ride_data,
             metric='watts',
             interval_length=5,
             sort_descending=True):

seconds_in_ride = len(ride_data[metric])

average_interval_list = [[i+1, 
                          np.average(
                             [ride_data[metric][i+j] 
                               for j in range(interval_length)])
                             ] 
                           for i in range(0, 
                                            seconds_in_ride - 
                                                    interval_length)]

average_interval_list.sort(key=lambda x: x[1], reverse=sort_descending)

return average_interval_list
看起来很简单?对吗?给定一个索引,计算区间长度后续项的平均值。在表单列表中记录此信息

[[second 1, avg val of metric over the interval starting that second],
 [second 2, avg val of metric over the interval starting that second],
 [second 3, avg val of metric over the interval starting that second],
 .
 .
 .
 [second 7000-interval_length, avg val of metric over the interval starting that second]]
[second_n, avg val of metric over the interval starting in second n]
然后,我根据平均值对结果列表进行排序。所以第一个条目是表单的

[[second 1, avg val of metric over the interval starting that second],
 [second 2, avg val of metric over the interval starting that second],
 [second 3, avg val of metric over the interval starting that second],
 .
 .
 .
 [second 7000-interval_length, avg val of metric over the interval starting that second]]
[second_n, avg val of metric over the interval starting in second n]
告诉我,在给定的间歇时间内,我的最大努力是从训练的第二秒开始的


问题是,如果我将“interval_length”设置为任何大于30的值,那么这个计算将花费永远的时间(即:在一台像样的机器上超过两分钟)。请帮助我找到我的代码遇到瓶颈的地方,这似乎应该快得多。

如果您将数据放入一个numpy数组,比如
watts
,您可以使用卷积计算平均功率:

mean_power = np.convolve(watts, np.ones(interval_length)/interval_length, mode='valid')
如中所示,此函数计算第一个参数的局部平均值,并使用第二个参数定义的窗口进行平滑处理。在这里,我们使用一个“顶帽”函数进行平滑处理,即“开/关”函数,该函数在长度
间隔长度
的间隔上保持不变,否则为零。这是初步的,但给出了初步的估计

那么你最努力的时候是:

time_strongest_effort = np.argmax(mean_power)

这是一个使用
DataFrame.rolling
的纯熊猫解决方案。它比@BenBoulderite的numpy卷积方法稍微慢一点,但这是一个方便的习惯用法:

df.rolling(interval_length).mean().shift(-(interval_length - 1))
需要使用
.shift()
来对齐滚动平均值,以便将结果对齐到滚动窗口的左边缘,而不是默认的右边缘()