
在使用python与google analytics admin api交互时,例如调用admin_v1beta.analyticsadminserviceclient().list_custom_dimensions方法,返回的结果并非标准的python列表或字典,而是一个listcustomdimensionspager类型的对象。这种对象类型旨在提供分页功能,但其内部结构不直接兼容pandas dataframe的创建或标准的json序列化过程。
在尝试直接处理这类API响应时,我们通常会遇到以下问题:
这些挑战使得直接将API响应转换为Pandas DataFrame变得复杂。
鉴于API响应对象的特殊性,一种有效的解决方案是手动解析其内部结构,并通过字符串处理将其转换为Pandas能够识别的JSON格式。核心思想是迭代ListCustomDimensionsPager对象中的每个元素,将每个元素转换为一个可序列化的字典表示,然后将其添加到列表中,最终用该列表创建DataFrame。
以下是实现此目标的Python函数:
import pandas as pd
import json
from google.analytics.admin import admin_v1beta # 确保已安装 google-analytics-admin 库
def get_custom_dimensions_as_dataframe(property_filter: str) -> pd.DataFrame:
"""
从Google Analytics Admin API获取自定义维度列表,并将其转换为Pandas DataFrame。
Args:
property_filter: Google Analytics 属性的资源名称,例如 "properties/12345"。
Returns:
一个包含自定义维度数据的Pandas DataFrame。
"""
client = admin_v1beta.AnalyticsAdminServiceClient()
request = admin_v1beta.ListCustomDimensionsRequest(
parent=property_filter
)
# API响应是一个ListCustomDimensionsPager对象
full_response_pager = client.list_custom_dimensions(request=request)
df_records = []
# 迭代Pager对象中的每个自定义维度响应
for response_item in full_response_pager:
# 1. 获取响应项的内部字典表示
# response_item本身是一个Google Protobuf消息对象,其__dict__包含了实际的数据
step1 = response_item.__dict__
# 2. 将字典转换为字符串,这是进行字符串替换的基础
step2 = str(step1)
# 3. 执行一系列字符串替换,将非标准的Python字典字符串转换为有效的JSON字符串
# 目标是将 `key: value` 转换为 `"key": "value"` 或 `"key": value`
# 确保键名和字符串值被双引号包围,布尔值和数字保持其JSON原生格式。
step3 = step2.replace(': name:', ': "name" :')
step4 = step3.replace('parameter_name:', ', "parameter_name" :')
step5 = step4.replace('display_name:', ', "display_name" :')
step6 = step5.replace('description:', ', "description" :')
step7 = step6.replace('scope:', ', "scope" :')
# 处理布尔值和枚举值,确保它们是有效的JSON值
# 注意:JSON中布尔值 'true' 或 'false' 不需要引号
step8 = step7.replace('disallow_ads_personalization: true', ', "disallow_ads_personalization" : true')
step9 = step8.replace("'_pb': ", "") # 移除内部Protobuf对象的引用,通常不需要
step10 = step9.replace(' : EVENT', ' : "EVENT"') # 枚举值转换为字符串,需要引号
step11 = step10.replace(' : USER', ' : "USER"') # 枚举值转换为字符串,需要引号
# 4. 处理Unicode转义字符并确保编码正确
# .encode('utf-8').decode('unicode_escape') 用于正确处理字符串中的特殊字符,
# 例如 \uXXXX,将其转换为实际的Unicode字符,确保json.loads()能正确解析。
step12 = step11.encode('utf-8').decode('unicode_escape')
# 5. 将处理后的字符串加载为Python字典
# 此时,字符串已经是一个有效的JSON格式
try:
step13 = json.loads(step12)
df_records.append(step13)
except json.JSONDecodeError as e:
print(f"Error decoding JSON for item: {step12[:200]}... Error: {e}")
# 在生产环境中,可能需要更健壮的错误处理机制
# 6. 从字典列表创建Pandas DataFrame
return pd.DataFrame(df_records)# 替换为您的Google Analytics 4属性ID
# 例如,如果您的属性ID是 123456789,那么 property_resource_name 就是 "properties/123456789"
property_id = "YOUR_GA4_PROPERTY_ID"
property_resource_name = f"properties/{property_id}"
# 调用函数获取DataFrame
custom_dimension_df = get_custom_dimensions_as_dataframe(property_resource_name)
# 打印DataFrame的头部信息
print("DataFrame头部信息:")
print(custom_dimension_df.head())
# 打印DataFrame的类型和形状
print(f"\nDataFrame类型: {type(custom_dimension_df)}")
print(f"DataFrame形状: {custom_dimension_df.shape}")将Google Analytics Admin API返回的ListCustomDimensionsPager对象转换为Pandas DataFrame需要一个间接的方法。由于该对象不直接支持JSON序列化或字典式访问,我们采用了一种通过迭代、字符串转换和细致的字符串替换来构造有效JSON字符串的策略。尽管这种方法可能显得不够“优雅”,但它提供了一个实用且有效的解决方案,能够成功地将复杂的API响应数据转化为结构化的Pandas DataFrame,以便于后续的数据分析和处理。在处理类似非标准API响应时,这种字符串处理和JSON重构的技术是一种值得考虑的通用方法。
以上就是从Google API响应对象高效创建Pandas DataFrame教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号