Всем привет,
вот такая задачка, буду благодарна за любую помощь.
Есть таблица в бд куда должны попадать данные из гугл аналитики.
Таблица выглядит так:
start_date | end_date |view_id |element_1 |element_2 |element_3 |element_4 |element_5 |metrics |m_value
Всего элементов 7.
Пока процесс заполнения выглядит так
Я делаю запрос к АПИ аналитики, парсю вложенный словарь с параметрами для запроса к АПИ:
data_test = {
'view_id_01' : {'view_id': '01',
'start_date': '2019-08-01',
'end_date': '2019-09-02',
'metrics': [{'expression': 'ga:sessions'}, {'expression':'ga:users'}],
'dimensions': [{'name': 'ga:country'}, {'name': 'ga:userType'}, {'name': 'ga:date'}]}
'view_id_02' : {'view_id': '02',
'start_date': '2019-08-01',
'end_date': '2019-09-02',
'metrics': [{'expression': 'ga:sessions'}, {'expression':'ga:users'}],
'dimensions': [{'name': 'ga:country'}, {'name': 'ga:date'}]},
'view_id_03' : {'view_id': '03',
'start_date': '2019-08-01',
'end_date': '2019-09-02',
'metrics': [{'expression': 'ga:sessions'}, {'expression':'ga:users'}],
'dimensions': [{'name': 'ga:country'}, {'name': 'ga:date'}]}
}
Ответ аналитики всегда в формате JSON
{"reports": [
{
"columnHeader": {
"metricHeader": {
"metricHeaderEntries": [
{
"name": "ga:users",
"type": "INTEGER"
}
]
}
},
"data": {
"rows": [
{
"metrics": [
{"values": ["54"]}
]
}
],
"totals": [{"values": ["54"]}],
"minimums": [{"values": ["54"]}],
"maximums": [{"values": ["54"]}],
"rowCount": 1,
}
}
]}
У меня есть функция преобразования JSON в pandas df
def print_response_new_test(response):
list = []
for report in response.get('reports', []):
columnHeader = report.get('columnHeader', {})
dimensionHeaders = columnHeader.get('dimensions', [])
metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
rows = report.get('data', {}).get('rows', [])
for row in rows:
dict = {}
dimensions = row.get('dimensions', [])
dateRangeValues = row.get('metrics', [])
for header, dimension in zip(dimensionHeaders, dimensions):
dict[header] = dimension
for i, values in enumerate(dateRangeValues):
for metric, value in zip(metricHeaders, values.get('values')):
if ',' in value or '.' in value:
dict[metric.get('name')] = float(value)
else:
dict[metric.get('name')] = int(value)
list.append(dict)
df = pd.DataFrame(list)
df['start_date'] = sample_request.get('start_date')
df['end_date'] = sample_request.get('end_date')
df['view_id'] = sample_request.get('view_id')
return df
Результат
browser country sessions users start_date end_date view_id
chrome china 100 90 2019-01-01 2019-01-02 01
mozilla germany 200 190 2019-01-01 2019-01-02 02
safari france 300 290 2019-01-01 2019-01-02 03
Но мне надо чтобы было так
start_date end_date view_id element_1 element_2 metrics m_value
2019-01-01 2019-01-02 01 chrome china sessions 100
2019-01-01 2019-01-02 01 chrome china users 90
2019-01-01 2019-01-02 02 mozilla germany sessions 200
2019-01-01 2019-01-02 02 mozilla germany users 190
2019-01-01 2019-01-02 03 safari france sessions 300
2019-01-01 2019-01-02 03 safari france users 290
Я даже не знаю с чего начать, обрабатывать уже готовую таблицу или переписывать функцию конвертации