当前位置:

首页 > 编程开发 > Google API转Pandas DataFrame实战教程

Google API转Pandas DataFrame实战教程

本教程详细介绍了如何将GoogleAnalyticsAdminAPI返回的ListCustomDimensionsPager类对象转换为PandasDataFrame。由于API响应的特殊对象类型不直接支持JSON序列化或Pandas的json_normalize方法,文章提供了一种通过迭代响应、访问内部字典表示并进行字符串替换以构建有效JSON字符串,最终转换为DataFrame的实用解决方案。

本文目录

    将Google API响应转换为Pandas DataFrame:实战指南

    本教程详细介绍了如何将Google Analytics Admin API返回的ListCustomDimensionsPager类对象转换为Pandas DataFrame。由于API响应的特殊对象类型不直接支持JSON序列化或Pandas的json_normalize方法,文章提供了一种通过迭代响应、访问内部字典表示并进行字符串替换以构建有效JSON字符串,最终转换为DataFrame的实用解决方案。

    从Google API响应对象创建Pandas DataFrame

    在与Google API(例如Google Analytics Admin API)交互时,我们经常会遇到其客户端库返回的自定义对象类型,而非直接可用的JSON或Python原生数据结构。这些对象通常是分页器(Pager)或特定于服务的类实例,它们封装了API响应数据,但并不总是能直接被Pandas识别或处理。本教程将以Google Analytics Admin API的ListCustomDimensionsPager为例,演示如何有效地将这类响应转换为结构化的Pandas DataFrame。

    遇到的挑战

    当我们尝试直接将ListCustomDimensionsPager对象转换为Pandas DataFrame时,通常会遇到以下问题:

    1. 直接JSON序列化失败: 尝试使用json.dumps()或访问对象的__dict__、vars()属性进行序列化时,会抛出TypeError: Object of type _GapicCallable is not JSON serializable。这是因为这些对象内部包含不可序列化的方法或属性。
    2. Pandas json_normalize无效: pd.json_normalize()通常用于处理嵌套的JSON数据,但对于非JSON格式的自定义对象,它可能只会生成一个空DataFrame或包含不相关信息的DataFrame。
    3. 直接索引或切片失败: 尝试像字典一样通过键(例如ga4_custom_dimensions['custom_dimensions'])访问数据时,会收到TypeError: 'ListCustomDimensionsPager' object is not subscriptable,表明该对象不支持字典风格的访问。

    这些问题表明,我们需要一种更精细的方法来解析这些自定义对象。

    解决方案:迭代、字符串处理与JSON转换

    解决此问题的核心思路是:迭代分页器对象,对于每个响应项,提取其内部的字典表示,然后通过字符串操作将其转换为符合JSON规范的字符串,最后使用json.loads()将其解析为Python字典,并收集这些字典以构建Pandas DataFrame。

    以下是实现此过程的详细步骤和代码示例:

    1. 获取API响应: 首先,使用Google Analytics Admin API客户端库获取自定义维度列表。

      from google.analytics.admin import AdminServiceClient
      from google.analytics.admin_v1beta.services.analytics_admin_service import pagers
      import pandas as pd
      import json
      
      def get_custom_dimensions_raw(property_filter: str) -> pagers.ListCustomDimensionsPager:
          """
          获取Google Analytics Admin API的原始自定义维度响应。
          """
          client = AdminServiceClient()
          request = pagers.ListCustomDimensionsRequest(parent=property_filter)
          return client.list_custom_dimensions(request=request)
      
      # 示例调用
      # ga4_custom_dimensions_pager = get_custom_dimensions_raw("properties/YOUR_PROPERTY_ID")
      # print(type(ga4_custom_dimensions_pager))
      # 
    2. 迭代并处理每个响应项:ListCustomDimensionsPager对象是可迭代的。我们可以遍历它,获取每个自定义维度的详细信息。每个迭代项本身也是一个对象,其内部字典表示(通过__dict__访问)包含了所需的数据。然而,这个字典的字符串表示并不完全符合JSON规范,需要进一步处理。

      def get_custom_dimensions_dataframe(property_filter: str) -> pd.DataFrame:
          """
          从Google Analytics Admin API响应中提取自定义维度并转换为Pandas DataFrame。
          """
          client = AdminServiceClient()
          request = pagers.ListCustomDimensionsRequest(parent=property_filter)
          full_response_pager = client.list_custom_dimensions(request=request)
      
          df_list = []
      
          for response_item in full_response_pager:
              # 步骤1: 访问对象的内部字典表示
              step1 = response_item.__dict__
              # 步骤2: 将字典转换为字符串,以便进行字符串替换
              step2 = str(step1)
      
              # 步骤3-11: 执行一系列字符串替换,将非标准格式转换为有效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" :')
              # 针对布尔值,需要确保其是字符串形式的"true"或"false"
              step8 = step7.replace('disallow_ads_personalization: true', ', "disallow_ads_personalization" : "true"')
              # 移除内部的Protobuf对象引用,它们通常以'_pb': 开头
              step9 = step8.replace("'_pb': ", "")
              # 针对枚举值,如EVENT, USER,需要确保它们是字符串形式的"EVENT", "USER"
              step10 = step9.replace(' : EVENT', ' : "EVENT"')
              step11 = step10.replace(' : USER', ' : "USER"')
      
              # 步骤12: 处理Unicode转义字符。
              # 先编码为UTF-8,再解码为unicode_escape,这有助于正确处理一些特殊字符。
              step12 = step11.encode('utf-8').decode('unicode_escape')
      
              # 步骤13: 将处理后的字符串解析为Python字典
              step13 = json.loads(step12)
              df_list.append(step13)
      
          # 步骤14: 从字典列表创建Pandas DataFrame
          return pd.DataFrame(df_list)

    示例使用

    调用更新后的函数即可获得一个包含自定义维度数据的Pandas DataFrame:

    # 替换为你的实际GA4媒体资源ID
    # 例如:"properties/123456789"
    property_id = "properties/YOUR_PROPERTY_ID" 
    custom_dimension_df = get_custom_dimensions_dataframe(property_id)
    
    print(custom_dimension_df.head())

    这将输出一个DataFrame,其中包含name、parameter_name、display_name、description和scope等列,每行代表一个自定义维度。

    注意事项与最佳实践

    • 字符串替换的局限性: 这种基于字符串替换的方法虽然有效,但它依赖于API响应字符串表示的特定模式。如果Google API的底层Protobuf对象或其__dict__的字符串表示发生显著变化,可能需要调整str.replace()步骤。
    • 优雅性与鲁棒性: 尽管这种方法不是最“优雅”的,但在直接的Protobuf到JSON转换工具不适用或难以集成时,它是一个实用的解决方案。对于更复杂的Protobuf消息,可以考虑使用google.protobuf.json_format库,它提供了更健壮的Protobuf消息到JSON的转换功能。然而,对于本例中__dict__的字符串表示,直接的json_format可能不适用,因为__dict__已经是对Protobuf消息的一种Python包装。
    • 错误处理: 在生产环境中,建议添加try-except块来处理API调用失败或数据解析过程中可能出现的异常。
    • 数据清洗与验证: 在将数据加载到DataFrame后,仍可能需要进行额外的数据清洗、类型转换或验证,以确保数据的准确性和一致性。

    总结

    将Google API返回的自定义对象(如ListCustomDimensionsPager)转换为Pandas DataFrame,需要对原始API响应进行迭代和精细处理。通过访问对象的内部字典表示,并利用一系列字符串替换操作将其转换为有效的JSON格式,我们最终能够成功地将结构化数据加载到Pandas DataFrame中。这种方法提供了一个实用的解决方案,尤其适用于当API响应不直接支持标准JSON序列化工具的场景。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Garden Skills网页开发入门:安装web-design-engineer与HTML页面制作指南
    Garden Skills网页开发入门:安装web-design-engineer与HTML页面制作指南

    面向希望利用Garden Skills辅助前端开发的开发者,介绍如何安装web-design-engineer技能以补充页面设计与实现流程。针对新手常遇到的环境配置模糊、需求描述笼统及移动端适配缺失等痛点,本文详解通过npx按需安装技能、编写具体页面需求文档、获取可编辑的HTML/CSS代码以及进行多端布局验收的完整路径,帮助用户高效生成符合规范的静态页面结构。

    gstack安装与入门:在Claude Code中实现代码审查和网页测试
    gstack安装与入门:在Claude Code中实现代码审查和网页测试

    面向使用Claude Code的开发者,介绍gstack技能集合的安装与基础用法。解决环境配置复杂及自动化测试门槛高的问题,涵盖Bun环境依赖检查、Git克隆安装步骤,以及通过/review进行代码审查和/qa执行隔离网页测试的具体操作路径,帮助新手安全地验证代码改动与前端交互。

    安装VisualStudio2026提示Windows版本不兼容解决
    安装VisualStudio2026提示Windows版本不兼容解决

    解决 Visual Studio 2026 安装时的 Windows 版本不兼容问题。指南涵盖系统版本核对、64 位确认、管理员权限设置、WebView2 与 .NET 依赖检查,以及针对不同报错阶段的处理策略,帮助用户高效完成安装或合理降级。

    怎么单独安装VisualStudio2022生成工具BuildTools
    怎么单独安装VisualStudio2022生成工具BuildTools

    详解 Visual Studio 2022 Build Tools 的独立安装方法,包括 vs_buildtools.exe 下载、工作负载选择技巧以及通过开发者命令提示符验证 cl 和 msbuild 命令的步骤,帮助开发者在无需完整 IDE 的情况下配置构建环境。

    VisualStudio2022社区版和专业版安装包区别在哪
    VisualStudio2022社区版和专业版安装包区别在哪

    Visual Studio 2022 社区版和专业版有何不同?本文从工作负载、许可边界及适用人群三方面进行对比,帮助开发者明确选择依据,避免合规风险并优化开发体验。

    VisualStudio2022安装路径修改到D盘实操方法
    VisualStudio2022安装路径修改到D盘实操方法

    微软官方指出 Visual Studio 2022 仅支持在首次安装时选择 IDE 与下载缓存路径。若需将已安装在 C 盘的 VS2022 迁移至 D 盘,必须执行卸载后重新安装的操作。本文分场景介绍具体步骤,并解释共享组件、SDK 的路径锁定机制及 C 盘占用原因。

    Visual Studio2019更改解决方案名称与项目命名方法
    Visual Studio2019更改解决方案名称与项目命名方法

    在 Visual Studio 2019 中正确更改解决方案和项目名称的方法指南。包括如何区分解决方案名、项目名与命名空间,使用快捷键 Ctrl+Alt+L 打开资源管理器进行重命名,以及后续对 .sln 文件、.csproj 文件和代码 namespace 的同步调整与验证步骤。

    VisualStudio2026企业版离线安装包创建详细步骤
    VisualStudio2026企业版离线安装包创建详细步骤

    通过 Microsoft 官方文档确认的 vs_enterprise.exe 引导程序,逐步指导用户创建包含特定工作负载的离线布局,实现跨设备的高效部署与更新。

    VisualStudio2019命令行参数自定义安装工作负载
    VisualStudio2019命令行参数自定义安装工作负载

    详解 Visual Studio 2019 命令行安装方法,包括使用 --add 指定工作负载 ID、--includeRecommended 包含推荐组件,以及区分新装与修改实例的正确命令入口,适用于自动化部署场景。

    如何在Visual Studio2022导入已有代码文件夹创建项目
    如何在Visual Studio2022导入已有代码文件夹创建项目

    详解 Visual Studio 2022 如何从现有代码文件夹创建 C++、C# 或 VB 项目,对比打开文件夹与加载 .sln 文件的区别,避免重复构建结构,确保项目配置正确。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。