Есть ли способ добавить результаты цикла for в фрейм данных, когда результат сбрасывает каждую итерацию? - PullRequest
1 голос
/ 21 июня 2019

Я запрашиваю Google Analytics API и использую цикл for для получения данных из более чем одного представления одновременно. Затем у меня есть функция синтаксического анализа, которая анализирует мой результат JSON в кадре данных pandas. Если я распечатываю результат функции, он показывает мне каждый результат в отдельном фрейме данных, для скольких просмотров я его запрашиваю. Однако я не могу добавить результат в новый фрейм данных или перечислить каждую итерацию.

Я пытался использовать цикл while

df_new = []
view_id_list = ['##', '##', '##'] 
while len(df_new) < len(view_id_list)
    df2 = df_new.append(((prase_response_single(response_data)[0]))

этот код - мой пример запроса, который проходит через мой список view_id и приносит мне данные для каждого из них в отдельности

for i in viewId_listUse:
    sample_request = {
        'viewId': i,
        'dateRanges': {
            'startDate': datetime.strftime(datetime.now() - timedelta(days=30), '%Y-%m-%d'),
            'endDate': datetime.strftime(datetime.now(), '%Y-%m-%d')
        },
        'dimensions': [{'name': 'ga:date'}],
        'metrics': [{'expression': 'ga:sessions'}]
    }
    response = api_client.reports().batchGet(
        body={
            'reportRequests': sample_request
        }).execute()

    response_data = response.get('reports', [])[0]
    print((prase_response_single(response_data)[0]))

эта функция анализирует данные JSON во фрейм данных pandas, но очищает результирующий список каждый раз, когда он вызывается

def prase_response_single(report):

    """Parses and prints the Analytics Reporting API V4 response"""
    result_list = []

    data_csv = []
    data_csv2 = []

    header_row = []

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

    for dheader in dimensionHeaders:
        header_row.append(dheader)
    for mheader in metricHeaders:
        header_row.append(mheader['name'])

    rows = report.get('data', {}).get('rows', [])
    for row in rows:
        row_temp = []
        dimensions = row.get('dimensions', [])
        metrics = row.get('metrics', [])
        for d in dimensions:
            row_temp.append(d)
        for m in metrics[0]['values']:
            row_temp.append(m)
            data_csv.append(row_temp)

        if len(metrics) == 2:
            row_temp2 = []
            for d in dimensions:
                row_temp2.append(d)
            for m in metrics[1]['values']:
                row_temp2.append(m)
            data_csv2.append(row_temp2)

    result_df = pandas.DataFrame(data_csv, columns=header_row)
    result_list.append(result_df)
    if data_csv2 != []:
        result_list.append(pandas.DataFrame(data_csv2, columns=header_row))

    return result_list

используя функцию печати, это тот тип результата, который я получаю (с большим количеством строк, но это пример формата)

 ga:date ga:sessions
0   20190522        1243
1   20190523        1167
2   20190524        1001

однако я не могу добавить эти отдельные кадры данных вместе, так как функция сбрасывает свой список каждый раз, когда она вызывается циклом for.

1 Ответ

0 голосов
/ 21 июня 2019

Мне кажется, что это происходит потому, что вы перезаписываете переменную result_list каждый раз, когда вызываете функцию.

def prase_response_single(report):

    """Parses and prints the Analytics Reporting API V4 response"""
    # Each time the function is called, this is overwritten as an empty list
    result_list = [] 

    ...

Однако ваш первый фрагмент выглядел так, как будто он собирал все эти меньшие кадры данных в один список, поэтому в конце у вас есть полный список данных кадров.В этом случае вы, вероятно, можете просто пройти через эту переменную df_new и пользователя pandas.concat , чтобы объединить их вместе.

Кроме того, похоже, что у вас есть ненужное назначение в этом первом фрагменте.

df_new = []
view_id_list = ['##', '##', '##'] 
while len(df_new) < len(view_id_list)
    # Don't need to re-assign the list, .append will mutate the existing list
    df_new.append(((prase_response_single(response_data)[0]))

Дайте мне знать, если я ошибся с тем, что вы спрашивали, или я могу уточнить что-нибудь.

...