简体   繁体   中英

Converting Google Analytics Reporting API V4 request results to csv with Python

I'm trying to create a nicely formatted csv file with Python from a Google Analytics Reporting API V4 request results.

The setup is using the provided example "Hello Analytics Reporting API V4." https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/service-py#3_setup_the_sample

The following results are as expected:
ga:date: 20160601
ga:sessions: 19802
ga:pageviews: 53369
ga:users: 17656
ga:date: 20160602
ga:sessions: 33718
ga:pageviews: 71857
ga:users: 30266

What is needed would be something like this:
ga:date: ga:sessions: ga:pageviews: ga:users:
20160601 19802 53369 17656
20160602 33718 71857 30266

I'm sure there is a straightforward solution with Python for this one.

Here's how I did it. For my application get_report_response() and save_report_data() is being called from within a loop that is going through multiple profile ids.

report_response = get_report_response(report_request, feed_log_file_path)
save_report_data(report_response, profile_id, feed_data_file_path)

def get_report_response(report_request, feed_log_file_path):    
report_response = _analytics_reporting_service.reports().batchGet(body=report_request,quotaUser=QUOTA_USER,prettyPrint=True).execute()
Log("report response: {0}".format(report_response), log_file_path=feed_log_file_path)
return report_response


def save_report_data(results, profile_id, feed_data_file_path):
"""Prints out the results. """

for report in results.get('reports', []):

    create_header = True
    if os.path.isfile(feed_data_file_path):
       create_header = False 

    f = open(feed_data_file_path, 'at', encoding='utf-8')
    writer = csv.writer(f, lineterminator='\n')

    columnHeader = report.get('columnHeader', {})
    dimensionHeaders = columnHeader.get('dimensions', [])
    metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
    rows = report.get('data', {}).get('rows', [])

    temp_header_row = ["profile_id"]
    header_row = []
    header_row.extend(dimensionHeaders)
    header_row.extend([mh['name'] for mh in metricHeaders]) 
    temp_header_row.extend(header_row)

    if create_header:
        writer.writerow(temp_header_row)

    for row in rows:          
        dimensions_data = row.get('dimensions', [])
        metrics_data = [m['values'] for m in row.get('metrics', [])][0]

        temp_data_row = [profile_id]
        data_row = []
        data_row.extend(dimensions_data)
        data_row.extend(metrics_data)

        temp_data_row.extend(data_row)            
        writer.writerow(temp_data_row)

    # Close the file.
    f.close()

Below my solution


 def print_response_to_csv(response, SEP="\t"):
  for report in response.get('reports', []):

    columnHeader = report.get('columnHeader', {})
    dimensionHeaders = columnHeader.get('dimensions', [])
    metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])

    metricHeaders = list(map(lambda x: x.get('name'), metricHeaders))
    header = SEP.join(dimensionHeaders) + SEP + SEP.join(metricHeaders)
    print(header)

    for row in report.get('data', {}).get('rows', []):

      dimensions = row.get('dimensions', [])
      dateRangeValues = row.get('metrics', [])

      output =  SEP.join(dimensions)

      for i, values in enumerate(dateRangeValues):

        for metricHeader, value in zip(metricHeaders, values.get('values')):
            output = output + SEP + value
      print(output)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM