Pandas在BQ表中组合多个列以生成FB转换api的有效负载

Pandas在BQ表中组合多个列以生成FB转换api的有效负载,pandas,dataframe,facebook-graph-api,google-bigquery,Pandas,Dataframe,Facebook Graph Api,Google Bigquery,我从一个bigquery表中读取数据,生成一个有效负载,上传到FB conversions api cols=[“有效负载”、“客户端\用户\代理”、“事件\源\ url”] 我直接从bq表复制列值,因为我无法在笔记本中打印数据框的完整输出 payload="{"pageDetail":{"pageName":"Confirmation","pageContentType":"cart"

我从一个bigquery表中读取数据,生成一个有效负载,上传到FB conversions api

cols=[“有效负载”、“客户端\用户\代理”、“事件\源\ url”] 我直接从bq表复制列值,因为我无法在笔记本中打印数据框的完整输出

payload="{"pageDetail":{"pageName":"Confirmation","pageContentType":"cart","pageSiteSection":"cart","breadcrumbs":[{"title":"Home","url":"/en/home.html"},{"title":"Cart","url":"/cart"},{"title":"Confirmation","url":"/order-confirmation="}],"pageCategory":"Home","pageCategory1":"Cart","pageCategory2":"Confirmation","proBtbGlobalHeader":false},"orderDetails":{"hceid":"3b94a","orderConfirmed":true,"orderDate":"2021-01-15","orderId":"0123","unique":2,"pricingSummary":{"total":54.01},"items":[{"productId":"0456","quantity":1,"shippingAddress":{"postalCode":"V4N 3X3"},"promotion":{"voucherCode":null},"clickToInstall":{"eligible":false}},{"productId":"0789","quantity":1,"fulfillment":{"fulfillmentCost":""},"shippingAddress":{"postalCode":"A4N 3Y3"},"promotion":{"voucherCode":null},"clickToInstall":{"eligible":false}}],"billingAddress":{"postalCode":"M$X1A7"}},"event":{"type":"Load","page":"Confirmation","timestamp":1610706772998,"language":"English","url":"https://www"}}"

client_user_agent="Mozilla/5.0"
event_source_url= "https://www.def.com="
我需要email=[orderDetails][hceid]和value=[“orderDetails”][“pricingSummary”][“total”]

最初,我想要的所有有效负载都在一列中,我能够通过以下代码实现上传

import time
from facebook_business.adobjects.serverside.event import Event
from facebook_business.adobjects.serverside.event_request import EventRequest
from facebook_business.adobjects.serverside.user_data import UserData
from facebook_business.adobjects.serverside.custom_data import CustomData
from facebook_business.api import FacebookAdsApi
import pandas as pd
import json

FacebookAdsApi.init(access_token=access_token)
query='''SELECT  JSON_EXTRACT(payload, '$') AS payload FROM `project.dataset.events` WHERE eventType = 'Page Load' AND pagename = "Confirmation" limit 1'''
df = pd.read_gbq(query, project_id= project, dialect='standard')
payload = df.to_dict(orient="records")
for i in payload:
    #print(type(i["payload"]))
    k = json.loads(i["payload"])
    email = k["orderDetails"]["hcemuid"]
    user_data = UserData(email)
    value=k["orderDetails"]["pricingSummary"]["total"]
    order_id = k["orderDetails"]["orderId"]
    custom_data = CustomData(
        currency='CAD',
        value=value)
    event = Event(
        event_name='Purchase',
        event_time=int(time.time()),
        user_data=user_data,
        custom_data=custom_data,
        event_id = order_id,
        data_processing_options= [])
    events = [event]
    #print(events)
    event_request = EventRequest(
        events=events,
        test_event_code='TEST8609',
        pixel_id=pixel_id)
    #print(event_request)
    a=event_request.execute()
    print(a)
现在,在上面的代码中,有一些附加值client_user_agent需要作为用户数据的一部分,而event_source_url则作为事件的一部分,在GBQ表中以两个不同的列的形式出现

我已经为多个列尝试了与上面类似的代码,但我收到了一个

TypeError: Object of type Series is not JSON serializable
因此,我尝试连接这些列,然后创建一个json可序列化对象,但无法进行上载

下面是我被困住和迷路的地方,我不知道如何继续下去

import time
from facebook_business.adobjects.serverside.event import Event
from facebook_business.adobjects.serverside.event_request import EventRequest
from facebook_business.adobjects.serverside.user_data import UserData
from facebook_business.adobjects.serverside.custom_data import CustomData
from facebook_business.api import FacebookAdsApi
import pandas as pd
import json
FacebookAdsApi.init(access_token=access_token)
query='''SELECT  payload  AS payload,location.userAgent as client_user_agent,location.referrer as event_source_url FROM `project.Dataset.events` WHERE eventType = 'Page Load' AND pagename = "Confirmation" limit 1'''
df = pd.read_gbq(query, project_id= project, dialect='standard')
df.reset_index(drop=True, inplace=True)
payload = df.to_dict(orient="records")
print(payload)
## cols = ['payload', 'client_user_agent', 'event_source_url']
## df['combined'] = df[cols].apply(lambda row: ','.join(row.values.astype(str)), axis=1)
## del df["payload"]
## del df["client"]
## del df["source"]
## payload = df.to_dict(orient="records")
#tried concatinating all columns in a the dataframe but not able to create a valid json object for upload
columns = ['payload', 'client_user_agent', 'event_source_url']
df['payload'] = df['payload'].str.replace(r'}"$', '')
payload = df[columns].to_dict(orient='records')
print(payload)
## df = df.drop(columns=columns)
## pd.options.display.max_rows = 4000
# #print(payload)
# for i in payload:
#     print(i["payload"])
#     k = json.loads(i["payload"])
#     email = k["orderDetails"]["hcemuid"]
#     print(email)

我按照本页的说明进行操作:

我使用了bigquery json_extract_scalar函数从嵌套列中提取数据,而不是pandas,这对于我的场景来说是一个相对更好的解决方案