#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() также необходимо будет изменить, и, возможно, переменная ответа превратится в массив / список?
Любая помощь будет оценена!