You need to enable JavaScript to run this app. 如何将Google Analytics JSON转换为Python的Pandas DataFrame
优惠活动
大模型
产品
解决方案
定价
更多

如何将Google Analytics JSON转换为Python的Pandas DataFrame

现有代码核心问题定位
  • 循环缩进逻辑错位:遍历API返回报表的代码块与行数据解析代码块嵌套关系错误,行遍历逻辑被放到报表遍历循环外部,导致列头与数据无法一一匹配,多报表场景下前序数据会被覆盖;极端情况下如果API返回无报表内容,rows变量会直接未定义触发报错。
  • 内置变量名冲突:使用Python原生类型名list、dict作为自定义变量名,会覆盖原生方法,后续调用原生类型功能时会触发隐式报错。
  • 数值解析逻辑缺陷:未对特殊格式的数值字符串做清洗,直接做类型转换时会因字符串包含非数值符号抛出解析异常。
  • 函数命名与功能错配:原函数print_response无实际打印逻辑,核心功能为API响应转DataFrame,命名易造成调用混淆。
修正后的可运行代码
import pandas as pd

def get_report(analytics):
    """Queries the Analytics Reporting API V4.

    Args:
        analytics: An authorized Analytics Reporting API V4 service object.
    Returns:
        The Analytics Reporting API V4 response.
    """
    return analytics.reports().batchGet(
        body={
            'reportRequests': [
            {
                'viewId': VIEW_ID,
                'dateRanges': [{'startDate': '7daysAgo', 'endDate': 'today'}],
                'metrics': [{'expression': 'ga:sessions'}],
                'dimensions': [{'name': 'ga:adMatchedQuery'}]
            }]
        }
    ).execute()

def response_to_dataframe(response):
    """将Analytics Reporting API V4的返回响应转换为结构化Pandas DataFrame"""
    result_list = []
    # 遍历所有API返回的报表,支持多reportRequests请求场景
    for report in response.get('reports', []):
        # 提取列头映射关系
        column_header = report.get('columnHeader', {})
        dimension_headers = column_header.get('dimensions', [])
        metric_headers = column_header.get('metricHeader', {}).get('metricHeaderEntries', [])
        # 提取当前报表下的所有行数据
        rows = report.get('data', {}).get('rows', [])

        # 逐行解析维度与指标值
        for row in rows:
            row_container = {}
            # 解析维度字段
            row_dimensions = row.get('dimensions', [])
            for header, dim_value in zip(dimension_headers, row_dimensions):
                row_container[header] = dim_value

            # 解析指标字段,兼容多日期范围、多指标场景
            row_metric_groups = row.get('metrics', [])
            for metric_group in row_metric_groups:
                for metric_def, metric_value in zip(metric_headers, metric_group.get('values')):
                    # 清洗特殊格式字符后做类型转换
                    cleaned_val = metric_value.replace(',', '')
                    if '.' in cleaned_val:
                        row_container[metric_def.get('name')] = float(cleaned_val)
                    else:
                        row_container[metric_def.get('name')] = int(cleaned_val)

            result_list.append(row_container)
    
    return pd.DataFrame(result_list)

# 调用流程示例
if __name__ == "__main__":
    # 复用已跑通的认证、请求逻辑
    analytics_client = initialize_analyticsreporting()
    api_response = get_report(analytics_client)
    # 直接获取结构化DataFrame开展后续分析
    ga_df = response_to_dataframe(api_response)
修正要点说明
  • 调整嵌套逻辑:将行数据解析的代码完全嵌入报表遍历的循环内,保证每个报表的列头与数据一一对应,不会出现错位覆盖、变量未定义的问题。
  • 消除变量冲突:将原代码中用作变量名的list、dict替换为无冲突的自定义名称,避免覆盖Python原生内置类型。
  • 优化数值解析:先移除数值字符串中的特殊分隔符,再根据是否包含小数点判断转换为int或float,解决特殊格式数值的解析报错问题。
  • 提升兼容性:逻辑完整覆盖多指标、多日期范围、多请求报表的响应结构,不会因为请求参数复杂化导致代码失效。
  • 保持原有流程兼容:完全匹配已验证可用的API认证、请求逻辑,无需修改现有已跑通的代码部分,仅替换响应转换模块即可使用。

内容的提问来源于stack exchange,提问作者user15402899

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 08:57:02