delta = delta[delta["frame"] == 1]
// Restore the original frame column (replacing delta frame).
del delta["frame"]
delta.reset_index("particle", drop=True, inplace=True)
delta.reset_index("frame", drop=False, inplace=True)
dx = delta.groupby("frame").mean()
if smoothing > 0:
dx = pd.rolling_mean(dx, smoothing, min_periods=0)
After Change
f_sort = traj.sort_values(["particle", "frame"])
// Compute the difference list of positions, particle, and frame columns.
f_diff = f_sort[list(pos_columns) + ["particle", "frame"]].diff()
// Rename the frame column and insert the original frame column back in.
f_diff.rename(columns={"frame": "frame_diff"}, inplace=True)
f_diff["frame"] = f_sort["frame"]
// Compute the per frame averages. Keep only deltas of the same particle,
// and between frames that are consecutive, and of the same particle.
mask = (f_diff["particle"] == 0) & (f_diff["frame_diff"] == 1)
dx = f_diff.loc[mask, pos_columns + ["frame"]].groupby("frame").mean()
if smoothing > 0:
dx = pd.rolling_mean(dx, smoothing, min_periods=0)
return dx.cumsum()