如何从Python SDK解析嵌套的FB API响应

时间:2015-12-04 15:44:31

标签: python json facebook facebook-graph-api

我使用Facebook Python SDK查询Insights端点并且很难做出响应我使用Python和随后的pandas。我做了以下电话:

   account = AdAccount('act_id')
    params = {
        'fields': [Insights.Field.impressions,Insights.Field.clicks,Insights.Field.actions,Insights.Field.spend],
        'breakdowns': [Insights.Breakdown.hourly_stats_aggregated_by_advertiser_time_zone],
         'time_range': {
            'since': 'start',
            'until': 'end',
        },
        'action_attribution_windows': ['7d_click'],
    }

    result = account.get_insights(params=params)
    print (result)

返回如下数据:

[<Insights> {
    "actions": [
        {
            "7d_click": 600,
            "action_type": "custom_event_xyz",
            "value": 50
        },
        {
            "7d_click": 600,
        ....
        }
    ],
    "clicks": 1500,
    "date_start": "start",
    "date_stop": "end",
    "hourly_stats_aggregated_by_advertiser_time_zone": "00:00:00 - 00:59:59",
    "impressions": "60000",
    "spend": 60
}, <Insights> {
              ....

]

在将不包含actionsdata的数据放入pandas DataFrame时,我无法正确地压缩操作数据,以便聚合级别一致(即&#34; actions&#34;键作为列标题)。在线检查并在Stackoverflow上进行检查,使用python加载json并相应地处理它,然后用pandas读取它们都是不起作用的选项。

总结我不知道如何优雅地挖掘响应的更深层嵌套部分,并轻松地使内容与其余部分兼容。

5 个答案:

答案 0 :(得分:4)

你刚刚遇到了和我一样的问题。 get_insights返回数据就像json,但事实并非如此。你可以知道它是什么类型只使用类型(结果)。这是facebookads.objects.EdgeIterator。您可以使用result = [x for x in result]来更改它的类型,现在'result'的类型是列表!!!然后你可以使用pandas做你想做的任何事情,pandas.DataFrame(结果)。

答案 1 :(得分:1)

您应该使用append将所有信息保存在一个变量中:

results = []

for item in report:   
    data = dict(item)
    results.append(data)
print(results)

答案 2 :(得分:1)

尽管这个问题专门询问有关Pandas DataFrame的问题,但是当您尝试在PySpark / DataBricks DataFrame中使用Facebook API数据时,您可能已经在Google搜索中找到了这个问题。

对于PySpark,您只需要执行1个步骤:您的列表需要包含PySpark Row,而不是常规python dict

这是一个便捷功能,可以将FB API响应转换为Spark-Friendly形式。

from pyspark.sql import Row

def facebook_result_to_rows(facebook_api_response):
  return (Row(**dict(x)) for x in facebook_api_response)

以及我如何使用它的示例:

insights = fb_ad_account.get_insights()
# insights is a python "list" containing many "AdsInsights" objects whose data we want. try print(insights) to see what I mean.
# Those objects are instances of the class AdsInsights found in facebook_business.adobjects.adsinsights. Other API calls have similar response objects.

# Convert said objects into something PySpark can actually work with
frame_data = facebook_result_to_rows(insights)

# Make a dataframe from our transformed data
pyspark_dataframe = spark.createDataFrame(frame_data)

现在您有了一个pyspark_dataframe,您可以使用它来处理所有这些本机pyspark事情,例如.saveAsTable()unionByName(),加入,过滤等。

答案 3 :(得分:0)

您还可以将其转换为字典项目。

for item in result:
    data = dict(item)
    print(data)

现在,您可以像键值对一样解析dict对象,甚至可以转换为json。

答案 4 :(得分:0)

假设您只需要点击(或支出)数据,您也可以使用 windsor.ai 来完成此操作,使用起来更简单一些。您只需将您的 facebook 帐户连接到 windsor.ai,然后使用他们的 Python SDK (pywindsorai) 将数据加载到 Pandas 中。

s///

查看此博客文章以了解有关如何将数据加载到 Pandas 的更多信息:https://www.windsor.ai/multichannel-marketing-data-analysis-via-python-using-pywindsorai/