2016-08-03 33 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我發現有一些滯後但是是最好的解決方案。