7.2.2. Data management#

This section shows how to use these methods for data management:

We will use this sample kinematic acquisition of 39 bilateral markers with 1092 samples recorded at 50 Hz during tennis serve:

import kineticstoolkit.lab as ktk
import matplotlib.pyplot as plt

markers = ktk.read_c3d(ktk.doc.download("kinematics_tennis_serve.c3d"))[
    "Points"
]

7.2.2.1. Adding data#

The TimeSeries loaded above has many markers, which makes lots of data to visualize and process:

markers.plot()
UserWarning [/Users/felix/Documents/git/kineticstoolkit_doc/src/kineticstoolkit/timeseries.py:4364] Only 40 of 156 lines have been plotted. Increase max_lines to plot more lines.
_images/c4455d96e4588ce92ff922a090989799ee8aa904c0a088a99b73d443d40ace44.png

To keep only the data we need, it is often practical to make a copy of the TimeSeries with no data, and selectively add the data we need using ktk.TimeSeries.add_data:

# Copy the TimeSeries without its data
selected_markers = markers.copy(copy_data=False)

# Add the markers to this new TimeSeries
for key in ["Derrick:C7", "Derrick:T10", "Derrick:STRN", "Derrick:CLAV"]:
    selected_markers = selected_markers.add_data(key, markers.data[key])

selected_markers.plot()
_images/698c4549a27636cfe4cf9b563419221da3b9cfa9e8ed6d1598ff1f03d504c60e.png

7.2.2.2. Removing data#

We could do the same by removing the superfluous data from the TimeSeries, using ktk.TimeSeries.remove_data:

# Copy the whole TimeSeries, with all data
selected_markers = markers.copy()

# Delete the unwanted markers from this new TimeSeries
for key in markers.data:
    if key not in ["Derrick:C7", "Derrick:T10", "Derrick:STRN", "Derrick:CLAV"]:
        selected_markers = selected_markers.remove_data(key)

selected_markers.plot()
_images/290870f23bdd7cc7c4f2d4d12842dde2ba8784e5f7e9a8233bda7a75004c3b17.png

7.2.2.3. Subsetting#

As a shortcut method, we can also use ktk.TimeSeries.get_subset, which returns a TimeSeries with only a selection of data keys:

selected_markers = markers.get_subset(
    [
        "Derrick:C7",
        "Derrick:T10",
        "Derrick:STRN",
        "Derrick:CLAV",
    ],
)

selected_markers.plot()
_images/698c4549a27636cfe4cf9b563419221da3b9cfa9e8ed6d1598ff1f03d504c60e.png

7.2.2.4. Renaming data#

Use the ktk.TimeSeries.rename_data to change the name of a data key:

selected_markers = selected_markers.rename_data("Derrick:C7", "C7")
selected_markers = selected_markers.rename_data("Derrick:T10", "T10")
selected_markers = selected_markers.rename_data("Derrick:STRN", "Sternum")
selected_markers = selected_markers.rename_data("Derrick:CLAV", "Clavicular")

selected_markers.plot()
_images/8ecfd5aa7c1ce802e6d86c78d57beb1330dae9a6fb06d50df558cdd5e6bf24a7.png

7.2.2.5. Merging data#

Let say we have two different TimeSeries, one for the left lower limb and one for the right one:

left_lower_limb = markers.get_subset(
    [
        "Derrick:LANK",
        "Derrick:LHEE",
        "Derrick:LKNE",
        "Derrick:LTOE",
    ]
)

right_lower_limb = markers.get_subset(
    [
        "Derrick:RANK",
        "Derrick:RHEE",
        "Derrick:RKNE",
        "Derrick:RTOE",
    ]
)

plt.subplot(1,2,1)
left_lower_limb.plot(legend=False)
plt.subplot(1,2,2)
right_lower_limb.plot(legend=False)
_images/37381f4b3c197a30cfebdab57d6d333ac63486c14c927a159ce179457f86dab1.png

To merge these TimeSeries, we could simply use the ktk.TimeSeries.add_data method as we did above:

merged = left_lower_limb.copy()

for key in right_lower_limb.data:
    merged = merged.add_data(key, right_lower_limb.data[key])

merged.plot(legend=False)
_images/2dc118cdb30567bde37a7b6c5132659cd2072a76014ad0bfced65e52da3a0d8f.png

As a shortcut method, we can also use ktk.TimeSeries.merge:

merged = left_lower_limb.merge(right_lower_limb)

merged.plot(legend=False)
_images/2dc118cdb30567bde37a7b6c5132659cd2072a76014ad0bfced65e52da3a0d8f.png

Using ktk.TimeSeries.merge has several other benefits, such as merging events, information, and even resample TimeSeries that may have been recorded at different sampling rates.