如何将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
相关产品推荐
相关产品推荐

