Obteniendo estadísticas para todos los clientes de la API Yandex.Direct por días usando Python

En mi trabajo, a menudo uso estadísticas cortas por días para rastrear las desviaciones del tráfico.

Escribió más sobre cómo escribir solicitudes en el artículo "Cómo obtener campañas de publicidad directa de Yandex.Direct usando una API en un DataFrame (Python)" .

En este artículo, hablaré más sobre cómo estructurar datos y consultas para que puedan usarse normalmente.

Deberíamos registrar la solicitud del servidor como una función.

Personalmente, hice 2 archivos: una función con una solicitud y un archivo con datos que se transferirán a la función.

En el primer archivo escribimos una función


Solicito los mismos campos para todos los proyectos, por lo que necesito pasar las fechas de solicitud, inicio de sesión y token.

Pasar datos a una función para mí se ve así:

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

Estamos escribiendo una solicitud al servidor Yandex.Direct API


Esta consulta solicita datos para los siguientes parámetros:

  • Fecha
  • Impresiones
  • Clics
  • Ctr
  • Costo
  • Avgcpc
  • AvgImpressionPosition
  • AvgClickPosition
  • AvgTrafficVolume
  • Rebotar
  • AvgPageviews

El archivo de solicitud final


Código
 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 archivo


Sacamos las fechas, los inicios de sesión y los tokens por separado como variables.


Algo como esto:

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

Esto se hace para cambiar fácilmente la información de todos los clientes y las fechas de los informes.

Código para solicitar estadísticas del proyecto


 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) 

Más detalles:

  1. El nombre del proyecto ("=" lo usamos para una mejor selección, para no perderse en la información)
  2. Datos: escriba en esta línea las variables que ya se han indicado anteriormente. (esta línea ejecutará el primer archivo)
  3. Escribimos la respuesta del servidor a un archivo
  4. Abra el archivo como un DataFrame
  5. Agregar a los valores monetarios del IVA.
  6. Traducimos los valores monetarios a rublos ordinarios (como estándar, la API no usa rublos, sino rublos * 1,000,000.
  7. Salida de nuestro DataFrame



El segundo archivo es el siguiente:


Código
 # 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) 


Escribimos todos los proyectos en el segundo archivo, después de lo cual debemos mostrar estadísticas para todos los proyectos.

Después de eso, solo necesitamos cambiar el período de tiempo en los campos DateFrom y DateTo.

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


All Articles