Нормализация выгрузок без потери смысла
Реестр материалов позволяет связать URL с объектом. Теперь нужно сохранить смысл каждой числовой строки. В этом уроке подготовим нормализованный набор поисковых выгрузок с явными датами, фильтрами и единицами, сохранив исходные файлы отдельно.
ProfessorWeb Lab использует авторские CSV. Они не являются реальным экспортом Google, поэтому схема специально описана в export-contracts.json. Никакие запросы к сервисам и операции с аккаунтами не выполняются.
Сначала происхождение, потом одинаковые столбцы
Для каждого файла создадим export_id, property_id, surface, grain, period, timezone и filters. Эти поля нужны раньше общего листа. Две таблицы с одинаковыми названиями столбцов могут относиться к веб-поиску и Discover, полному окну и частичному периоду, сайту и каналу. Конкатенация без договора спрячет различия.
Сохраняем raw-файлы неизменными. Нормализованный CSV получает отдельное имя и ссылку на export_id. Если правило сопоставления URL изменится, мы сможем подготовить новую версию из исходного состояния. Переписывание исходника лишило бы нас возможности объяснить, какой столбец существовал до редакционной обработки.
В учебной схеме одна строка — публикация за заданное окно в одной поисковой поверхности. clicks и impressions записаны целыми числами. CTR вычисляется как сумма кликов, делённая на сумму показов совместимых строк. Среднее из процентов строк обычно даёт другой результат, потому что маленькая и большая публикация получают одинаковый вес. В следующем уроке рассмотрим это на теме, здесь закрепим правило договора.
Дата выгрузки не равна последнему дню периода. exported_at показывает подготовку файла, period_end — границу наблюдения. У нового свойства может быть только часть нужного периода. В нормализованном наборе это partial, а не полный месяц с подставленными нулями. Прежде чем сравнивать каналы, надо определить общую доступную часть либо показать окна отдельно.
Отдельно сохраняем доступность значения. Справка Google описывает случаи, когда недоступная отметка в интерфейсе становится нулём в скачанном файле. Если исходный смысл известен, добавим availability; если нет, отметим неоднозначность. Само число в CSV не всегда даёт достаточно основания для утверждения об отсутствии события.
Соединение, которое не создаёт двойной счёт
Сопоставим нормализованный адрес с реестром из прошлого урока. Один representation_id должен разрешаться в один content_id по выбранной версии правила. Если URL совпал с двумя материалами, поставим mapping_conflict. Нельзя выбирать первую найденную строку и считать обработку успешной: аналитический результат станет зависеть от случайного порядка таблицы.
Полный экспорт и его копия с другим именем не являются двумя источниками событий. В договоре есть snapshot_key, составленный из свойства, поверхности, окна и версии. Повторная поставка того же снимка заменяет ссылку на файл в каталоге либо хранится как новая версия, но не прибавляется к сумме. Для архивирования можно использовать отпечаток файла, однако совпадение содержания само по себе ещё не объясняет его происхождение.
Срезы по устройствам и странам тоже нельзя складывать друг с другом как части одного списка. Они пересекаются. Если нужны совместные строки «страна × устройство», источник должен предоставить соответствующую размерность. Наш демонстрационный набор её не содержит, и нормализация не выдумывает совместное распределение.
Ожидаемый результат — единая таблица с устойчивыми ключами и договором каждой строки. В ней сохраняются partial, unmapped и неоднозначные значения. Эти состояния не мешают анализу: они показывают, какие сравнения допустимы. Дальше используем доступные поисковые запросы для группировки учебных задач.
Среднюю позицию также не стоит усреднять без знания веса и агрегации. Если нужна точная общая величина, используйте соответствующий итог источника или достаточно подробные совместимые данные. Учебная нормализация хранит позицию как исходную величину и не изображает из неё общий рейтинг каналов.
Полезный договор завершает фраза о полноте: видимые строки не обязательно покрывают весь объём запросов. Отсутствующая строка может быть скрыта ограничениями или порогами. Поэтому общий итог и сумма доступных запросов хранятся отдельно. Мы не заполняем разницу придуманными вопросами, даже если это сделало бы следующую редакционную таблицу удобнее.
Нормализованный слой удобно передавать вместе с небольшим журналом преобразования. В нём укажите версию реестра, версию договора и число строк каждого состояния. Если пять URL остались unmapped, они не должны просто пропасть из итогового обзора. Можно исключить их из сравнения, одновременно показывая причину и объём исключения. Этот приём делает небольшую лабораторию похожей на сопровождаемую редакционную систему: результат объясняет не только успешные строки, но и сведения, которые не удалось использовать. Для воспроизводимости такой журнал важнее случайного имени итоговой электронной таблицы.
Для строк с ошибкой сохраните оригинальный номер либо устойчивый row_id. Тогда исправление сопоставления можно объяснить на конкретном случае. Молчаливое удаление неизвестной строки уменьшает итог и скрывает причину. В договоре преобразования полезно показать количество успешных, отложенных и исключённых записей, сохраняя области каждого отдельного набора.
Чтение сохранённого состояния
Начните с export-contracts, а затем найдите строки EXP-YT-B и EXP-TT-A. У них разные свойства и полнота. Их можно показать рядом, но нельзя незаметно объединить в общий CTR одного канала. Сопоставимость определяется договором, а не похожестью чисел.
| Признак экспорта | Что он предотвращает |
|---|---|
| property_id | Не позволяет принять выгрузку сайта или другого канала за показатели выбранного видеоисточника. |
| surface | Сохраняет различие поиска, Discover и News вместо смешивания неодинаковых событий под общим названием. |
| snapshot_key | Не даёт сложить копию того же снимка с исходником как новый независимый набор событий. |
| period_state | Показывает частичность или предварительность окна и препятствует созданию нулей для отсутствующих дней. |
Числа поисковых запросов в отдельном fixture не являются аддитивным экспортом страницы. Это прямо указано в договоре, потому что лаборатория показывает правила на небольших разных примерах. Нельзя суммировать все наши демонстрационные CSV и требовать совпадения единого итога. Для каждого упражнения задан собственный охват.
Для будущего реального набора нужно проверить фактическую полноту и схему файлов. Если они дают совместную размерность, её можно сохранить; если нет, нормализация не создаёт её автоматически. Особенно это важно для стран и устройств: отдельные срезы пересекаются и не восстанавливают совместное распределение без дополнительного источника.
Основной артефакт export-contracts.json находится в lesson-04 архива серии. Полный снимок содержит также исходные таблицы и договоры. Они читаются вручную; результаты примеров описаны как ожидаемые, выполнение не проводилось.
Первичные источники: platforms, google counts.