2

Still a newbie to Python so please be gentle.

I'm trying to parse a Google Analytics Reporting API V4 response to a Pandas dataframe in Python, specifically using Repl if that makes any difference. I've tried a few commonly accepted answers from SO but none seem to be working. The code 'successfully' (no error msgs) executes but even basic print('Done') commands at the end of the script aren't showing up in the terminal.

Can anyone see what might be wrong with my code?

import pandas as pd
from pandas import json_normalize

response = {'reports':[{'columnHeader':{'dimensions':['ga:date','ga:sourceMedium','ga:landingPagePath','ga:deviceCategory','ga:browser'],'metricHeader':{'metricHeaderEntries':[{'name':'ga:sessions','type':'INTEGER'}]}},'data':{'rows':[{'dimensions':['20201126','(direct) / (none)','/test/page.html','desktop','Chrome'],'metrics':[{'values':['1']}]}],'totals':[{'values':['1000']}],'rowCount':100,'minimums':[{'values':['1']}],'maximums':[{'values':['10']}],'isDataGolden':True},'nextPageToken':'1'}]}

def parse_data(response):

  reports = response['reports'][0]
  columnHeader = reports['columnHeader']['dimensions']
  metricHeader = reports['columnHeader']['metricHeader']['metricHeaderEntries']

  columns = columnHeader
  for metric in metricHeader:
    columns.append(metric['name'])

  data = pd.json_normalize(reports['data']['rows'])
  data_dimensions = pd.DataFrame(data['dimensions'].tolist())
  data_metrics = pd.DataFrame(data['metrics'].tolist())
  data_metrics = data_metrics.applymap(lambda x: x['values'])
  data_metrics = pd.DataFrame(data_metrics[0].tolist())
  result = pd.concat([data_dimensions, data_metrics], axis=1, ignore_index=True)

  return result
  print(result)
  result.to_csv('result.csv')
  print('Done')

2 Answers 2

5

It's because in a given function, any code that occurs after the return statement is not executed. Once return is reached, the function is done. If you put your print call and to_csv method before the return statement, they should run.

Try reorganizing your code as such:

def parse_data(response):

  reports = response['reports'][0]
  columnHeader = reports['columnHeader']['dimensions']
  metricHeader = reports['columnHeader']['metricHeader']['metricHeaderEntries']

  columns = columnHeader
  for metric in metricHeader:
    columns.append(metric['name'])

  data = pd.json_normalize(reports['data']['rows'])
  data_dimensions = pd.DataFrame(data['dimensions'].tolist())
  data_metrics = pd.DataFrame(data['metrics'].tolist())
  data_metrics = data_metrics.applymap(lambda x: x['values'])
  data_metrics = pd.DataFrame(data_metrics[0].tolist())
  result = pd.concat([data_dimensions, data_metrics], axis=1, ignore_index=True)

  print(result)
  result.to_csv('result.csv')
  print('Done')
  return result
Sign up to request clarification or add additional context in comments.

2 Comments

Good call out! Sadly that didn't seem to solve the issue. Same result. :(
This code works if you specify pd.json_normalize rather than just json_normalize
2

I would just modify the above function, in order to add colum names as well:

def parse_data(response):
reports = response['reports'][0]
columnHeader = reports['columnHeader']['dimensions']
metricHeader = reports['columnHeader']['metricHeader']['metricHeaderEntries']
#Get dimenssion names
dim_names = [columnHeader[n].split(":")[1] for n in range (len(columnHeader))]
#Get metric names
metric_names = [metricHeader[n]['name'].split(":")[1] for n in range (len(metricHeader))]
column_names = dim_names+metric_names


columns = columnHeader
for metric in metricHeader:
    columns.append(metric['name'])

data = pd.json_normalize(reports['data']['rows'])
data_dimensions = pd.DataFrame(data['dimensions'].tolist())
data_metrics = pd.DataFrame(data['metrics'].tolist())
data_metrics = data_metrics.applymap(lambda x: x['values'])
data_metrics = pd.DataFrame(data_metrics[0].tolist())
result = pd.concat([data_dimensions, data_metrics], axis=1, ignore_index=True)

# Assign columns names to DF
result.columns = column_names
print(result)
result.to_csv('result.csv')
print('Done')
return result

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.