【问题标题】:How to split dataframe according to intersection point in Python?如何根据Python中的交点分割数据框?
【发布时间】:2016-08-03 10:03:04
【问题描述】:

我正在做一个项目,旨在显示练习的好形式和坏形式之间的区别。为此,我们使用基于手腕的加速度计收集了加速度数据。 上图显示了 2 组健身动作(卧推)。每组有10次重复。下图显示了 1 组的 10 次重复。我有一个原始数据集,其中包含 10 组执行。我想要做的是将原始数据分成 10 个部分,其中将包含上图中 2 条黑线之间的部分,以便我可以轻松地分析数据。我的主管给了我一个起点,即在每组中选择切点。他说取一个切割点,找到第一个中断时间,在该时间前3秒开始切割,数到10,完成切割。

这是一个我不知道如何应用的想法。至少,如果你能告诉我如何根据切割点切割数据框,我会很高兴。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    嗯,我找到了另一种方法来检测我的加速度计数据的周期性部分。所以,这是我的代码:

    import numpy as np
    from peakdetect import peakdetect
    import datetime as dt
    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    from matplotlib import style
    from pandas import DataFrame as df
    style.use('ggplot')
    
    
    def get_periodic(path):
        periodics = []
        data_frame = df.from_csv(path)
        data_frame.columns = ['z', 'y', 'x']
        if path.__contains__('1'):
            if path.__contains__('bench'):
                bench_press_1_week = data_frame.between_time('11:24', '11:52')
                peak_indexes = get_peaks(bench_press_1_week.y, lookahead=3000)
                for i in range(0, len(peak_indexes)):
                    time_indexes = bench_press_1_week.index.tolist()
                    start_time = time_indexes[0]
                    periodic_start = start_time.to_datetime() + dt.timedelta(0, peak_indexes[i] / 100)
                    periodic_end = periodic_start + dt.timedelta(0, 60)
                    periodic = bench_press_1_week.between_time(periodic_start.time(), periodic_end.time())
                    periodics.append(periodic)
        return periodics
    
    
    def get_peaks(data, lookahead):
        peak_indexes = []
        correlation = np.correlate(data, data, mode='full')
        realcorr = correlation[correlation.size / 2:]
        maxpeaks, minpeaks = peakdetect(realcorr, lookahead=lookahead)
        for i in range(0, len(maxpeaks)):
            peak_indexes.append(maxpeaks[i][0])
    
        return peak_indexes
    
    
    def show_segment_plot(data, periodic_area, exercise_name):
        plt.figure(8)
        gs = gridspec.GridSpec(7, 2)
        ax = plt.subplot(gs[:2, :])
        plt.title(exercise_name)
        ax.plot(data)
        k = 0
        for i in range(2, 7):
            for j in range(0, 2):
                ax = plt.subplot(gs[i, j])
                title = "{} {}".format(k + 1, ".Set")
                plt.title(title)
                ax.plot(periodic_area[k])
                k = k + 1
        plt.show()
    

    首先,this 问题为我的问题提供了另一个视角。下图显示了 10 组卧推的原始加速度计数据。这里它有 3 个轴(x,y,z),它的主轴是 y(图像上的蓝色)。

    我使用自相关函数来检测周期性部分, 在上图中,每个峰值代表一组执行。通过this峰值检测算法,我找到了每个峰值的x轴值,

    In[196]: maxpeaks
    Out[196]: 
    
     [[16204, 32910.14013671875],
      [32281, 28726.95849609375],
      [48515, 24583.898681640625],
      [64436, 22088.130859375],
      [80335, 19582.248291015625],
      [96699, 16436.567626953125],
      [113081, 12100.027587890625],
      [129027, 8098.98486328125],
      [145184, 5387.788818359375]]
    

    基本上,每个 x 值代表样本。我的采样频率是 100Hz,所以 16204/100 = 162,04 秒。为了找到周期性部分的时间,我在开始时间中添加了 162.04 秒。每个卧推大约需要 1 分钟,在这个例子中,练习的开始时间是 11:24,第一个周期部分的开始时间是 11:26,结束时间是 1 分钟后。 有一些滞后,但最好的解决方案是我发现是这个。

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多