{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог об аналитике, визуализации данных, data science и BI, заметки с тегом: Facebook",
    "home_page_url": "http:\/\/test.leftjoin.ru\/tags\/facebook\/",
    "feed_url": "http:\/\/test.leftjoin.ru\/tags\/facebook\/json\/",
    "icon": "http:\/\/test.leftjoin.ru\/user\/userpic@2x.jpg",
    "author": {
        "name": "Николай Валиотти",
        "url": "http:\/\/test.leftjoin.ru\/",
        "avatar": "http:\/\/test.leftjoin.ru\/user\/userpic@2x.jpg"
    },
    "items": [
        {
            "id": "133",
            "url": "http:\/\/test.leftjoin.ru\/all\/deploy-airbyte-with-facebook-api\/",
            "title": "Как развернуть Airbyte и подключить к нему Facebook API?",
            "content_html": "<p>В этой статье мы покажем, как развернуть open-source сервис Airbyte на вашем компьютере и с его помощью подключиться к Facebook Marketing API.<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/1-3.jpg\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<h2>Что такое Airbyte?<\/h2>\n<p>Airbyte — это платформа интеграции данных с открытым исходным кодом для создания ELT пайплайнов, которая помогает вам реплицировать данные в ваших хранилищах, озерах и базах данных. Кроме того, она имеет удобный интерфейс, который очень красиво оформлен (вы только посмотрите на эту осьминожку)!<\/p>\n<h2>Разворачиваем Airbyte<\/h2>\n<p>Установка Airbyte на машину выполняется достаточно просто. В этом можно убедиться, заглянув в <a href=\"https:\/\/docs.airbyte.com\/quickstart\/deploy-airbyte\">официальную документацию<\/a>. Для этого выполнить несколько шагов:<\/p>\n<ol start=\"1\">\n<li>Установить Docker (см. <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\">Инструкции<\/a>) и убедиться, что у вас стоит последняя версия docker-compose.<\/li>\n<li>Выполнить следующие команды в терминале:<\/li>\n<\/ol>\n<ul>\n<li><a href=\"https:\/\/github.com\/airbytehq\/airbyte.git\">git clone<\/a><\/li>\n<li>cd airbyte<\/li>\n<li>docker-compose up<\/li>\n<\/ul>\n<p>Как только в выводе терминала появится баннер Airbyte, UI станет доступен по адресу <a href=\"http:\/\/localhost:8000.\">http:\/\/localhost:8000.<\/a><\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/1-31.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<h2>Подключаем Facebook<\/h2>\n<p>С полной документацией по работе с Facebook Marketing из Airbyte можно ознакомиться <a href=\"https:\/\/docs.airbyte.com\/integrations\/sources\/facebook-marketing\">по ссылке<\/a>. Мы же дадим выжимку из нее. Итак, для того, чтобы подключить Facebook в Airbyte, надо учесть следующие условия:<\/p>\n<ul>\n<li>Наличие Facebook Ad Account ID (<a href=\"https:\/\/www.facebook.com\/business\/help\/1492627900875762\">где его найти?<\/a>)<\/li>\n<li>Наличие Facebook App с включенным Marketing API (<a href=\"https:\/\/developers.facebook.com\/docs\/marketing-apis\/get-started\/\">подробнее<\/a>)<\/li>\n<li>Наличие Facebook Marketing API Access Token (<a href=\"https:\/\/developers.facebook.com\/docs\/facebook-login\/guides\/access-tokens#apptokens\">подробнее<\/a>)<\/li>\n<li>Запросить увеличение лимита на количество запросов: Facebook сильно ограничивает токены API, сгенерированные из приложений Facebook с уровнем «Стандартный доступ» (по умолчанию для новых приложений именно такой уровень доступа), что делает невозможным использование токена для синхронизации с Airbyte. Вам нужно будет запросить апгрейд до расширенного доступа для вашего приложения со следующими разрешениями (<a href=\"https:\/\/developers.facebook.com\/docs\/marketing-api\/overview\/authorization\/#access-levels\">подробнее<\/a>):\n<ul>\n  <li>Ads Management Standard Access<\/li>\n  <li>ads_read<\/li>\n  <li>Ads_management<\/li>\n<\/ul>\n<\/li>\n<li>Перед этим вам нужно будет пройти процесс проверки вашей компании (<a href=\"https:\/\/www.facebook.com\/business\/help\/2058515294227817?id=180505742745347\">подробнее<\/a>).<\/li>\n<\/ul>\n<p>После этого можно подключить Facebook в Airbyte.<\/p>\n<ol start=\"1\">\n<li>Заходим в UI на вкладку Sources и нажимаем ‘+ new source’<\/li>\n<\/ol>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/2-30.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<ol start=\"2\">\n<li>Выбираем в качестве источника Facebook Marketing и прописываем конфигурации подключения:\n<ul>\n  <li>Название источника, под которым он будет отображаться в Airbyte<\/li>\n  <li>Facebook Ad Account ID<\/li>\n  <li>Дата начала — с этого момента будут грузиться данные из Facebook (⚠️ВАЖНО: Данные по инсайтам можно получить только за последние 37 месяцев)<\/li>\n  <li>Дата окончания — до этого момента будут грузиться данные из Facebook (можно оставить пустым, чтобы получать последние данные из аккаунта)<\/li>\n  <li>Facebook Marketing API Access Token<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/3-26.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<ol start=\"3\">\n<li>Также имеются несколько дополнительных конфигурационных опций:\n<ul>\n  <li>Включение удаленных данных Campaigns, Ads и AdSets<\/li>\n  <li>Сохранение миниатюр изображений<\/li>\n  <li>Настройка кастомных Insignts<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/4-17.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<ol start=\"4\">\n<li>После заполнения полей нажимаем ‘Set up source’ и ждем, пока процесс подключения не завершится<\/li>\n<\/ol>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/5-16.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<ol start=\"5\">\n<li>При необходимости настройки подключения к источнику можно поменять на его вкладке ‘Settings’<\/li>\n<\/ol>\n<p>Может возникнуть ошибка в связи с тем, что версия фреймворка устарела. Тогда надо будет перейти в основную вкладку ‘Settings’ (шестеренка в левом нижнем углу), там выбрать ‘Sources’, в списке найти Facebook Marketing и нажать кнопку ‘Change’ (или нажать ‘Upgrade all’, чтобы загрузить все доступные обновления).<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/5.5.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<h2>Подключаем хранилище данных<\/h2>\n<p>После того, как мы подключили Facebook Marketing, нам необходимо связать этот источник с нашим хранилищем данных.<\/p>\n<ol start=\"1\">\n<li>Нажимаем ‘add destination’ на вкладке с настроенным источником (см. пункт 4 предыдущего раздела) либо идем на вкладку ‘Destinations’ и там нажимаем ‘+ new destination’.<\/li>\n<\/ol>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/6-16.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<ol start=\"2\">\n<li>Далее выбираем тип хранилища, с которым будем работать. Airbyte может подключаться к большому количеству популярных СУБД. Опишем необходимые шаги конфигурации на примере работы с PostgreSQL. Заполняем следующие поля:\n<ul>\n  <li>Название хранилища, под которым оно будет отображаться в Airbyte<\/li>\n  <li>Хост<\/li>\n  <li>Порт<\/li>\n  <li>База данных<\/li>\n  <li>Схема<\/li>\n  <li>Пользователь<\/li>\n  <li>Пароль<\/li>\n  <li>Нужно ли использовать SSL<\/li>\n  <li>Параметры SSH туннеля (опционально)<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/7-10.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<ol start=\"3\">\n<li>После заполнения полей нажимаем ‘Set up destination’ и ждем, пока процесс подключения не завершится<\/li>\n<li>Если вы выполняли подключение к хранилищу отдельно с вкладки ‘Destinations’, то надо связать с ним источник, нажав на ‘add source’<\/li>\n<\/ol>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/8-11.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<ol start=\"5\">\n<li>При необходимости настройки подключения к хранилищу можно поменять на его вкладке ‘Settings’<\/li>\n<li>Версию образа для работы с хранилищем можно обновить при необходимости (по аналогии с тем, что мы писали в конце предыдущего раздела)<\/li>\n<\/ol>\n<h2>Настраиваем связь источника и  хранилища данных<\/h2>\n<p>После всех проделанных шагов у нас открывается вкладка ‘Set up connection’, на которой мы можем настроить то, как и какие данные мы будем грузить с помощью Airbyte:<\/p>\n<ul>\n<li>Как часто будет происходить загрузка<\/li>\n<li>Куда именно мы будем помещать данные в хранилище<\/li>\n<li>Какие данные из источника мы будем брать и каким образом (Full refresh | Increment, Overwrite | Append)<\/li>\n<li>Надо ли нормализовывать данные (сырые данные все равно останутся в хранилище)<\/li>\n<li>Настройка кастомных трансформаций (опционально)<\/li>\n<\/ul>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/9-10.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><br \/>\nПосле заполнения полей, нажимаем ‘Set up connection’. Далее откроется страница настроенного подключения, где мы можем наблюдать историю выгрузок данных, а также вносить изменения в установленную связь Источник-Хранилище.<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/10-9.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><br \/>\nЕсли нажать на Sync, то будут показаны логи исполнения.<\/p>\n<h2>Результаты<\/h2>\n<p>После того, как загрузка была успешно завершена, мы можем заглянуть в наше хранилище.<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/11-8.png\" border=\"0\" width=\"50%\" height=\"50%\"><\/a><\/p>\n<p>Сразу можно обратить внимание на количество сгенерированных таблиц.<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/12-6.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<p>Так как мы указали, что нам необходима нормализация данных, то у нас в результате получилось чуть меньше 400 таблиц для streams [activities, ‘ad_account’, ‘ad_creatives’, ‘ad_sets’, ‘ads’, ‘ads_insights’, ‘campaigns’], причем многие из них оказались пустыми (так сгенерировал Airbyte).<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/13-6.png\" border=\"0\" width=\"20%\" height=\"20%\"><\/a><\/p>\n<p>Сырые данные содержатся в таблицах с именами ‘_airbyte_raw_*’. В таких таблицах имеется всего 3 поля — ‘_airbyte_ab_id’, ‘_airbyte_data’ и ‘_airbyte_emmited_at’. Столбец ‘_airbyte_data’ имеет тип jsonb.<br \/>\nПример для ‘_airbyte_raw_ads_insights’:<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/14-4.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<p>В процессе нормализации каждое поле из json выносится в отдельную колонку. Пример: часть списка колонок из таблицы ‘ads_insignts’:<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/15-3.png\" border=\"0\" width=\"50%\" height=\"50%\"><\/a><\/p>\n<p>После получения основной нормализованной таблицы для каждого stream создаются различные breakdowns, например, для тех же ‘ads_insights’:<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/16-3.png\" border=\"0\" width=\"50%\" height=\"50%\"><\/a><\/p>\n",
            "date_published": "2022-05-12T16:04:39+03:00",
            "date_modified": "2022-05-13T12:58:06+03:00",
            "image": "http:\/\/test.leftjoin.ru\/pictures\/1-31.png",
            "_date_published_rfc2822": "Thu, 12 May 2022 16:04:39 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "133",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "http:\/\/test.leftjoin.ru\/pictures\/1-31.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/2-30.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/3-26.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/4-17.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/5-16.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/5.5.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/6-16.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/7-10.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/8-11.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/9-10.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/10-9.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/11-8.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/12-6.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/13-6.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/14-4.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/15-3.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/16-3.png"
                ]
            }
        },
        {
            "id": "36",
            "url": "http:\/\/test.leftjoin.ru\/all\/collecting-costs-from-facebook-api\/",
            "title": "Собираем данные по рекламным кампаниям в Facebook",
            "content_html": "<p>Давайте узнаем, как получить информацию о затратах, кликах и показах рекламных кампаний из Facebook.<\/p>\n<pre class=\"e2-text-code\"><code>from facebook_business.api import FacebookAdsApi\r\nfrom facebook_business.exceptions import FacebookRequestError\r\nfrom facebook_business.adobjects.adaccount import AdAccount\r\nfrom facebook_business.adobjects.adreportrun import AdReportRun\r\nfrom facebook_business.adobjects.adsinsights import AdsInsights\r\nfrom facebook_business.adobjects.campaign import Campaign\r\nfrom facebook_business.adobjects.adset import AdSet\r\nfrom facebook_business.adobjects.adaccountuser import AdAccountUser as AdUser\r\nfrom facebook_business import adobjects\r\nfrom matplotlib import pyplot as plt\r\nfrom pandas import DataFrame\r\nimport time<\/code><\/pre><h2>Получение ключа<\/h2>\n<p>Первое, что необходимо сделать для работы с Facebook API — создать приложение. Для этого заходим на <a href=\"https:\/\/developers.facebook.com\">https:\/\/developers.facebook.com<\/a> — My Apps — Create App. Заполняем название приложения, контактный Email и жмём на «Create App ID»<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/1.png\" width=\"318\" height=\"428\" alt=\"\" \/>\n<\/div>\n<p>Перед нами открывается Dashboard приложения. Переходим в Settings — Basic и записываем себе App ID и App Secret. Эти данные понадобятся для авторизации.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/2.png\" width=\"217\" height=\"135\" alt=\"\" \/>\n<\/div>\n<p>Теперь переходим в Tools — Graph API Explorer и оказываемся в меню для создания нового access token.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/3.png\" width=\"480\" height=\"320\" alt=\"\" \/>\n<\/div>\n<p>Токены выдаются под разные нужды, и нам нужно задать определенные права для нашего. Понадобится только на ads_managment — это право позволяет получать информацию о рекламных кампаниях вашего аккаунта Facebook. Добавляем его и нажимаем на «Generate Access Token».<\/p>\n<p class=\"note\">Осторожно — user access token изначально выдается как short-lived, уже через 1-2 часа он перестанет действовать.  Для получения long-lived Token можно нажать на синюю кнопку, чтобы открыть Access Token Info, а затем на «Open in Access Token Tool». Откроется новая страница, внизу которой появится синяя кнопка «Extend Access Token». После этого сгенерируется новый long-lived Access Token, действующий 60 дней.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/4.png\" width=\"385\" height=\"221\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/5.png\" width=\"389\" height=\"123\" alt=\"\" \/>\n<\/div>\n<h2>Написание скрипта<\/h2>\n<p>Создадим три переменных, в которые запишем access token, App ID и App Secret. Авторизуемся через метод init() класса FacebooksAdsApi и добавляем пользователя. Метод get_ad_accounts() вернёт нам данные по всем нашим рекламным аккаунтам в виде словаря. По этим же данным можем получить информацию о кампаниях методом get_campaigns().<\/p>\n<pre class=\"e2-text-code\"><code class=\"Python\">\r\nmy_access_token = ''\r\nmy_app_id = ''\r\nmy_app_secret = ''\r\nFacebookAdsApi.init(my_app_id, my_app_secret, my_access_token)\r\n\r\nme = AdUser(fbid='me')\r\nmy_accounts = list(me.get_ad_accounts())\r\nmy_accounts\r\n\r\nmy_account = my_accounts[0]\r\ncampaigns = my_account.get_campaigns()\r\nprint(campaigns)\r\n<\/code>\n<\/pre>\n<p>Попробуем получить amount spent через my_account. Для этого воспользуемся методом api_get(), передав в параметр fields поле AdAccount.Field.amount_spent. Теперь, чтобы получить желаемые данные, выведем поле у переменной my_account, поделив на 100, чтобы обрубить копейки. Расходы получаем в валюте аккаунта, в нашем случае это RUB. То, ради чего мы всё это затеваем — получить данные о расходах на рекламные кампании для последующего анализа.<\/p>\n<pre class=\"e2-text-code\"><code>my_account.api_get(fields=[AdAccount.Field.amount_spent])\r\nprint(int(my_account[AdAccount.Field.amount_spent])\/100)<\/code><\/pre><p>Объявим переменную fields — в этом списке будут храниться поля, которые мы хотим получать: id кампании, количество кликов, затрат и просмотров. Теперь опишем две функции. Первая будет асинхронно отправлять запросы к Facebook и возвращать результаты. Вторая — формирует эти запросы и передает в первую функцию. В результате будем получать список словарей.<\/p>\n<pre class=\"e2-text-code\"><code>fields = [\r\n    AdsInsights.Field.campaign_id,\r\n    AdsInsights.Field.clicks,\r\n    AdsInsights.Field.spend,\r\n    AdsInsights.Field.impressions]\r\n\r\ncount = 0\r\n\r\ndef wait_for_async_job(async_job):\r\n    global count\r\n    async_job = async_job.api_get()\r\n    while async_job[AdReportRun.Field.async_status] != 'Job Completed' or async_job[\r\n        AdReportRun.Field.async_percent_completion] &lt; 100:\r\n        time.sleep(2)\r\n        async_job = async_job.api_get()\r\n    else:\r\n        print(&quot;Job &quot; + str(count) + &quot; completed&quot;)\r\n        count += 1\r\n    return async_job.get_result(params={&quot;limit&quot;: 1000})\r\n\r\ndef get_insights(account, date_preset='last_3d'):\r\n    account = AdAccount(account[&quot;id&quot;])\r\n    i_async_job = account.get_insights(\r\n        params={\r\n            'level': 'ad',\r\n            'date_preset': date_preset,\r\n            'time_increment': 1},\r\n            fields=fields,\r\n            is_async=True)\r\n    results = [dict(item) for item in wait_for_async_job(i_async_job)]\r\n    return results<\/code><\/pre><p>Следующий шаг — получение искомых данных о затратах. Будем собирать данные за всё время, поэтому заведём переменную date_preset, значение которой поставим lifetime. И для каждого аккаунта вызовем функцию get_insights(), а список, который она возвращает, положим в insights_lists.<br \/>\nСоздадим DataFrame и вытащим из insights_lists интересующие данные — это id кампании, количество кликов, затраты и просмотры.<\/p>\n<pre class=\"e2-text-code\"><code>elem_insights = []\r\ninsights_lists = []\r\ndate_preset = 'last_year'\r\nfor elem in my_accounts:\r\n            elem_insights = get_insights(elem, date_preset)\r\n            insights_lists.append(elem_insights)\r\n\r\ninsight_campaign_id_list = []\r\ninsight_clicks_list = []\r\ninsight_spend_list = []\r\ninsight_impressions_list = []\r\ninsight_date_start_list = []\r\ninsight_date_stop_list = []\r\nfor elem1 in insights_lists:\r\n    for elem2 in elem1:\r\n        insight_campaign_id_list.append(int(elem2['campaign_id']))\r\n        insight_clicks_list.append(int(elem2['clicks']))\r\n        insight_spend_list.append(float(elem2['spend']))\r\n        insight_impressions_list.append(int(elem2['impressions']))\r\n        insight_date_start_list.append(elem2['date_start'])\r\n        insight_date_stop_list.append(elem2['date_stop'])\r\n\r\ndf = DataFrame()\r\ndf['campaign_id'] = insight_campaign_id_list\r\ndf['clicks'] = insight_clicks_list\r\ndf['spend'] = insight_spend_list\r\ndf['impressions'] = insight_impressions_list\r\ndf['date_start'] = insight_date_start_list\r\ndf['date_stop'] = insight_date_stop_list<\/code><\/pre><p>Получим такой DataFrame:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/7.png\" width=\"465\" height=\"226\" alt=\"\" \/>\n<\/div>\n<p>Давайте подытожим эти данные — сгруппируем по кампаниям и посчитаем суммы каждой колонки для групп. Для этого в pandas реализованы методы groupby() и sum() — достаточно указать, по какой колонке проводить группировку.<\/p>\n<pre class=\"e2-text-code\"><code>df.groupby(['campaign_id']).sum()<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/9.png\" width=\"294\" height=\"117\" alt=\"\" \/>\n<\/div>\n<p>Теперь построим два графика — по количеству кликов и просмотров относительно дат. Воспользуемся атрибутом rcParams, чтобы задать размеры графиков.<\/p>\n<pre class=\"e2-text-code\"><code>plt.rcParams['figure.figsize'] = [20, 5]\r\nplt.plot(df.date_start.str.replace('2019-', ''), df.clicks)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/10.png\" width=\"992\" height=\"269\" alt=\"\" \/>\n<\/div>\n<pre class=\"e2-text-code\"><code>plt.rcParams['figure.figsize'] = [20, 5]\r\nplt.plot(df.date_start.str.replace('2019-', ''), df.impressions)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/11.png\" width=\"992\" height=\"269\" alt=\"\" \/>\n<\/div>\n<p>Вот и всё! Получили всю информацию о затратах, просмотрах и кликах. В следующем материале посмотрим, как выгрузить её в формате json и передать в Redash для последующего анализа и визуализации.<\/p>\n<p><span style='font-size:80%'>Пост написан при участии команды Valiotti Analytics: Елисей Рыков (младший аналитик), Георгий Ушаков (технический консультант)<\/span><\/p>\n",
            "date_published": "2020-05-11T12:41:42+03:00",
            "date_modified": "2020-05-14T17:21:55+03:00",
            "image": "http:\/\/test.leftjoin.ru\/pictures\/6.png",
            "_date_published_rfc2822": "Mon, 11 May 2020 12:41:42 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "36",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "http:\/\/test.leftjoin.ru\/pictures\/6.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/1.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/2.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/3.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/4.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/5.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/7.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/9.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/10.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/11.png"
                ]
            }
        }
    ],
    "_e2_version": 3365,
    "_e2_ua_string": "E2 (v3365; Aegea)"
}