Obtenir des statistiques pour tous les clients à partir de l'API Yandex.Direct en jours en utilisant Python

Dans mon travail, j'utilise souvent de courtes statistiques par jour pour suivre les écarts de trafic.

Il a écrit plus sur l'écriture de demandes dans l' article «Obtenir des campagnes publicitaires Yandex.Direct Direct en utilisant l'API dans DataFrame (Python)» .

Dans cet article, je parlerai davantage de la façon de structurer les données et les requêtes afin qu'elles puissent être utilisées normalement.

Nous devons enregistrer la demande du serveur en tant que fonction.

Personnellement, j'ai fait 2 fichiers: une fonction avec une demande et un fichier avec des données qui seront transférées à la fonction.

Dans le premier fichier, nous écrivons une fonction


Je demande les mêmes champs pour tous les projets, je dois donc saisir uniquement les dates de demande, la connexion et le jeton.

Pour moi, passer des données à une fonction ressemble à ceci:

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

Nous écrivons une demande au serveur API Yandex.Direct


Cette requête demande des données pour les paramètres suivants:

  • Date
  • Impressions
  • Clics
  • Ctr
  • Coût
  • Avgcpc
  • AvgImpressionPosition
  • AvgClickPosition
  • AvgTrafficVolume
  • Bouncerate
  • AvgPageviews

Le dossier de demande final


Code
 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 fichier


Nous supprimons les dates, les connexions et les jetons séparément en tant que variables.


Quelque chose comme ça:

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

Ceci est fait afin de modifier facilement les informations sur tous les clients et les dates des rapports.

Code pour demander les statistiques du projet


 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) 

Plus de détails:

  1. Le nom du projet ("=" nous utilisons pour une meilleure sélection, afin de ne pas se perdre dans les informations)
  2. Données - Écrivez sur cette ligne les variables déjà indiquées ci-dessus. (cette ligne exécutera le premier fichier)
  3. Nous écrivons la réponse du serveur à un fichier
  4. Ouvrez le fichier en tant que DataFrame
  5. Ajoutez aux valeurs monétaires de la TVA.
  6. Nous traduisons les valeurs monétaires en roubles ordinaires (en standard, l'API n'utilise pas de roubles, mais des roubles * 1000000).
  7. Sortie de notre DataFrame



Le deuxième fichier est le suivant:


Code
 # 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) 


Nous écrivons tous les projets dans le deuxième fichier, après quoi nous devons afficher les statistiques de tous les projets.

Après cela, il nous suffit de modifier la durée dans les champs DateFrom et DateTo.

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


All Articles