Фид + Python = идеальные быстрые ссылки в Яндекс Директ и рост CTR на 30%
В прошлой статье мы рассказали, как с помощью Excel создали уникальные быстрые ссылки для 7000 объектов национального туроператора «Алеан», с которым Adgasm.io сотрудничает уже более 4 лет. Наше решение повысило CTR объявлений на 30%, а выручка генераторных кампаний, где мы, в том числе, использовали уникальные быстрые ссылки, выросла в несколько раз.
В этой части поделимся, как реализовать подобный функционал при помощи Python. Могут понадобиться базовые знания языка. Преимущество этого способа в том, что можно обновлять все быстрые ссылки в пару кликов, независимо от объёма фида и формировать десятки тысяч уникальных объявлений. Excel, даже на мощных компьютерах часто не способен переварить столько данных.
Я не эксперт в Python, и, как любой новичок, сначала формулирую задачу, а затем ищу способы реализации. Поэтому готов к критике и буду рад обсудить в комментариях оптимальные решения.
Шаг 1. Сначала нужно установить среду разработки Jupyter Notebook, где мы будем писать код. Процесс установки для популярных операционных систем легко найти в сети.
Открываем файл Python 3.
Импортируем библиотеки — файлы с шаблонами кода, которые упрощают работу, а также импортируем данные из фида в датафрейм pandas (проще сказать — в таблицу). Если говорить условно, строчки в фиде мы записываем в ячейки таблицы. Этот процесс подробно описан на канале «Товарищ Excel — Power Query, Power Pivot, Python».
Шаг 2. В отличие от гайда «Товарищ Excel» наш фид начинается с url, который относится не к объекту (отелю), а к url сайта, к которому относится фид. Это нужно исправить.
Считываем данные из фида и записываем их в переменные (после знака «#» идут комментарии, которые не считаются частью кода).
Затем удаляем первую строчку из переменной, в которую мы поместили url, так как она отражает некоторые технические свойства фида, но не относится напрямую к объекту.
Шаг 3. Остальные шаги получились идентичными гайду от «Товарищ Excel». Датафрейм при парсинге фида получается точь-в-точь таким же, как мы импортировали при помощи Power Query в предыдущей в первой части статьи.
Далее нам нужно повторить шаги из первой части статьи, только при помощи Python. Преобразуем значения из фида в тексты, которые мы будем использовать в расширениях.
Шаг 4. При помощи метода replace мы заменяем значения true на тот текст, который хотим видеть в расширениях. Но в нашем случае есть исключения:
— рейтинг, где мы конкатенируем (объединяем) текст «Рейтинг» и числовое значение рейтинга, а также заменяем значения без рейтинга на false (аналогично и для расстояния до моря, например);
— бассейны (крытый/открытый), которые мы будем дополнительно преобразовывать.
Также можно совместить несколько сходных преимуществ: например, в рамках термального комплекса.
Чтобы проверить, какие уникальные значения получились в результате обработки, применяем к столбцу метод «unique()»
Далее преобразовываем колонки, связанные с расстоянием: до моря, до подъёмника. Например, форматируем километры в метры, удаляем слишком отдаленные значения по типу «до моря: 1 000 000 км». Не будем углубляться в подробности, потому что это специфика объявлений «Алеан» — чтобы раскрыть все нюансы, пришлось бы написать еще одну часть статьи.
Шаг 5. Создаем в датафрейме колонки ОБС (описания быстрых ссылок) для соответствующих ЗБС (заголовки быстрых ссылок)
Заполняем актуальными значениями колонки ОБС, созданные на предыдущем шаге.
Для заполнения значений используем функцию obs_generic. Это нужно для сокращения повторяющихся фрагментов кода, чтобы "облегчить" код и его было проще читать.
Наша функция принимает данные о колонке ЗБС (sbs), колонке ОБС (obs) и тексте (text, для каждого ОБС — свой), который мы хотим поместить в колонку ОБС. Функция преобразовывает колонки ОБС, принимая соответствующие значения.
Работа с функциями выглядит сложной, если вы только начинаете работу с Python. Мы описали процесс упрощенно, но если вы хотите разобраться глубже, рекомендуем поискать статьи или видео на темы «Как работать с функциями Python», «Как работать с циклом for в Python».
В нашем случае функция сработала корректно. Чтобы в этом убедиться, мы проверили колонки с ОБС на наличие уникальных значений. Получили уникальные значения false там, где ЗБС также имеет значение false, или текст быстрой ссылки, если ячейка ЗБС не содержит false.
Шаг 6. Далее нам нужно каждую колонку ЗБС добавить в общую колонку со всеми ЗБС. Этот шаг аналогичен шагу 4 в разделе «Обрабатываем значения фида для формата быстрых ссылок» первой части статьи.
Результат конкатенации для объекта под индексом 464 получился таким.
Конкатенируем адреса быстрых ссылок уже с другой, более простой механикой, чем в случае с Excel. Нам достаточно добавить 8 url объекта через разделитель ||
Шаг 7. Чтобы работать с объединенными ЗБС, ОБС и адресами БС, поместим их в новый датафрейм bs_all.
В новом датафрейме получаем только необходимые для дальнейшей работы поля.
Удаляем все значения false и null.
Получаем такие значения.
Шаг 8. Удаляем лишние разделители || из ЗБС и ОБС. Этот шаг аналогичен шагу 5 в разделе «Обрабатываем значения фида для формата быстрых ссылок» первой части статьи.
Получаем более чистые и читаемые значения.
Шаг 9. Считаем количество ЗБС. Этот шаг аналогичен шагу 1 в разделе «Готовим быстрые ссылки для выгрузки в Директ Коммандер» первой части статьи.
Повторяем то же самое для ОБС.
К числовой колонке мы можем применить метод describe, который покажет сводку по основным показателям. Если применим describe к колонке с количеством ЗБС, получим следующие данные:
Где,
- count — количество объектов в фиде
- mean — среднее число ЗБС для одного объекта
- min/max — минимальное/максимальное число ЗБС для одного объекта
- 25, 50, 75% — значения по процентилям. 50% — это медиана, то есть для половины объектов количество ЗБС больше 4, для половины — меньше.
Если мы все сделали правильно, то при применении describe к колонке с количеством ОБС получим идентичные значения. Так и получилось.
Шаг 10. Удаляем некоторое количество ЗБС и ОБС, если их больше 8. И наоборот, добавляем, если их меньше 8. Этот шаг аналогичен шагу 2 в разделе «Готовим быстрые ссылки для выгрузки в Директ Коммандер» первой части статьи.
Сформируем списки из значений с разделителем || и значением ЗБС или ОБС. Чем ближе ЗБС или ОБС к началу списка, тем чаще оно будет использоваться. Важно, чтобы порядок значений в ЗБС соответствовал порядку значений в ОБС.
Далее напишем код для добавления необходимого количества ЗБС и ОБС.
Из-за того, что мы присоединяли первые значения в ЗБС и ОБС с разделителем || в начале, могли образоваться лишние разделители слева. Это происходит в случае, если количество уникальных ЗБС или ОБС равно 0. Поэтому нужно удалить первые значения || слева при помощи str.lstrip()
Недостающие ЗБС и ОБС мы добавили. Осталось удалить те, где ЗБС и ОБС больше 8.
Этот процесс можно описать в такой последовательности.
1) Создаём новый датафрейм. ОБС разбиваем по разделителю ||. Задаем название каждой из полученных колонок.
Новый датафрейм будет выглядеть так.
2) Конкатенируем колонки с ОБС из нового датафрейма с разделителем || в одну колонку в старом датафрейме obs all при помощи методов .agg и .join
Ячейки колонки для каждого из объектов сформированы правильно — проверили на конкректном объекте под индексом 464.
Тот же порядок действий повторяем для ЗБС.
На этом преобразования закончены. Осталось убедиться, что количество ЗБС и ОБС везде равняется 8. Эту работу для ЗБС мы уже проделывали, поэтому повторяем ее для новых колонок.
С помощью колонок count_obs_all и count_sbs_all проверяем, что количество ОБС у всех объектов равно 8, применив метод describe:
Шаг 11. Подготавливаем данные и выгружаем датафрейм в Excel.
Элементы быстрых ссылок уже готовы для выгрузки.
Остается только применить функцию ВПР. Помните, что в результате могут получиться значения «#Н /Д», которые нельзя загружать в Директ Коммандер. Чтобы их убрать, воспользуйтесь способом, описанным в последнем разделе первой части статьи.
Больше полезной информации в нашем телеграм-канале:
Автор: Иван Кикоть, Senior performance manager