每次我骑自行车的时候,我都会一秒一秒地收集一些指标的数据。为了简单起见,让我们假设我有一个csv文件,它看起来像:
secs, watts,
1,150
2,151
3,149
4,135
.
.
.
7000,160
所以,我的每一秒都有一个相关的功率值,单位是瓦特。你知道吗
我想知道“如果我把我的车分成N个街区,哪个街区的平均功率最高?”你知道吗
我使用熊猫数据框来管理我的数据,这是我用来回答问题的代码:
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]
告诉我,在给定的间歇时间内,我最强大的力量是从我训练的第二秒开始的。你知道吗
问题是,如果我将“interval\u length”设置为任何大于30的值,那么这个计算将花费永远的时间(即:在一台像样的机器上超过两分钟)。请帮我找到我的代码遇到瓶颈的地方,这似乎应该快得多。你知道吗
下面是一个使用
DataFrame.rolling
的纯熊猫解决方案。它比@BenBoulderite的numpy卷积方法稍微慢一点,但这是一个方便的习惯用法:需要
.shift()
来对齐滚动平均值,以便结果与滚动窗口的左边对齐,而不是默认的右边(docs on DataFrame.rolling)。你知道吗如果将数据放入numpy数组,例如
watts
,则可以使用卷积计算平均功率:正如您在the reference of np.convolve中看到的,这个函数计算第一个参数的局部平均值,并用第二个参数定义的窗口进行平滑处理。在这里,我们使用一个“顶帽”函数来平滑,即“开/关”函数,它在长度
interval_length
的间隔上是常数,否则为零。这只是初步的估计。你知道吗那么你最努力的时候是:
相关问题 更多 >
编程相关推荐