def _prepare_time_series_data()

in report/generate_master_report.py [0:0]


def _prepare_time_series_data(raw_data):
  """Massage the data to fit a format suitable for graph generation."""
  headers = ["Date"]
  project_to_pos = {}
  date_to_wall = {}
  date_to_mem = {}

  # First pass to gather the projects and form the headers.
  for row in raw_data:
    if row.project_label not in project_to_pos:
      project_to_pos[row.project_label] = len(project_to_pos)
      headers.extend(
          [row.project_label, {
              "role": "interval"
          }, {
              "role": "interval"
          }])

  for row in raw_data:
    if row.report_date not in date_to_wall:
      # Commits on day X are benchmarked on day X + 1.
      date_str = "{} ({})".format(
          (row.report_date - datetime.timedelta(days=1)).strftime("%Y-%m-%d"),
          _short_hash(row.bazel_commit))

      date_to_wall[row.report_date] = ["null"] * len(headers)
      date_to_mem[row.report_date] = ["null"] * len(headers)

      date_to_wall[row.report_date][0] = date_str
      date_to_mem[row.report_date][0] = date_str

    base_pos = project_to_pos[row.project_label] * 3
    date_to_wall[row.report_date][base_pos + 1] = row.median_wall
    date_to_wall[row.report_date][base_pos + 2] = row.min_wall
    date_to_wall[row.report_date][base_pos + 3] = row.max_wall
    date_to_mem[row.report_date][base_pos + 1] = row.median_memory
    date_to_mem[row.report_date][base_pos + 2] = row.min_memory
    date_to_mem[row.report_date][base_pos + 3] = row.max_memory

  return [headers] + list(date_to_wall.values()), [headers] + list(
      date_to_mem.values()), project_to_pos.keys()