【问题标题】:Finding and ranking intervals of data查找和排列数据区间
【发布时间】:2018-11-24 20:35:18
【问题描述】:

每次我骑自行车时,都会逐秒收集多项指标的数据。为简单起见,假设我有一个 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

看起来很简单?正确的?给定一个索引,计算 interval_length 后续条目的平均值。在表单列表中跟踪这一点

[[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_n 开始的。

问题是,如果我将“interval_length”设置为高于 30 的任何值,则此计算需要永远进行(阅读:在一台像样的机器上超过两分钟)。请帮我找出我的代码遇到瓶颈的地方,这似乎应该更快。

【问题讨论】:

    标签: python performance pandas numpy


    【解决方案1】:

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

    df.rolling(interval_length).mean().shift(-(interval_length - 1))
    

    需要.shift() 来对齐滚动平均值,以便结果与滚动窗口的左 边缘对齐,而不是默认的右边缘 (docs on DataFrame.rolling)。

    【讨论】:

      【解决方案2】:

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

      mean_power = np.convolve(watts, np.ones(interval_length)/interval_length, mode='valid')
      

      正如您在the reference of np.convolve 中所见,此函数计算第一个参数的局部平均值,并使用第二个参数定义的窗口进行平滑处理。在这里,我们使用“top-hat”函数进行平滑——即一个“开/关”函数,它在长度为interval_length 的间隔内是恒定的,否则为零。这是初步的,但给出了初步估计。

      那么你最努力的时候是:

      time_strongest_effort = np.argmax(mean_power)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        相关资源
        最近更新 更多