7272 help='Threshold for hist_over.')
7373@click.option('--show_common_path_prefix', is_flag=True,
7474 help='Show common path prefix when applied to multiple files.')
75+ @click.option('--moving_average_window', type=click.IntRange(min=1),
76+ help='Transform timeseries values to moving average with window of given number of points.')
7577@click.argument('path', type=click.Path(), nargs=-1)
7678def main(print_keys, regexp_match, timeseries, hist, hist_ratio, stdev_hist, plot, stats, precision,
7779 timeseries_sum, stats_sum, begin_frame, end_frame, path,
7880 cumulative_timeseries, cumulative_timeseries_sum, frame_number_name,
7981 hist_threshold, threshold_name, threshold_value, show_common_path_prefix, stats_sort_by,
80- timeseries_delta, timeseries_delta_sum, stats_table_format):
82+ timeseries_delta, timeseries_delta_sum, stats_table_format, moving_average_window ):
8183 sources = {v: list(read_data(v)) for v in path} if path else {'stdin': list(read_data(None))}
8284 if not show_common_path_prefix and len(sources) > 1:
8385 longest_common_prefix = os.path.commonprefix(list(sources.keys()))
@@ -94,15 +96,19 @@ def matching_keys(patterns):
9496 if regexp_match:
9597 return [key for pattern in patterns for key in keys if re.search(pattern, key)]
9698 return patterns
99+ convolve = None
100+ if moving_average_window is not None:
101+ convolve = numpy.ones(moving_average_window) / float(moving_average_window)
97102 if timeseries:
98- draw_timeseries(sources=frames, keys=matching_keys(timeseries), add_sum=timeseries_sum,
103+ draw_timeseries(sources=frames, keys=matching_keys(timeseries), add_sum=timeseries_sum, convolve=convolve,
99104 begin_frame=begin_frame, end_frame=end_frame)
100105 if cumulative_timeseries:
101- draw_cumulative_timeseries(sources=frames, keys=matching_keys(cumulative_timeseries), add_sum=cumulative_timeseries_sum,
102- begin_frame=begin_frame, end_frame=end_frame)
106+ draw_cumulative_timeseries(sources=frames, keys=matching_keys(cumulative_timeseries),
107+ add_sum=cumulative_timeseries_sum, convolve=convolve, begin_frame=begin_frame,
108+ end_frame=end_frame)
103109 if timeseries_delta:
104110 draw_timeseries_delta(sources=frames, keys=matching_keys(timeseries_delta), add_sum=timeseries_delta_sum,
105- begin_frame=begin_frame, end_frame=end_frame)
111+ convolve=convolve, begin_frame=begin_frame, end_frame=end_frame)
106112 if hist:
107113 draw_hists(sources=frames, keys=matching_keys(hist))
108114 if hist_ratio:
@@ -173,45 +179,45 @@ def collect_unique_keys(sources):
173179 return sorted(result)
174180
175181
176- def draw_timeseries(sources, keys, add_sum, begin_frame, end_frame):
182+ def draw_timeseries(sources, keys, add_sum, convolve, begin_frame, end_frame):
177183 fig, ax = matplotlib.pyplot.subplots()
178184 x = numpy.array(range(begin_frame, end_frame))
179185 for name, frames in sources.items():
180186 for key in keys:
181- y = frames[key]
187+ y = maybe_convolve( frames[key], convolve)
182188 ax.plot(x[:len(y)], y, label=f'{key}:{name}')
183189 if add_sum:
184- y = sum_arrays_with_none([frames[k] for k in keys])
190+ y = sum_arrays_with_none([maybe_convolve( frames[k], convolve) for k in keys])
185191 ax.plot(x[:len(y)], y, label=f'sum:{name}', linestyle='--')
186192 ax.grid(True)
187193 ax.legend()
188194 fig.canvas.manager.set_window_title('timeseries')
189195
190196
191- def draw_cumulative_timeseries(sources, keys, add_sum, begin_frame, end_frame):
197+ def draw_cumulative_timeseries(sources, keys, add_sum, convolve, begin_frame, end_frame):
192198 fig, ax = matplotlib.pyplot.subplots()
193199 x = numpy.array(range(begin_frame, end_frame))
194200 for name, frames in sources.items():
195201 for key in keys:
196- y = cumsum_with_none(frames[key])
202+ y = cumsum_with_none(maybe_convolve( frames[key], convolve) )
197203 ax.plot(x[:len(y)], y, label=f'{key}:{name}')
198204 if add_sum:
199- y = sum_arrays_with_none([cumsum_with_none(frames[k]) for k in keys])
205+ y = sum_arrays_with_none([cumsum_with_none(maybe_convolve( frames[k], convolve) ) for k in keys])
200206 ax.plot(x[:len(y)], y, label=f'sum:{name}', linestyle='--')
201207 ax.grid(True)
202208 ax.legend()
203209 fig.canvas.manager.set_window_title('cumulative_timeseries')
204210
205211
206- def draw_timeseries_delta(sources, keys, add_sum, begin_frame, end_frame):
212+ def draw_timeseries_delta(sources, keys, add_sum, convolve, begin_frame, end_frame):
207213 fig, ax = matplotlib.pyplot.subplots()
208214 x = numpy.array(range(begin_frame + 1, end_frame))
209215 for name, frames in sources.items():
210216 for key in keys:
211- y = diff_with_none(frames[key])
217+ y = diff_with_none(maybe_convolve( frames[key], convolve) )
212218 ax.plot(x[:len(y)], y, label=f'{key}:{name}')
213219 if add_sum:
214- y = sum_arrays_with_none([diff_with_none(frames[k]) for k in keys])
220+ y = sum_arrays_with_none([diff_with_none(maybe_convolve( frames[k], convolve) ) for k in keys])
215221 ax.plot(x[:len(y)], y, label=f'sum:{name}', linestyle='--')
216222 ax.grid(True)
217223 ax.legend()
@@ -422,5 +428,11 @@ def sum_arrays_with_none(arrays):
422428 return numpy.array(result)
423429
424430
431+ def maybe_convolve(values, convolve):
432+ if convolve is None:
433+ return values
434+ return numpy.convolve([v or 0 for v in values], convolve, 'valid')
435+
436+
425437if __name__ == '__main__':
426438 main()
0 commit comments