使用Google Analytics API双日期范围对比数据,applymap()多变量处理疑问
处理Google Analytics多日期范围数据 + Pandas applymap/多变量操作指南
看起来你已经搞定了GA API的多日期范围请求,接下来就是用Pandas清洗和分析数据对吧?我来一步步帮你理清怎么处理,尤其是你问的applymap和多变量问题~
首先,先把GA API返回的嵌套报告转换成Pandas DataFrame,这是第一步,不然没法处理。我给你写个解析函数:
import pandas as pd def parse_ga_report_to_df(report): # 提取维度名称(比如ga:pagePath) dim_headers = [hdr['name'] for hdr in report['columnHeader']['dimensions']] # 提取指标名称和对应的日期范围,给指标加上日期后缀区分 date_ranges = report['columnHeader']['metricHeader']['dateRangeHeaders'] metric_entries = report['columnHeader']['metricHeader']['metricHeaderEntries'] metric_cols = [] for dr in date_ranges: date_tag = f"{dr['startDate'].replace('-','')}_{dr['endDate'].replace('-','')}" for entry in metric_entries: metric_cols.append(f"{entry['name']}_{date_tag}") # 提取每一行的维度和指标值 rows_data = [] for row in report['data']['rows']: dim_vals = row['dimensions'] # 每个日期范围的指标值是分开的,要合并到一起 metric_vals = [] for metric_group in row['metrics']: metric_vals.extend(metric_group['values']) rows_data.append(dim_vals + metric_vals) # 生成DataFrame并把指标转成数值类型 df = pd.DataFrame(rows_data, columns=dim_headers + metric_cols) df[metric_cols] = df[metric_cols].apply(pd.to_numeric) return df
然后把你的API请求结果传进去解析:
# 假设你已经初始化好analytics对象 response = get_report(analytics) # 取batchGet返回的第一个报告 ga_report = response.get('reports', [])[0] df = parse_ga_report_to_df(ga_report)
现在你应该有了类似这样的DataFrame:
| ga:pagePath | ga:sessions_20180101_20180131 | ga:pageviews_20180101_20180131 | ga:sessions_20180201_20180228 | ga:pageviews_20180201_20180228 |
|---|---|---|---|---|
| /home | 1200 | 3500 | 1500 | 4200 |
| /blog | 800 | 2400 | 750 | 2100 |
接下来重点说你问的applymap和多变量处理:
1. 什么时候用applymap?
applymap是给DataFrame的每个元素单独做处理,比如格式化数值、统一单位这类只依赖单个元素的操作,它没法直接访问同一行的其他列(也就是你说的多变量)。比如你想把所有指标列保留两位小数:
# 筛选出所有指标列(以ga:开头的) metric_columns = [col for col in df.columns if col.startswith('ga:')] df[metric_columns] = df[metric_columns].applymap(lambda x: round(x, 2))
2. 处理多变量(关联同一行多列)怎么办?
如果要对比两个日期范围的数据(比如计算会话数增长率),这时候需要访问同一行的多个列,applymap就不适用了,推荐两种方式:
方式一:直接列运算(最高效,优先用)
Pandas的列运算比apply快很多,能不用apply就不用:
# 计算2月相对1月的会话增长率 df['session_growth_%'] = (df['ga:sessions_20180201_20180228'] - df['ga:sessions_20180101_20180131']) / df['ga:sessions_20180101_20180131'] * 100 # 处理分母为0的情况(避免报错) df['session_growth_%'] = df['session_growth_%'].fillna(0).replace([float('inf'), -float('inf')], 0)
方式二:用df.apply按行处理(适合复杂逻辑)
如果逻辑比较复杂(比如要加多个判断),再用apply:
def calculate_growth_rate(row): jan_sessions = row['ga:sessions_20180101_20180131'] feb_sessions = row['ga:sessions_20180201_20180228'] if jan_sessions == 0: return 100 if feb_sessions > 0 else 0 # 1月没数据,2月有就算100%增长 return round((feb_sessions - jan_sessions)/jan_sessions * 100, 2) df['session_growth_%'] = df.apply(calculate_growth_rate, axis=1)
这样就能轻松对比两个日期范围的数据啦~
内容的提问来源于stack exchange,提问作者longtail
相关产品推荐
相关产品推荐

