| # Copyright 2016 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| import argparse |
| import json |
| import os |
| import sys |
| |
| from ggplot import * |
| import pandas |
| |
| |
| def _ConvertToSimplifiedFormat(values_list): |
| data = {} |
| for trace_name, result_data in values_list: |
| result_values = result_data['pairs']['values'] |
| |
| values = {} |
| for current_value in result_values: |
| grouping_key = current_value['name'] |
| |
| if current_value['type'] == 'numeric': |
| numeric_value = current_value['numeric'] |
| if numeric_value['type'] == 'scalar': |
| values[grouping_key] = [current_value['numeric']['value']] |
| elif numeric_value['type'] == 'numeric': |
| # Let's just skip histograms for now. |
| histogram_values = [] |
| for bin in numeric_value['centralBins']: |
| histo_mid = (bin['max'] - bin['min']) * 0.5 |
| histogram_values += [histo_mid for _ in xrange(bin['count'])] |
| values[grouping_key] = histogram_values |
| |
| data[trace_name] = values |
| return data |
| |
| |
| def _ReadValuesOutput(file_name, metric_names): |
| with open(file_name, 'r') as f: |
| results_list = f.read() |
| |
| try: |
| # Try metrics format first, which is a dict of results. |
| results_together = json.loads(results_list).iteritems() |
| except ValueError: |
| # Try flume pipeline output format, which is a 1 result per line. |
| r = [json.loads(s) for s in results_list.splitlines()] |
| results_together = dict([(str(i), r[i]) for i in xrange(len(r))]) |
| |
| simplified_data = _ConvertToSimplifiedFormat(results_together) |
| |
| return _ConvertValuesToPD(simplified_data, metric_names) |
| |
| |
| def _ConvertValuesToPD(all_values_data, metric_names): |
| pd_dict = {} |
| |
| for trace_name, values in all_values_data.iteritems(): |
| for metric_name, metric_value in values.iteritems(): |
| if not metric_name in metric_names: |
| continue |
| if not metric_name in pd_dict: |
| pd_dict[metric_name] = [] |
| pd_dict[metric_name].extend(metric_value) |
| return pandas.DataFrame(pd_dict) |
| |
| |
| def _DoGGPlot(graph_type, data, x, y): |
| if graph_type == 'histogram': |
| print ggplot(aes(x=x), data=data) + geom_histogram() |
| elif graph_type == 'point': |
| print (ggplot(aes(x=x, y=y), data=data) + geom_point() + |
| stat_smooth(color='black', se=True)) |
| |
| |
| def Main(): |
| # Parse options. |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--x', help='X-Axis parameter.') |
| parser.add_argument('--y', help='X-Axis parameter.') |
| parser.add_argument('--graph-type', |
| choices=['histogram', 'point'], |
| help='Type of graph.') |
| parser.add_argument('--source', |
| help='Path to file containing results of metrics run.') |
| args = parser.parse_args() |
| |
| if not args.source: |
| parser.error('Source file not specified. Use --source to specify ' |
| 'path to source file.') |
| |
| if not args.graph_type: |
| parser.error('Graph type not specified. Use --graph-type.') |
| |
| metric_names = [] |
| if args.x: |
| metric_names.append(args.x) |
| if args.y: |
| metric_names.append(args.y) |
| |
| data = _ReadValuesOutput(os.path.abspath(args.source), metric_names) |
| |
| _DoGGPlot(args.graph_type, data, args.x, args.y) |