DataFrameでAPIを使用してYandex Direct広告キャンペーンを取得する(Python)

一度に複数のクライアントで作業する場合、さまざまなアカウントやレポートの多くの情報をすばやく分析する必要があります。 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が欠落しているデータを2つのマイナスとして表示することです。そのため、列全体のデータ型が変更され、その後、不必要なジェスチャーなしで数学演算を実行できません。



FieldNames ここに必要なデータを書き込みます。 分析に使用するフィールドを登録しました。リストは異なる場合があります。



ReportType レポートのタイプはこのフィールドに書き込まれます。キャンペーンにはこのレポートが必要です。



このようなものを取得する必要があります。



画像



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,)
      
      





ステップバイステップ:





次のことが判明しました。



画像



列の出力に関する制限を削除します。



  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)
      
      








All Articles