Mendapatkan statistik untuk semua klien dari Yandex.Direct API berdasarkan hari menggunakan Python

Dalam pekerjaan saya, saya sering menggunakan statistik pendek dalam konteks hari untuk melacak penyimpangan lalu lintas.

Dia menulis lebih banyak tentang menulis permintaan dalam artikel "Mendapatkan Yandex. Kampanye Periklanan Langsung Langsung Menggunakan API dalam DataFrame (Python)" .

Pada artikel ini, saya akan berbicara lebih banyak tentang bagaimana menyusun data dan permintaan sehingga dapat digunakan secara normal.

Kami harus mendaftarkan permintaan server sebagai fungsi.

Secara pribadi, saya membuat 2 file: fungsi dengan permintaan dan file dengan data yang akan ditransfer ke fungsi.

Pada file pertama kita menulis sebuah fungsi


Saya meminta bidang yang sama untuk semua proyek, jadi saya hanya perlu mentransfer tanggal, masuk, dan token ke dalam permintaan.

Melewati data ke fungsi bagi saya terlihat seperti ini:

def rep(token,login,date_from,date_to): 

Kami sedang menulis permintaan ke server API Yandex.Direct


Permintaan ini meminta data untuk parameter berikut:

  • Tanggal
  • Tayangan
  • Klik
  • Rkt
  • Biaya
  • Rata-rata bpk
  • Posisi Posisi Rata-Rata
  • AvgClickPosition
  • Volume Rata-rata
  • Bouncerate
  • Tampilan Rata-Rata

File permintaan terakhir


Kode
 import requests from requests.exceptions import ConnectionError from time import sleep import json #        UTF-8   Python 3,    Python 2 import sys def rep(token,login,date_from,date_to): 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 = token #     #  ,        clientLogin = login # ---   --- #  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": { "DateFrom": date_from, "DateTo": date_to }, "FieldNames": [ "Date", "Impressions", "Clicks", "Ctr", "Cost", "AvgCpc", "AvgImpressionPosition", "AvgClickPosition", "AvgTrafficVolume", "BounceRate", "AvgPageviews", ], "ReportName": u("Report4"), "ReportType": "ACCOUNT_PERFORMANCE_REPORT", "DateRangeType": "CUSTOM_DATE", "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 json_string = json.dumps(body) return req.text 


2 file


Kami mengambil tanggal, masuk dan token secara terpisah sebagai variabel.


Sesuatu seperti ini:

 # mytoken='blablablablaBLABLAsdfgsrgkdfgnf' # project = 'elama-99999999' # DateFrom="2019-04-08" DateTo="2019-04-16" 

Hal ini dilakukan agar mudah mengubah informasi tentang semua pelanggan, dan tanggal laporan.

Kode untuk meminta statistik proyek


 print( '\n=== ===') data=rep(mytoken,project,DateFrom,DateTo) file=open("cashe.csv","w") file.write(data) file.close() f=DataFrame.from_csv("cashe.csv",header=1,sep=' ',index_col=0,parse_dates=True) f['Cost']=f['Cost']*1.2 f['Cost']=f['Cost']/1000000 f['AvgCpc']=f['AvgCpc']*1.2 f['AvgCpc']=f['AvgCpc']/1000000 print(f) 

Lebih detail:

  1. Nama proyek ("=" kami gunakan untuk seleksi yang lebih baik, agar tidak tersesat dalam informasi)
  2. Data - Tulis ke baris ini variabel yang sudah ditunjukkan di atas. (baris ini akan menjalankan file pertama)
  3. Kami menulis respons server ke file
  4. Buka file sebagai DataFrame
  5. Tambahkan ke nilai moneter PPN.
  6. Kami menerjemahkan nilai moneter ke dalam rubel biasa (sebagai standar, API tidak menggunakan rubel, tetapi rubel * 1.000.000.
  7. Keluarkan DataFrame kami



File kedua adalah sebagai berikut:


Kode
 # import pandas as pd import numpy as np from pandas import Series,DataFrame from     import rep #   pd.set_option('display.max_columns',None) pd.set_option('display.expand_frame_repr',False) pd.set_option('max_colwidth',-1) # mytoken='blablablablaBLABLAsdfgsrgkdfgnf' # project = 'elama-99999999' # DateFrom="2019-04-08" DateTo="2019-04-16" print( '\n=== ===') data=rep(mytoken,project,DateFrom,DateTo) file=open("cashe.csv","w") file.write(data) file.close() f=DataFrame.from_csv("cashe.csv",header=1,sep=' ',index_col=0,parse_dates=True) f['Cost']=f['Cost']*1.2 f['Cost']=f['Cost']/1000000 f['AvgCpc']=f['AvgCpc']*1.2 f['AvgCpc']=f['AvgCpc']/1000000 print(f) 


Kami menulis semua proyek di file kedua, setelah itu kami akan menampilkan statistik untuk semua proyek.

Setelah itu, kita hanya perlu mengubah lamanya waktu di bidang DateFrom dan DateTo.

Source: https://habr.com/ru/post/id449392/


All Articles