我正在开展一个项目,旨在展示良好形式和不良形式的练习之间的区别。为此,我们使用基于腕部的加速度计收集了加速度数据。 上图显示了2套健身锻炼(卧推)。每组有10次重复。下面的图片显示了10个重复的1组。我有一个原始数据集,由10组执行器组成。我想要做的是将原始数据分成10个部分,其中包含上图中2条黑线之间的部分,这样我就可以轻松地分析数据。我的主管给了我一个起点,即在每组中选择切点。他说采取一个切点,发现第一个中断时间在此之前的3秒开始切割并计入10并完成切割。
这个想法我不知道如何申请。至少,如果你能告诉我如何根据切割点切割数据帧,我会很高兴。
答案 0 :(得分: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(图像上的蓝色)。
我使用自相关函数来检测周期性部分,在上图中,每个峰代表一组执行。使用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分钟。有一些滞后但是最好的我发现的解决方案就是这个。