AdWords API TargetingIdeaPage 服务返回的数据格式是什么?

What is the data format returned by the AdWords API TargetingIdeaPage service?

当我查询 AdWords API 以获取 search volume data and trends through their TargetingIdeaSelector using the Python client library 时,返回的数据如下所示:

(TargetingIdeaPage){
       totalNumEntries = 1
       entries[] = 
          (TargetingIdea){
             data[] = 
                (Type_AttributeMapEntry){
                   key = "KEYWORD_TEXT"
                   value = 
                      (StringAttribute){
                         Attribute.Type = "StringAttribute"
                         value = "keyword phrase"
                      }
                },
                (Type_AttributeMapEntry){
                   key = "TARGETED_MONTHLY_SEARCHES"
                   value = 
                      (MonthlySearchVolumeAttribute){
                         Attribute.Type = "MonthlySearchVolumeAttribute"
                         value[] = 
                            (MonthlySearchVolume){
                               year = 2016
                               month = 2
                               count = 2900
                            },
                            ...
                            (MonthlySearchVolume){
                               year = 2015
                               month = 3
                               count = 2900
                            },
                      }
                },
          },
     }

这不是 JSON,似乎只是一个混乱的 Python 列表。将月度数据展平为具有这样结构的 Pandas 数据框的最简单方法是什么?

Keyword         |  Year  | Month | Count
 keyword phrase    2016      2       10

这是我用来查询 TargetingIdeaSelector 的完整代码,带有 requestType STATS,以及我用来将数据解析为可用数据框的方法;请注意以 "Parse results to pandas dataframe" 开头的部分,因为这会获取上述问题中给出的输出并将其转换为数据帧。可能不是最快或最好的,但它确实有效!使用 Python 2.7.

测试
"""This code pulls trends for a set of keywords, and parses into a dataframe.

The LoadFromStorage method is pulling credentials and properties from a
"googleads.yaml" file. By default, it looks for this file in your home
directory. For more information, see the "Caching authentication information"
section of our README.

"""

from googleads import adwords
import pandas as pd


adwords_client = adwords.AdWordsClient.LoadFromStorage()

PAGE_SIZE = 10

# Initialize appropriate service.
targeting_idea_service = adwords_client.GetService(
    'TargetingIdeaService', version='v201601')

# Construct selector object and retrieve related keywords.
offset = 0
stats_selector = {
    'searchParameters': [
        {
            'xsi_type': 'RelatedToQuerySearchParameter',
            'queries': ['donald trump', 'bernie sanders']
        },
        {
        # Language setting (optional).
        # The ID can be found in the documentation:
        #  https://developers.google.com/adwords/api/docs/appendix/languagecodes
            'xsi_type': 'LanguageSearchParameter',
            'languages': [{'id': '1000'}],
        },
        {
            # Location setting
            'xsi_type': 'LocationSearchParameter',
            'locations': [{'id': '1027363'}]  # Burlington,Vermont
        }
    ],
    'ideaType': 'KEYWORD',
    'requestType': 'STATS',
    'requestedAttributeTypes': ['KEYWORD_TEXT', 'TARGETED_MONTHLY_SEARCHES'],
    'paging': {
        'startIndex': str(offset),
        'numberResults': str(PAGE_SIZE)
    }
}

stats_page = targeting_idea_service.get(stats_selector)


##########################################################################
# Parse results to pandas dataframe


stats_pd = pd.DataFrame()

if 'entries' in stats_page:
    for stats_result in stats_page['entries']:
        stats_attributes = {}
        for stats_attribute in stats_result['data']:
            #print (stats_attribute)
            if stats_attribute['key'] == 'KEYWORD_TEXT':
                kt = stats_attribute['value']['value']
            else:
                for i, val in enumerate(stats_attribute['value'][1]):                
                    data = {'keyword': kt,
                            'year': val['year'],
                            'month': val['month'],
                            'count': val['count']}
                    data = pd.DataFrame(data, index = [i])                
                    stats_pd = stats_pd.append(data, ignore_index=True)


print(stats_pd)

输出是一个 sudsobject。我发现这段代码可以解决问题:

import suds.sudsobject as sudsobject
import pandas as pd
a = [sudsobject.asdict(x) for x in output]
df = pd.DataFrame(a)

Addendum: This was once correct but new versions of the API (I tested 201802) now return a zeep.objects. However, zeep.helpers.serialize_object should do the same trick. link