如何从Google API响应对象创建Pandas数据框架

bxfogqkk  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(121)

我正在尝试将Google Analytics Admin API响应放入Pandas Dataframe ,但在解析结果时遇到了问题。我正在使用admin_v1beta库中的list customDimensions method。我可以看到结果,但我还没有找到如何将它们转换为可在Pandas中使用的格式。
我的职能:

def get_custom_dimensions(property_filter):
    client = admin_v1beta.AnalyticsAdminServiceClient()

    request = admin_v1beta.ListCustomDimensionsRequest(
        parent=property_filter
    )

    return client.list_custom_dimensions(request=request)

字符串
和输出:

ga4_custom_dimensions = get_custom_dimensions("properties/xxx")

    print(type(ga4_custom_dimensions))

<class 'google.analytics.admin_v1beta.services.analytics_admin_service.pagers.ListCustomDimensionsPager'>

    print(ga4_custom_dimensions)

 
ListCustomDimensionsPager<custom_dimensions {
  name: "properties/xxx/customDimensions/yy1"
  parameter_name: "custom_dimension_zz1"
  display_name: "Custom Dimension ZZ1"
  description: "The dimension ZZ1 useful for filtering."
   scope: EVENT
}
custom_dimensions {
  name: "properties/xxx/customDimensions/yy2"
  parameter_name: "custom_dim...


这个响应有自己的类,所以在我可以对它做任何事情之前,我需要转换它,但我还没有弄清楚如何转换。我的第一个想法是转换为JSON:

custom_dimensions_json_1 = json.dumps(ga4_custom_dimensions.__dict__)
custom_dimensions_json_2 = json.dumps(vars(ga4_custom_dimensions))


这两种方法产生相同的误差,
TypeError: Object of type _GapicCallable is not JSON serializable的。
我的下一次尝试是通过Pandas json_normalize方法:

custom_dimension_df = pd.json_normalize(ga4_custom_dimensions)


结果是只有一个索引的 Dataframe 。
最后,我尝试直接解析结果:

temp_df = pd.DataFrame(ga4_custom_dimensions['custom_dimensions'])[['name',
    'parameter_name',
    'display_name',
    'description',
    'scope']]


这将生成“TypeError:
ListCustomDimensionsPager' object is not subscriptable的值。该值为
有没有人能指导我如何解析Pandas中的API响应?

xpcnnkqh

xpcnnkqh1#

我能够解决这个问题并继续前进。我通过一系列str.replace()步骤更新了我的函数以使响应有效,然后从那里创建pandas框架。

def get_custom_dimensions(property_filter):
    client = admin_v1beta.AnalyticsAdminServiceClient()

    request = admin_v1beta.ListCustomDimensionsRequest(
        parent=property_filter
    )

    full_response = client.list_custom_dimensions(request=request)

    df_list = []

    for response in full_response:
        step1 = response.__dict__
        step2 = str(step1)
        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" :')
        step8 = step7.replace('disallow_ads_personalization: true', ', "disallow_ads_personalization" : "true"')
        step9 = step8.replace("'_pb': ", "")
        step10 = step9.replace(' : EVENT', ' : "EVENT"')
        step11 = step10.replace(' : USER', ' : "USER"')
        step12 = step11.encode('utf-8').decode('unicode_escape')
        step13 = json.loads(step12)
        df_list.append(step13)

    return pd.DataFrame(df_list)

字符串
调用这个函数会产生一个Pandas框架,其中包含可以保存、操作等的响应。

custom_dimension_df = get_custom_dimensions("xxx")


我在python中没有太多处理类对象的经验,我的解决方案不是很优雅,但它很有效。

相关问题