pos_columns = ["x", "y"]
// the groupby...diff works only if the trajectory Dataframe is sorted along frame
// I do here a copy because a "inplace=True" would sort the original "traj" which is perhaps unwanted/unexpected
traj = pandas_sort(traj, "frame")
// Probe by particle, take the difference between frames.
delta = traj.groupby("particle", sort=False).apply(lambda x :
x.set_index("frame", drop=False).diff())
// Keep only deltas between frames that are consecutive.
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
// 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()