2016-08-03 35 views
0

我正在研究一个旨在显示锻炼的良好形式和不良形式之间差异的项目。为此,我们采用基于手腕的加速度计收集加速度数据。 enter image description here上面的图像显示了2套健身操(卧推)。每组有10个重复。下面的图片显示了10组重复10次。 enter image description here我有一套原始数据集,其中包含10套可执行文件。我想要做的是将原始数据分成10个部分,它们将包含上图中2条黑线之间的部分,以便我可以轻松分析数据。我的主管给了我一个起点,即在每组中选择分界点。他说,采取一个切点,找到第一个中断时间在3秒前开始切割,并计数到10并完成切割。如何根据Python中的交叉点拆分数据框?

这是一个我不知道如何应用的想法。至少,如果你可以告诉如何根据cutpoint来裁剪一个数据框,我会非常感兴趣。

回答

0

那么,我发现另一种方法来检测我的加速度计数据的周期性部分。所以,这里是我的代码:

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(图像上的蓝色)。 enter image description here

我用自相关函数来检测周期性部分,enter image description here在上面的图片中,每个峰值代表1组错误。与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分钟之后。 enter image description here我发现有一些滞后但是是最好的解决方案。