如何传递多个Google Analytics View ID并将数据合并为单个DataFrame
Google Analytics 多视图数据批量拉取合并方案
你当前的代码存在2个核心问题:
- GA Reporting API v4的
reportRequests参数要求每个查询视图对应一个独立的请求对象,不能把多个viewId塞到同一个请求的viewId字段里- 缺少把GA返回的结构化数据解析为表格、再合并多个视图数据的逻辑
实现步骤
1. 修正批量请求构造逻辑
每个View ID对应一个reportRequest对象,一次性提交批量请求,比循环单个请求效率更高。
2. 编写GA返回结果解析函数
把API返回的嵌套格式转换为pandas DataFrame,同时额外新增view_id字段区分不同区域的数据。
3. 合并所有视图数据为单个DataFrame
把每个视图解析后的DataFrame做纵向拼接即可。
完整可运行代码示例
import pandas as pd # 替换为你自己的配置参数 VIEW_IDS = ['156950826','156928279','156964042'] START_DATE = '2024-01-01' END_DATE = '2024-01-31' METRICS = ['ga:sessions', 'ga:users'] # 替换为你需要的指标 DIMENSIONS = ['ga:date', 'ga:country'] # 替换为你需要的维度
def get_batch_report(analytics): # 每个view id生成一个独立的请求对象 report_requests = [] for view_id in VIEW_IDS: report_requests.append({ 'viewId': view_id, 'dateRanges': [{'startDate': START_DATE, 'endDate': END_DATE}], 'metrics': [{'expression':i} for i in METRICS], 'dimensions': [{'name':j} for j in DIMENSIONS], 'pageSize': 8000 }) return analytics.reports().batchGet( body={'reportRequests': report_requests} ).execute()
def parse_ga_response(response): all_dfs = [] # 遍历每个view id对应的返回结果 for report in response.get('reports', []): # 提取维度和指标表头 column_header = report.get('columnHeader', {}) dimension_headers = column_header.get('dimensions', []) metric_headers = [m.get('name') for m in column_header.get('metricHeader', {}).get('metricHeaderEntries', [])] # 提取当前报告对应的view id view_id = report.get('query', {}).get('viewId') rows = report.get('data', {}).get('rows', []) if not rows: continue # 逐行解析数据 data = [] for row in rows: dimensions = row.get('dimensions', []) metrics = row.get('metrics', [])[0].get('values', []) row_data = dict(zip(dimension_headers + metric_headers, dimensions + metrics)) row_data['view_id'] = view_id # 新增字段标记数据所属视图 data.append(row_data) df = pd.DataFrame(data) all_dfs.append(df) # 合并所有视图的数据 return pd.concat(all_dfs, ignore_index=True) if all_dfs else pd.DataFrame()
# 调用示例,analytics是你已经初始化完成的GA服务对象 response = get_batch_report(analytics) final_df = parse_ga_response(response)
补充说明
- 最终生成的
final_df就是包含所有视图数据的合并DataFrame,新增的view_id字段可以区分不同区域的数据,你可以提前做一个view_id和区域名称的映射字典,再替换为更易读的区域名称 - 如果你的数据量超过单页返回上限,可以在请求里增加
pageToken参数循环拉取所有页数据
内容的提问来源于stack exchange,提问作者SaiKiran_24
相关产品推荐
相关产品推荐

