Как работать с отчетом Яндекс.Директ API Reports с Python

Впервые столкнувшись с работой сервиса Reports в Яндекс.Директ API, меня удивило, что сервис возвращает файл TSV. Видимо, я избалован готовыми решениями и библиотеками от Google, где вы легко найдете методы типа to_dataframe() и подобные. Есть несколько способов сохранять такие файлы, мы покажем лишь несколько из них.
Яндекс.Директ API возвращает ответ в TSV-файле, который представлен в виде потока байтов, поэтому задача состоит из следующих этапов:
- Сделать запрос
- Прочитать ответ методом content
- Обработать в зависимости от способов представленных ниже
Получаем TSV отчет Яндекс.Директ API сразу в DataFrame
Для начала разберемся как сохранить поток байтов в файл. В этом нам поможет BytesIO и Pandas. Конечно, мы можем работать через библиотеку csv. Но мы уже взрослые и будем пользоваться серьезными игрушками. И так, сначала вкратце объясним код приведенный ниже:
- Получаем ответ в виде потока байтов response.content
- Создаем объект BytesIO передав в него наш response.content
- Воспользуемся функцией read_csv с использованием кастомного разделителя. В нашем случае разделителем выступает символ табуляции \t так как TSV (Tab Separated Values).
- Все! В наших руках готовый к работе DataFrame, но что если мы хотим сохранить его в CSV?
- Для этого вызываем функцию to_csv
import requests import pandas as pd from io import BytesIO def get_last_week_cost_report(login, token): # Создание тела запроса body = { "params": { "SelectionCriteria": { }, "FieldNames": [ "Date", "CampaignName", "CampaignId", "Clicks", "Cost" ], "ReportName": "Yesterday Costs Report", "ReportType": "CAMPAIGN_PERFORMANCE_REPORT", "DateRangeType": "LAST_WEEK", "Format": "TSV", "IncludeVAT": "YES", "IncludeDiscount": "NO" } } # адрес для отправки json-запросов url = 'https://api.direct.yandex.com/json/v5/reports' # заголовки headers = {"Authorization": "Bearer " + token, # OAuth-токен. Использование слова Bearer обязательно "Client-Login": login, # Логин клиента рекламного агентства "Accept-Language": "en", # Язык ответных сообщений "skipReportHeader": "true", # Убрали заголовок, чтобы не попал в dataframe "returnMoneyInMicros": "false", # Получаем деньги округленные до двух знаков "skipReportSummary": "true" # Убрали тотал, чтобы не крашить apply } # POST-запрос к API response = requests.post(url, json=body, headers=headers) # Способ с Pandas file_from_bytes = BytesIO(response.content) # Получаем DataFrame из BytesIO df = pd.read_csv(file_from_bytes, delimiter='\t') # Данный метод сохранит DataFrame в CSV, аналогично можно сохранить и в xlsx через to_excel(), только не забудьте установить xlrd df.to_csv('Report.csv') return df to_bq_df = get_last_week_cost_report('ЛОГИН', 'ТОКЕН')
Сегодня мы научились:
- Получать поток байтов в ответ запрос к сервису Reports Яндекс.Директ API
- Создавать объект BytesIO, для его последующего использования
- Создавать DataFrame из объекта BytesIO
- Сохранять ответ Reports API в CSV
Документация по BytesIO: https://docs.python.org/3/library/io.html#io.BytesIO
Документация по Content Requests: https://docs.python-requests.org/en/master/user/quickstart/#response-content