def _process_and_display_trends(self, query, objects_expected): from qtools.lib.nstats import moving_average_by_interval from numpy import histogram import numpy as np group_by_plate = self.form_result['group_by_plate'] if objects_expected: results = execute_built_query(query, group_by_plate, True, self.form_result['metric'][1]) else: results = execute_built_query(query, group_by_plate, False) epoch_results = [(float(stat), time.mktime(dt.timetuple()), id, name) for stat, dt, id, name in results if stat is not None] exclude_func = create_exclude_function(self.form_result) filtered_results = [tup for tup in epoch_results if exclude_func(tup[0])] c.yaxis_title = fl.comparable_metric_display(MetricPattern.from_python(self.form_result['metric'])) c.mean_value = 'N/A' c.std_value = 'N/A' c.metric_name = fl.comparable_metric_display(MetricPattern.from_python(self.form_result['metric'])) c.table_data =[] if group_by_plate: moving_average = 10 epoch_url_results = [(stat, stamp*1000, url(controller='plate', action='view', id=id), name) for stat, stamp, id, name in filtered_results] else: moving_average = 50 epoch_url_results = [(stat, stamp*1000, url(controller='well', action='view', id=id), name) for stat, stamp, id, name in filtered_results] if epoch_url_results: c.stats = {} stats, time_points, urls, names = zip(*epoch_url_results) c.stats = h.literal(json.dumps(zip(time_points, stats))) c.table_data = zip( names, stats, time_points ) #update if we can. c.mean_value = str( np.mean( stats ) ) c.std_value = str( np.std( stats ) ) INTERVAL = 24*60*60*1000 ma = moving_average_by_interval(stats, time_points, INTERVAL, 10) c.moving_avg = h.literal(json.dumps(ma)) c.urls = h.literal(json.dumps(urls)) c.names = h.literal(json.dumps(names)) # get histogram of points by day #raise Exception, len(ma) density, edges = histogram(time_points, bins=len(ma), range=(ma[0][0], ma[-1][0])) c.densities = h.literal(json.dumps(zip([m[0] for m in ma], [int(d) for d in density]))) c.max_density_axis = 3*max(density) else: c.stats = {} c.moving_avg = {} c.urls = {} c.names = {} c.densities = {} c.max_density_axis = 3 return render('/trend/results.html')
def test_moving_average_by_interval(self): interval_width = 100 array = [1, 4, 5, 2, 2, 6] interval_array = [90, 100, 150, 200, 300, 500] avgs = moving_average_by_interval(array, interval_array, interval_width, 2) bins, vals = zip(*avgs) assert bins == (0.0, 100.0, 200.0, 300.0, 400.0, 500.0) assert vals == (1.0, 2.75, 3.25, 2.0, 2.0, 4.0)