在DataFrame(Python)中使用API​​获取Yandex Direct广告活动

一次与多个客户一起工作时,有必要快速分析不同帐户和报告中的许多信息。 当客户超过10个时,营销商将不再有时间不断监视统计信息。 但是有办法。

在本文中,我将讨论如何使用API​​和Python监视广告帐户。

在出口处,我们将收到对Yandex.Direct API的请求,通过该请求,我们将收到有关广告活动的统计信息,并将能够处理这些数据。

为此,我们需要:

  1. 获取Yandex Direct API令牌
  2. 编写服务器请求
  3. 将数据导入DataFrame

导入库


您需要导入查询中使用的库以及pandas和DataFrame。

所有导入将如下所示:

import requests from requests.exceptions import ConnectionError from time import sleep import json import pandas as pd import numpy as np from pandas import Series,DataFrame 

接收令牌


目前,我不能说比Yandex.Direct API的文档更好的内容,所以我将留下一个链接。

获取令牌的说明

我们正在向Yandex.Direct API服务器发送请求


复制API文档中的请求

更改请求。

  • 规定您的令牌和登录名

令牌。

令牌='blaBlaBLAblaBLABLABLAblabla'

登入

clientLogin ='e-66666666'

  • 我们为自己调整请求主体。

从这个

 body = { "params": { "SelectionCriteria": { "DateFrom": "_", "DateTo": "_" }, "FieldNames": [ "Date", "CampaignName", "LocationOfPresenceName", "Impressions", "Clicks", "Cost" ], "ReportName": u("_"), "ReportType": "CAMPAIGN_PERFORMANCE_REPORT", "DateRangeType": "CUSTOM_DATE", "Format": "TSV", "IncludeVAT": "NO", "IncludeDiscount": "NO" 

做吧

  body = { "params": { "SelectionCriteria": { "Filter": [ { "Field": "Clicks", "Operator": "GREATER_THAN", "Values": [ "0" ] }, ] }, "FieldNames": [ "CampaignName", "Impressions", "Clicks", "Ctr", "Cost", "AvgCpc", "BounceRate", "AvgPageviews", "ConversionRate", "CostPerConversion", "Conversions" ], "ReportName": u("Report4"), "ReportType": « ", "DateRangeType": "LAST_5_DAYS", "Format": "TSV", "IncludeVAT": "NO", "IncludeDiscount": "NO" } } 

SelectionCriteria中,我们编写了如何选择数据。 默认情况下,此处写有2个日期,但是为了不必经常更改它们,我们将时间段替换为“过去5天”。

我们为数据设置过滤器 。 这主要是为了不获取空值。 问题是Direct会将丢失的数据显示为两个负号,这导致整个列的数据类型发生更改,在此之后,如果没有不必要的手势,您将无法执行数学运算。

栏位名称 我们在这里写入您需要的数据。 我注册了用于分析的字段,您的列表可能会有所不同。

报告类型 报告类型写在此字段中,对于广告系列,需要此报告。

你应该得到这样的东西。

图片

5.将数据导入到DataFrame中。

(DataFrame可能是处理此数据的最合适方法。)

我能够通过编写和读取一个csv文件来实现此功能。
我们在查询中找到负责统计输出的部分-这是“ req.text”。

我们删除程序的标准输出以写入文件。 为此,请更改代码200中的所有结论。

  print("  ") print("RequestId: {}".format(req.headers.get("RequestId", False))) print(" : \n{}».format(u(req.text))) 

开启:

  format(u(req.text)) 

现在将服务器响应导入到DataFrame中。

  file = open("cashe.csv", "w") file.write(req.text) file.close() f = DataFrame.from_csv("cashe.csv",header=1, sep=' ', index_col=0,) 

逐步:

  • 打开(并自动创建)Cashe.csv文件进行写入
  • 我们将服务器响应写入其中
  • 关闭档案
  • 以DataFrame的形式打开文件(指定文件名,表头在哪行,数据之间的除数是什么,列在索引中)

结果是:

图片

我们删除了对列输出的限制:

  pd.set_option('display.max_columns', None) pd.set_option('display.expand_frame_repr', False) pd.set_option('max_colwidth', -1) 

现在一切都显示了:

图片

唯一的问题是,货币价值没有按其期望显示。 这些是Yandex.Direct API实现的功能。 我们只需要将货币值除以1,000,000。

 f['Cost'] = f['Cost']/1000000 f['AvgCpc'] = f['AvgCpc']/1000000 f['CostPerConversion'] = f['CostPerConversion']/1000000 

我还建议立即按点击次数排序

 f=f.sort_values(by=['Clicks'], ascending=False) 

所以我们准备好DataFrame进行分析

图片

就我自己而言,我按日期和按活动编写了类似的统计请求,以便始终了解流量偏差并了解偏差大致在何处发生。

谢谢您的关注。

结束码:
 import requests from requests.exceptions import ConnectionError from time import sleep import json import pandas as pd import numpy as np from pandas import Series,DataFrame pd.set_option('display.max_columns', None) pd.set_option('display.expand_frame_repr', False) pd.set_option('max_colwidth', -1) #        UTF-8   Python 3,    Python 2 import sys if sys.version_info < (3,): def u(x): try: return x.encode("utf8") except UnicodeDecodeError: return x else: def u(x): if type(x) == type(b''): return x.decode('utf8') else: return x # ---   --- #   Reports   JSON- () ReportsURL = 'https://api.direct.yandex.com/json/v5/reports' # OAuth- ,       token = ' ' #     #  ,        clientLogin = ' ' # ---   --- #  HTTP-  headers = { # OAuth-.   Bearer  "Authorization": "Bearer " + token, #     "Client-Login": clientLogin, #    "Accept-Language": "ru", #    "processingMode": "auto" #      # "returnMoneyInMicros": "false", #            # "skipReportHeader": "true", #         # "skipColumnHeader": "true", #          # "skipReportSummary": "true" } #    body = { "params": { "SelectionCriteria": { "Filter": [ { "Field": "Clicks", "Operator": "GREATER_THAN", "Values": [ "0" ] }, ] }, "FieldNames": [ "CampaignName", "Impressions", "Clicks", "Ctr", "Cost", "AvgCpc", "BounceRate", "AvgPageviews", "ConversionRate", "CostPerConversion", "Conversions" ], "ReportName": u("Report4"), "ReportType": "CAMPAIGN_PERFORMANCE_REPORT", "DateRangeType": "LAST_5_DAYS", "Format": "TSV", "IncludeVAT": "NO", "IncludeDiscount": "NO" } } #     JSON body = json.dumps(body, indent=4) # ---      --- #   HTTP- 200,     #   HTTP- 201  202,    while True: try: req = requests.post(ReportsURL, body, headers=headers) req.encoding = 'utf-8' #      UTF-8 if req.status_code == 400: print("         ") print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON- : {}".format(u(body))) print("JSON-  : \n{}".format(u(req.json()))) break elif req.status_code == 200: format(u(req.text)) break elif req.status_code == 201: print("       ") retryIn = int(req.headers.get("retryIn", 60)) print("    {} ".format(retryIn)) print("RequestId: {}".format(req.headers.get("RequestId", False))) sleep(retryIn) elif req.status_code == 202: print("    ") retryIn = int(req.headers.get("retryIn", 60)) print("    {} ".format(retryIn)) print("RequestId: {}".format(req.headers.get("RequestId", False))) sleep(retryIn) elif req.status_code == 500: print("    . ,    ") print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON-  : \n{}".format(u(req.json()))) break elif req.status_code == 502: print("     .") print(",     -      .") print("JSON- : {}".format(body)) print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON-  : \n{}".format(u(req.json()))) break else: print("  ") print("RequestId: {}".format(req.headers.get("RequestId", False))) print("JSON- : {}".format(body)) print("JSON-  : \n{}".format(u(req.json()))) break #  ,       API  except ConnectionError: #         print("     API") #     break #   -   except: #         print("  ") #     break file = open("cashe.csv", "w") file.write(req.text) file.close() f = DataFrame.from_csv("cashe.csv",header=1, sep=' ', index_col=0,) f['Cost'] = f['Cost']/1000000 f['AvgCpc'] = f['AvgCpc']/1000000 f['CostPerConversion'] = f['CostPerConversion']/1000000 f=f.sort_values(by=['Clicks'], ascending=False) print(f) 

Source: https://habr.com/ru/post/zh-CN445734/


All Articles