4

I am using Google Ads API SDK for Python. I want to get some Ads data and put them into a Dataframe to transform a bit. I made a call with the code below:

client = GoogleAdsClient.load_from_storage("config.yaml")
customer_id = '<customer_id>'
ga_service = client.get_service("GoogleAdsService")
query = """
    SELECT
        campaign.id,
        campaign.name,
        customer.id
    FROM campaign
    """
response = ga_service.search_stream(customer_id=customer_id, query=query)
for batch in response:
    for row in batch.results:
        print(row)
        df = pd.DataFrame(row)
        print(df)

Here is the response I receive:

customer {
  resource_name: "customers/<customer-id>"
  id: <customer-id>
}
campaign {
  resource_name: "customers/<customer-id>/campaigns/<campaign-id>"
  name: "Test_campaign_1"
  id: <campaign-id>
}

Traceback (most recent call last):
  File "c:\Users\User\main.py", line 36, in <module>
    print(dict(row))
TypeError: 'GoogleAdsRow' object is not iterable

I tried using google.protobuf.json_format to convert the result into json/dict format with the below code

from google.protobuf.json_format import MessageToJson
response = ga_service.search_stream(customer_id=customer_id, query=query)
for batch in response:
    for row in batch.results:
        print(row)
        jsonobj = MessageToJson(row)

But I got the below error message:

  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\proto\message.py", line 605, in __getattr__
    raise AttributeError(str(ex))
AttributeError: 'DESCRIPTOR'

Could you please help me with this? Thank you.

Toàn Đoàn
  • 161
  • 8

2 Answers2

4

Sorry for bothering, but I found this question and got the answer for my question.

I changed my code to below (add ._pb to the response):

response = ga_service.search(customer_id=customer_id, query=query)
dictobj = MessageToDict(response._pb)
df = pd.json_normalize(dictobj,record_path=['results'])
print(df)

and it works!

Toàn Đoàn
  • 161
  • 8
0

Many thanks to Toàn!

Regarding the questions mentioned in his previous post, I found the following solution to be effective for my situation:

search_request.query = query
stream = gads_service.search_stream(search_request)

for batch in stream:
    dictobj = MessageToDict(batch._pb)
    df = pd.json_normalize(dictobj,record_path=['results'])
D.U.Kim
  • 1
  • 1
  • 1
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jun 22 '23 at 00:30