从Google API响应对象高效创建Pandas DataFrame教程

聖光之護
发布: 2025-10-10 13:09:01
原创
423人浏览过

从Google API响应对象高效创建Pandas DataFrame教程

本教程详细介绍了如何将Google Analytics Admin API返回的ListCustomDimensionsPager对象转换为Pandas DataFrame。由于API响应的特定对象类型无法直接序列化,文章提供了一种通过迭代响应、将对象字典转换为字符串,并进行一系列字符串替换以构造有效JSON,最终生成结构化DataFrame的实用方法。

理解Google API响应的挑战

在使用pythongoogle analytics admin api交互时,例如调用admin_v1beta.analyticsadminserviceclient().list_custom_dimensions方法,返回的结果并非标准的python列表或字典,而是一个listcustomdimensionspager类型的对象。这种对象类型旨在提供分页功能,但其内部结构不直接兼容pandas dataframe的创建或标准的json序列化过程。

在尝试直接处理这类API响应时,我们通常会遇到以下问题:

  • 非JSON序列化: 直接尝试使用json.dumps()序列化ListCustomDimensionsPager对象或其__dict__属性会导致TypeError: Object of type _GapicCallable is not JSON serializable。这是因为该对象内部包含了一些不可序列化的Gapic客户端方法。
  • 非直接可下标访问: 尝试像访问字典一样通过键(例如ga4_custom_dimensions['custom_dimensions'])来获取数据会引发TypeError: ListCustomDimensionsPager' object is not subscriptable,因为它不是一个字典类型。
  • pd.json_normalize的局限性: 即使尝试使用Pandas的json_normalize方法,也往往只能得到一个仅包含索引的空DataFrame,无法正确解析嵌套数据。

这些挑战使得直接将API响应转换为Pandas DataFrame变得复杂。

解决方案:通过字符串操作构建有效JSON

鉴于API响应对象的特殊性,一种有效的解决方案是手动解析其内部结构,并通过字符串处理将其转换为Pandas能够识别的JSON格式。核心思想是迭代ListCustomDimensionsPager对象中的每个元素,将每个元素转换为一个可序列化的字典表示,然后将其添加到列表中,最终用该列表创建DataFrame。

必应图像创建器
必应图像创建器

微软必应出品的AI绘图工具

必应图像创建器 453
查看详情 必应图像创建器

以下是实现此目标的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)
登录后复制

代码解析与注意事项

  1. 迭代ListCustomDimensionsPager: full_response_pager是一个可迭代对象。通过for response_item in full_response_pager:,我们可以逐一访问每个自定义维度对象。
  2. 访问__dict__: response_item.__dict__尝试获取API响应对象的内部字典表示。对于Google Protobuf消息对象,__dict__通常包含了其字段数据。
  3. str()转换: 将字典转换为字符串 (str(step1)) 是为了能够使用str.replace()方法进行字符串操作。
  4. 一系列str.replace()操作:
    • 键名加引号: 原始字符串中,键名(如name、parameter_name)没有双引号,不符合JSON规范。通过替换,例如将: name: 替换为: "name" :,为键名添加双引号。
    • 值加引号: 对于字符串类型的值(如枚举值EVENT、USER),原始输出可能没有双引号,需要手动添加,例如将: EVENT 替换为: "EVENT"。
    • 布尔值处理: JSON中布尔值true或false是小写的字面量,不需要引号。例如,disallow_ads_personalization: true被替换为, "disallow_ads_personalization" : true,确保true不被错误地加上引号。
    • _pb字段清理: "_pb":通常是Protobuf内部的私有字段,可能包含不可序列化的对象,直接移除可以简化后续处理。
    • 逗号添加: 原始字符串中,字段之间可能没有逗号,或者逗号位置不正确。通过在替换时巧妙地添加逗号(例如 , "parameter_name" :),确保了JSON结构的正确性。
  5. encode('utf-8').decode('unicode_escape'): 这一步是为了正确处理字符串中的Unicode转义序列(例如\uXXXX),将其转换为实际的Unicode字符,确保json.loads()能正确解析。
  6. json.loads(): 当字符串经过上述处理后,它已经是一个有效的JSON字符串,可以安全地通过json.loads()方法转换为Python字典。
  7. 构建DataFrame: 将所有解析出的字典收集到一个列表df_records中,最后使用pd.DataFrame(df_records)即可创建最终的DataFrame。

使用示例

# 替换为您的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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号