الحصول على إحصاءات لجميع العملاء من API Yandex.Direct بالأيام باستخدام Python

في عملي ، غالبًا ما أستخدم إحصائيات قصيرة حسب الأيام لتتبع انحرافات المرور.

لقد كتب المزيد حول كتابة الطلبات في مقالة "Getting Yandex.Direct الحملات الإعلانية المباشرة باستخدام API في DataFrame (Python)" .

في هذه المقالة ، سأتحدث أكثر عن كيفية تنظيم البيانات والاستعلامات بحيث يمكن استخدامها بشكل طبيعي.

يجب أن نسجل طلب الخادم كدالة.

شخصيا ، قمت بعمل ملفين: وظيفة مع طلب وملف به بيانات سيتم نقلها إلى الوظيفة.

في الملف الأول نكتب وظيفة


أطلب نفس الحقول لجميع المشاريع ، لذلك أنا بحاجة إلى تمرير في طلب فقط التواريخ وتسجيل الدخول والرمز المميز.

يبدو نقل البيانات إلى دالة بالنسبة لي كما يلي:

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

نكتب طلبًا إلى خادم واجهة برمجة تطبيقات Yandex.Direct


يطلب هذا الاستعلام بيانات للمعلمات التالية:

  • تاريخ
  • الانطباعات
  • نقرات
  • نسبة النقر إلى الظهور
  • كلفة
  • متوسط ​​تكلفة النقرة
  • AvgImpressionPosition
  • AvgClickPosition
  • AvgTrafficVolume
  • معدل الارتداد
  • AvgPageviews

ملف الطلب النهائي


قانون
 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 ملف


نأخذ التواريخ والتسجيلات والرموز بشكل منفصل كمتغيرات.


شيء مثل هذا:

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

مزيد من التفاصيل:

  1. اسم المشروع ("=" نستخدمه لاختيار أفضل ، حتى لا نضيع في المعلومات)
  2. البيانات - اكتب إلى هذا السطر المتغيرات المشار إليها أعلاه. (هذا الخط سينفذ الملف الأول)
  3. نكتب استجابة الخادم لملف
  4. افتح الملف كـ DataFrame
  5. أضف إلى القيم النقدية لضريبة القيمة المضافة.
  6. نحن نترجم القيم النقدية إلى روبل عادي (كمعيار ، API لا يستخدم الروبل ، لكن روبل * 1،000،000.
  7. إخراج DataFrame لدينا



الملف الثاني هو كما يلي:


قانون
 # 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) 


نكتب جميع المشاريع في الملف الثاني ، وبعد ذلك يجب علينا عرض إحصائيات لجميع المشاريع.

بعد ذلك ، نحتاج فقط إلى تغيير طول الوقت في حقول DateFrom و DateTo.

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


All Articles