Получение разбивки Google Analytics на страницы как части цикла Python в фрейме данных Pandas

#python #arrays #pandas #dataframe #google-analytics

#python #массивы #панды #фрейм данных #google-analytics

Вопрос:

Я все еще очень рано в своем путешествии по Python, и я совершенно уверен, что ответ на это очевиден. Я прочитал добрых полдюжины похожих сообщений, но не могу понять, каким может быть решение для моего варианта использования.

Что я пытаюсь сделать: автоматически просматривать отчеты Google Analytics изо дня в день, загружая каждый из них во внешний источник один раз в день, помещенный в фрейм данных Pandas.

Чем я доволен: большая часть процесса! Я снимаю простые запросы, загружаю их в фрейм данных, конвертирую их в CSV и отправляю их туда, куда им нужно.

С чем мне нужна помощь: пытаясь сделать мое решение немного более надежным, я хочу убедиться, что я просматриваю любую разбивку на страницы, которая существует в результатах Google Analytics, поскольку запросы ограничены 100 тыс. строк. Я нигде не могу найти хороший пример, который показывает, как я мог бы реализовать такую дополнительную проверку и запрос, и как я мог бы добавить это к моему фрейму данных.

Я вырезал много наворотов, но по сути это код, с которым я работаю. Обратите внимание, что я намеренно ограничил размер страницы только 200.

 import time
import pandas as pd
from pandas import json_normalize

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "secrets.json"

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
import json

jsonConfig = open("config.json", "r")
configRead = json.loads(jsonConfig.read())

SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
KEY_FILE_LOCATION = configRead['keyFileLocation']
VIEW_ID = configRead['gaViewId']

startDateOrig = 7
endDateOrig = 7

startDate = 7
endDate = 7

endDateScope = 3

def request1(page_token=None):
    req1 = {
        'reportRequests':
            [
                {
                    'viewId': VIEW_ID,
                    'dateRanges':
                        [{'startDate': f'{startDate}daysAgo',
                          'endDate': f'{endDate}daysAgo'}],
                    'metrics':
                        [{'expression': 'ga:sessions'}],
                    'dimensions':
                        [{'name': 'ga:date'},
                         {'name': 'ga:sourceMedium'},
                         {'name': 'ga:landingPagePath'}],
                    'pageSize': 200,
                    'pageToken': page_token,
                    'orderBys':
                        [{'fieldName': 'ga:sessions',
                          'sortOrder': 'DESCENDING'}]
                }
            ]
    }
    return req1


def initialize_analyticsreporting():
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        KEY_FILE_LOCATION, SCOPES)
    analytics = build('analyticsreporting', 'v4', credentials=credentials)
    return analytics


def get_report(analytics):
    global startDate
    global endDate
    return analytics.reports().batchGet(
        body=request1()
    ).execute()

    # Add in page_token loop here?

def parse_data(response):
    df = pd.DataFrame
    reports = response['reports'][0]
    columnHeader = reports['columnHeader']['dimensions']
    metricHeader = reports['columnHeader']['metricHeader']['metricHeaderEntries']
    columns = columnHeader

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

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

    result.to_csv('result.csv', index=False, header=False)
    return result


def resetDates():
    global startDateOrig
    global endDateOrig
    global startDate
    global endDate

    startDate = startDateOrig
    endDate = endDateOrig

    return startDate
    return endDate


def main():
    global startDate
    global endDate
    global endDateScope

    resetDates()
    analytics = initialize_analyticsreporting()
    while startDate >= endDateScope:
        print(f'Running report for {startDate} days ago')
        response = get_report(analytics)
        parse_data(response)
        startDate -= 1
        endDate -= 1
        time.sleep(0.2)
    resetDates()
    print("Done now, cheers")
 

Возможно, вы заметили, что у меня есть комментарий в функции get_report(). Будет ли это лучшим местом для добавления в цикл для извлечения любых дополнительных страниц требуемых данных? Я думаю, что функцию parse_data() также необходимо будет изменить, и, возможно, переменная ответа превратится в массив / список?

Любая помощь будет оценена!