Как выбрать самые красивые цвета для визуализации данных

Время чтения текста – 35 минут

Перевод статьи “How to pick more beautiful colors for your data visualizations”

Лиза Шарлотта Мут написала очень полезную статью про выбор цветов для визуализации на Datawrapper, которой мы просто не можем с вами не поделиться. Если хотите прочесть статью в оригинале, то переходите на страницу источника, а если вам комфортнее ознакомиться с материалом на русском языке, то оставайтесь здесь и продолжайте читать.

Иногда бывает трудно выбрать хорошие цвета для диаграмм, не так ли? Сегодня я расскажу вам о том, как делать это проще.
Я хочу, чтобы вы чувствовали больше уверенности в выборе цвета и, если вам кажется, что у вас нет чувства цвета, я попытаюсь помочь вам найти нужные цвета. Мы поговорим о типичных цветовых ошибках, которые я вижу на практике, и о том, как их избежать.
Эта статья не для вас, если вы пытаетесь найти хорошие градиенты или оттенки. Но если вам нужно найти красивые характерные цвета, чтобы выделять разные категории (например, континенты, отрасли, виды птиц), то эта статья вам точно поможет.

Категориальные данные в визуализациях FiveThirtyEight, Nadieh Bremer, The Pudding, New York Times, The Economist и Akkurat

Базовые определения цвета

Я часто упоминаю такие термины, как насыщенность, яркость и оттенок. Цветовые пространства HSB (оттенок, насыщенность, яркость) или HSV (оттенок, насыщенность, значение) достаточно хорошо подходят для их проверки:
Оттенок варьируется от 0° до 360° — это типичный цветовой круг:
Насыщенность варьируется от 0% (серый) до 100% (супер красочный!):
Яркость/значение варьируются от 0% (черный) до 100% (фактический цвет):
Для того чтобы преобразовать цвета из HEX (например, #cc0000) или RGB (например, rgb (207, 176, 58)) в HSB/HSV, используйте такой инструмент, как colorizer.org.
Родственником HSB/HSV является цветовое пространство HCL. Используются те же параметры (Hue, Chroma = Saturation, Lightness), но параметры ближе к тому, «как мы действительно видим цвета». Datawrapper использует цветовое пространство HCL для выбора палитры цветов:

Так как вы не найдете параметры цвета HCL в Adobe Photoshop или colorizer.org, то каждый раз, когда я упоминаю градусы (например, 0°) или проценты, я буду говорить о цветовом пространстве HSB/HSV.
Теперь, когда мы разобрались с базой, давайте погрузимся в тему цвета в визуализации.

Расширьте свое понимание цветов

Вы можете подумать: «Так, нужно выбрать пять цветов для моей диаграммы. Поэтому я использую зеленый, желтый, синий и красный. И… эээ… может быть, оранжевый? Или фиолетовый!»
Если вы с детства совсем не задумывались о цветах, раскрашивая книжку-раскраску, то все вполне логично. Итак, сегодня я здесь, чтобы раскрыть вам большой секрет: цветов гораздо больше.
Посмотрите на этот рисунок и сравните его цвета с основными — :

Они отличаются, не так ли? Красный, который использует Надие (автор рисунка) отличается от классического красного . Зеленый... вы можете вообще назвать его зеленым ?
Поэтому, прежде чем вводить ограничивающие нас правила, позвольте мне немного вас напугать: вы можете использовать тысячи цветов. Например, вот это желтовато-красный и синевато-красный цвета. Есть серый цвет , а также, холодный серый и теплый серый . А еще есть синий. Огромное количество оттенков синего! Как, к примеру, этот , этот , этот , этот и вот этот . И это мы даже не говорили про желтый и оранжевый.
У вас всегда есть множество вариантов. Это означает, что вы можете оставаться в небольшой области цветового круга и при этом вариативность будет колоссальной. Это значит:

Не стоит плясать по всему цветовому кругу

Нет необходимости включать сразу все оттенки цветового круга, например, , в одну визуализацию. Диаграмма будет выглядеть более профессионально — и, следовательно, вызывать больше доверия — когда в ней используется только несколько оттенков и комплементарных цветов.
Когда же смотреть на цветовой круг? Это может быть полезно при поиске гармоничных сочетаний с помощью Adobe Color или Color Calculator.

Гармонии из Color Calculator

Инструменты выше помогают выбрать различные гармонии. Последний инструмент называется «квадратный» или «четырехугольный». Не используйте его. Это приведет к использованию слишком большого количества оттенков, а мы стремимся этого избежать.

В этом видео показано, как я использовала инструмент цвета Paletton, начиная с квадратной гармонии и уменьшая расстояние между точками. Обратите внимание, насколько гармоничнее становятся цветовые сочетания.
Если расстояние в обеих парах цветов становится достаточно маленьким, вы, скорее всего, используете комплементарные цвета. И это отличный выбор! Множество комплементарных цветовых пар прекрасно сочетаются друг с другом. Если сомневаетесь, используйте комплементарные цвета и соседние с ними.
Итак, давайте посмотрим, как это выглядит в Adobe Color.

Комплементарные цвета из Adobe Color

Наши цвета противоположны друг другу на цветовом круге, поэтому они точно являются комплементарными. Ура! Но использовать их все еще нельзя: два оранжевых оттенка слишком похожи. И все выглядит таким… ярким.
Поэтому теперь нам нужно отрегулировать насыщенность и яркость:

Используйте насыщенность и яркость, чтобы ваши оттенки сочетались

Насыщенность и яркость так же важны, как и сам оттенок. Фактически, вы можете создавать новые цвета, просто изменяя насыщенность и яркость. Вот две пары цветов одного оттенка, но разной насыщенности и яркости: / . Если вы немного измените оттенок, то добьетесь лучших результатов: / .
Вернемся к нашему цветовому сочетанию: . Поиграв с параметрами, получается следующее:

Улучшенные комплементарные цвета из Adobe Color

Я уменьшила насыщенность голубого и светло-оранжевого и сделала все цвета темнее, кроме светло-оранжевого. Черт возьми, теперь с этим можно работать!
Поэтому, если ваша цветовая комбинация еще не выглядит потрясающе, не добавляйте сразу другой оттенок. Сначала измените насыщенность и яркость и посмотрите, станет ли лучше.
Вот что я сделала со всеми этими цветовыми палитрами: , и . Все они примерно дополняют друг друга, и имеют разную насыщенность и яркость. Вот что заставляет их работать.

Используйте теплые оттенки и голубой цвет

Существует комплементарная цветовая комбинация, которая особенно нравится дизайнерам визуализации данных: желтый/оранжевый/красный и синий. Просмотрите графические портфолио, например, из South China Morning Post или The Economist (PDF), и вы заметите, что они используют эти цвета гораздо чаще, чем фиолетовый или зеленый.

Три страницы из The South China Morning Post

Все дело в том, что эти теплые цвета в комбинации с синим — универсальны для категорий. Желтый, оранжевый и красный очень хорошо смотрятся вместе, но люди все равно будут воспринимать их как разные цвета:  — это именно то, что нам нужно для цветов разных категорий. А синий цвет более гибкий, чем любой другой оттенок: много синего (независимо от того, темный или светлый , насыщенный или ненасыщенный ) выглядят приятно, успокаивающе и даже профессионально.
Важно заметить, что эти цвета доступны всем: дальтоники легко смогут отличить друг от друга синий и оранжевый/красный.
Так что, если сомневаетесь, то используйте оранжевый/красный с синим.

Если используете зеленый, сделайте его желтоватым или синеватым

Оттенок, который можно назвать “лесной зеленый”, занимает одну шестую часть цветового круга, примерно от 90° до 150° , с пиком в 120° . Однако вы едва ли сможете найти много хорошо продуманных визуализаций, в которых он используется. Почему так?
Во-первых, лесной зеленый — очень темный. А если сделать его светлее, то он станет похож на странноватый неон . Таким образом, вам нужно сильно изменить яркость и насыщенность зеленого цвета (больше, чем у других цветов) чтобы получить приятный оттенок. Именно это и делает Washington Post с зеленым цветом в примере ниже:

How Trump is rolling back Obama’s legacy от The Washington Post

Это зеленый цвет на 142° цветового круга, но в нем только 14% насыщенности. Вот как тот же оттенок с такой же яркостью будет выглядеть на 100% насыщенным: . Ой!
И не забывайте про людей-дальтоников: чистый зеленый цвет в сочетании с красным, оранжевым или даже красновато-коричневым им трудно различить.
Поэтому, используя зеленый цвет, добавьте в него немного желтого или синего. Вы можете увидеть это в примерах вверху этой статьи: все зеленые (кроме одного в примере FiveThirtyEight ) имеют оттенок более 160°, то есть более синий , или менее 60°, то есть более желтый . Надие использует и желто-зеленый, и сине-зеленый в этом проекте, который мы уже видели выше:

Похоже, вы даже можете использовать оттенки зеленого в своей визуализации как два разных цвета, как это делает Надие: вариант абсолютно беспроигрышный!

Избегайте чистых цветов

«Чистые» оттенки — это те, которые расположены точно под 60°, 120°, 180°, 240°, 300° и 360°/0° на цветовом круге:

Давайте разберем пример, чтобы научиться определять “чистый” цвет. В HSV/HSB значение оттенка (hue) этого ярко-синего . равно 180°, значение насыщенности (saturation) — 67%, а значение яркости — 91%. Вы также можете проверить значения RGB: если хотя бы два значения совпадают, цвет — «чистый». Например, наш . — это rgb (77, 232, 232).
Чтобы ваши цвета выглядели более естественными и приятными для глаз читателей, вы можете либо уменьшить насыщенность чистых цветов, либо сделать их темнее. Если вы хотите получить яркие, насыщенные цвета, полагайтесь на смешанные цвета на расстоянии не менее 5-10° от чистых цветов.
На изображении выше красный, оранжевый, синий и зеленый имеют одинаковую насыщенность и яркость. Единственная разница — оттенок! Красный (0°), синий (240°) и зеленый (120°) выглядят более красочно, чем оранжевый (40°), светло-синий (211°) и ярко-сине-зеленый (170°). Почему бы тоже не выбрать их, ведь всем хочется яркой, красочной визуализации? Давайте разбираться.

Лучше избегать ярких, насыщенных цветов

Неоновые цвета обязательно привлекут внимание читателей. Но эти читатели не будут вам благодарны. Большинство из нас немного нервничают, когда видят их: «Сильно насыщенные светлые цвета НЕ подходят [для передачи] Серьезности, Доверия или Спокойствия», — объясняют Бартрам, Патра и Стоун в своей статье «Аффективный цвет в визуализации» 2017 года.
Если ваши цвета близки к 100% насыщенности и 100% яркости, скорее всего, ваши цвета чересчур красочные. Это определенно относится к чистым цветам, таким как .
«Но я ведь видел такие сумасшедшие цвета раньше, и они хорошо смотрятся», — скажете вы, имея в виду такие проекты:

Статья из New York Times про музыкальные плейлисты

Статья Bloomberg о банкротстве

Статья The Pudding про звезд

Но если вы сравните цвета из этих примеров с такими цветами, как , вы увидите, что все первые менее насыщенные или более темные. 100% насыщенный и 100% ярко-зеленый . становится менее насыщенным в New York Times , менее насыщенным и темным как в статье Bloomberg ., так и в статье Pudding выглядят в оттенках серого вот так: .
Чтобы эта ошибка не резала глаза читателю, у вас есть два варианта:

  • “Сделайте все правильно в черно-белом”: измените яркость каждой области, сделав некоторые светлее, а некоторые темнее, например: . Так они выглядят в оттенках серого: .
  • Разделите области, к примеру, белой каймой.

Я настоятельно рекомендую первый вариант (однако, вы все равно можете обвести его белой рамкой, если вам нравится стиль): цвета будут выглядеть более динамичными, и люди с дальтонизмом смогут понять диаграмму ничуть не хуже остальных. На самом деле, все будут вам благодарны, независимо от способности видеть цвета!
Фактически, правильный способ подобрать палитру для категориальных данных — это выбрать цвета из градиентов, подобных этим:

Цветовые схемы Viridis

Все эти градиенты плавно переходят от светлого к темному, поэтому цвета, которые вы выбираете оттуда, будут иметь разную яркость: или . Попробуйте этот генератор цветовой палитры, если вам нравится такой подход.

Сделайте свои цвета одинаково «красочными»

Зачастую, задача визуализатора заключается в том, чтобы некоторые цвета выделялись на фоне остальных. Есть разные способы добиться этого. Цвета становятся заметнее по разным причинам, например:

  • они намного темнее
  • они намного светлее
  • они более насыщенные
  • они более «чистые»

Обычно вам нужно выделить один или два цвета. Предполагается, что большинство цветов в диаграмме более или менее одинаково привлекают внимание.
Если вы используете цвета с разной яркостью («Сделайте это правильно в черно-белом»), вам нужно будет сбалансировать их. Попробуйте обесцветить яркие цвета. Увеличьте насыщенность темных цветов.
Еще вы можете выбрать менее чистый оттенок: на изображении выше зеленый и синий очень чистые, поэтому я затемнила их (вот как они выглядят при 100% яркости: ).
Затем я хотела добавить красный… но ярко-красный был бы слишком интенсивным, так как это чистый оттенок: . Так что у меня было два варианта:

  • просто затемнить его: .
  • переместить оттенок (и только оттенок) на 30°, чтобы сделать его более оранжевым .

Я выбрала второй вариант, чтобы он выглядел немного более спокойно, но оба этих варианта хороши.

Избегайте слишком слабого контраста с фоном

Удивительное количество диаграмм на ярком фоне выполнено в пастельных тонах. Они часто бывают недостаточно насыщенными и даже ужасно светлыми.
Это влечет за собой некоторые проблемы: если вы работаете с небольшими областями, такими как линии и точки, читателям может быть трудно различить светлые и ненасыщенные цвета на светлом фоне. Однако, даже если видимость объекта — не проблема (например, для больших объектов), ваши визуализации должны заметно контрастировать с фоном, чтобы можно было уверенно говорить: «Эй, я здесь, и мне есть что сказать!».
Вот что делать, если ваши цвета слишком ненасыщенные и светлые :

  • Увеличьте насыщенность:
  • Сделаем их темнее:
  • Или сделайте и то, и другое для наилучшего результата:

Конечно, это тоже дело вкуса. Но если вы боитесь, что ваши цвета слишком пастельные, на всякий случай, попробуйте сделать их более насыщенными и темными. Просто посмотрите, как это будет выглядеть!

Избегайте слишком большого контраста с фоном

Аналогично, верно и обратное: не делайте цвета слишком темными и насыщенными, когда используете яркий фон. Если сомневаетесь, попробуйте сделать цвета светлее, уменьшить насыщенность и посмотрите, как это смотрится.

Выбирайте достаточно ненасыщенный фон

Когда вы немного разберетесь в цветах и оттенках, наверняка цветной фон покажется вам хорошей идеей. Но у цветного фона есть два больших недостатка: во-первых, он легко отвлекает внимание от диаграммы. Во-вторых, он ограничивает вашу потенциальную цветовую палитру, и поэтому с ним сложно работать. Фактически, чем насыщеннее ваш фон, тем сложнее он становится. Так что ненасыщенные цвета — ваш лучший выбор. Вот несколько правил для цветового пространства HSB / HSV:

  • Если вам нужен светлый фон, держитесь подальше от цветов с менее чем 95% яркости и более чем 7% насыщенности.
  • Если вам нужен темный фон, не используйте больше 20% насыщенности. Кроме того, не используйте полностью черный цвет — оставьте яркость между 10% и 25%.

Копируйте цвета или разбирайтесь в них

Выбрать хорошие цвета действительно сложно. Совершенно нормально плохо разбираться в цветах, продолжать в них не разбираться и просто копировать цвета. Серьезно, в том чтобы воровать нет ничего постыдного. Я написала отдельную статью о том, где черпать вдохновение: фильмы (примечание переводчика: фильмов Уэса Андерсона, например!), художники, цветовые палитры, созданные другими, и т. д. И позвольте мне добавить: чужие визуализации данных — тоже отличный источник. Если вы хотите лучше понять, какие цвета подходят друг другу: проанализируйте их. Вот несколько способов сделать это:

Фотография niko photos с сайта Unsplash

  • Выберите изображение в цветах, которые считаете красивыми, например картину или фотографию природы. Затем выберите из них цвета с помощью пипетки, например с помощью Photoshop или image-color.com и попробуйте использовать именно их в следующем графике.
  • Установите Adobe Capture, это то же самое, но для «живых изображений»: этот инструмент позволяет брать цвета из вашего окружения. (Приятно видеть, как много цветов вокруг нас ненасыщены!)
  • Играйте в «ручную подборку цветов»: посмотрите на свой экран. Какие цвета вы видите? Насколько темные и насколько они насыщенные? Какие оттенки рядом; какие из них находятся на противоположной стороне цветового круга?
  • Выбирайте цвета из красивых визуализаций данных. Измените несколько цветов. Они по-прежнему хорошо работают вместе?

Кроме того, в следующий раз, когда вы будете создавать визуализацию данных и не будете довольны цветами, проанализируйте их в цветовом пространстве HSV/HSB, например с colorizer.org:

  • Насколько они насыщены — и выглядят ли они лучше, если вы увеличите или уменьшите насыщенность на несколько (или много) процентных пунктов?
  • Какое у них значение оттенка? Что произойдет, если вы измените оттенок всего на несколько градусов?
  • Ваши цвета по-разному яркие?

Со временем ваше понимание изменится от «это красиво, но я не знаю почему» к «это красиво, потому что…». И вы обнаружите, что можете нарушать все больше и больше правил, которые я объяснила здесь, и при этом создавать отличные цветовые комбинации!

 Нет комментариев    20   1 д  

How to: Google App Script

Время чтения текста – 5 минут

Сегодняшний пост прольет свет на то, как можно еще более эффективно использовать один из очень удобных инструментов для базовой аналитики — Google Sheets.
Зачастую, аналитикам нужно часто и много работать с таблицами и создавать выборки по различным условиям. В работе с таблицами проблема часто заключается в том, что приходится обрабатывать и систематизировать большие объемы данных, хранящихся на разных листах. К примеру, вы ведете учет клиентов на одном листе таблицы, выгружая данные из сторонних сервисов, и вам хотелось бы, при обновлении ячеек менять данные на другом листе, используя возможности скриптов Google Sheets. Давайте посмотрим как легко и просто решить эту задачу.

Редактор скриптов

Если у вас есть Google аккаунт и таблицы с данными, загруженные в Google Sheets, то можно создавать скрипт для этой таблицы. Выберите таблицу, в которой нужно автоматизировать перенос информации с одного листа на другой, откройте её и выберете в меню «Инструменты» пункт «Редактор скриптов». Браузер переадресует вас на страницу Apps Script, где вы можете создавать и редактировать скрипты для таблицы.

Автоматизация переноса строк на другой лист

Итак, наш скрипт должен автоматически выполнять задачу переноса строки на другой лист. Для этого, мы создаем еще одну колонку в таблице, в которой можно будет поставить галочку для переноса строки и убрать её для отмены этого действия. Давайте разберемся, как именно это делается.
При написании скрипта можно использовать функцию-триггер, которая срабатывает при выполнении определенного условия. Подробнее о функциях-триггерах вы можете прочитатьhttps://developers.google.com/apps-script/guides/triggers?hl=ru#onedite в документации. В нашем скрипте мы используем функцию OnEdit(e), которая запускается при редактировании ячейки таблицы (включение и выключение галочки). Эту функцию мы вызовем в конце скрипта, а пока что, пропишем все, что в функции должно происходить.

function myScript(e) {   
  // Задаем следующее условие для функции: нужно реагировать только на нажатие галочки в восьмой колонке на листе "Лиды-воронка". 
  if (e.source.getActiveSheet().getName() == "Лиды- воронка" && e.range.getColumn() == 8)
  {
    // Сохраняем объекты исходного листа и листа назначения
    destSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test');
    sourceSheet = e.source.getActiveSheet();
    // Очищаем лист назначения. При очистке, начинаем со второй строки, так как у нас в таблице есть заголовок.
    destSheet.getRange(2, 1, destSheet.getLastRow(), destSheet.getLastColumn()).clearContent();
    //Перебираем все ячейки с галочками, ищем те ячейки, в которых галочки проставлены.
    range = sourceSheet.getRange(1, 1, sourceSheet.getLastRow(), sourceSheet.getLastColumn());       
    for (i = 2; i <= range.getNumRows(); i++) 
    {      
      //Получаем все проставленные галочки.
      if (range.getCell(i,8).getValue())
      {        
        // Если галочка проставлена, то текущая строка переносится на новый лист.
        currentRow = sourceSheet.getRange(i, 1, i, sourceSheet.getLastColumn());           
        destSheet.appendRow(currentRow.getValues()[0]);
      }      
    }    
  }

// Затем, вызываем функцию-триггер, которая будет вызывать наш скрипт при каждом редактировании ячейки.
function onEdit(e) {
  myScript(e)
}

В итоге, если галочка в столбце выделена, то соответствующая строка будет перенесена на другой лист. Также, важно помнить, что, при удалении галочки, строка убирается с другого листа.
В нашем примере мы получили следующие две таблицы:

Выводы

Сегодня мы показали вам простой пример скрипта, который упростит, а может даже улучшит, рутинную работу с таблицами. Конечно, с помощью скриптов Google Sheets можно автоматизировать еще очень много других процессов. Вы можете сами прочитать о других функциях, а мы подробно расскажем о некоторых из них в следующих постах!

How to: YouTube API

Время чтения текста – 9 минут

Современным аналитикам необходимо обладать навыком сбора информации из социальных сетей, ведь сейчас контент социальных сетей очень точно отражает реальную ситуацию в мире, помогает быстро распространить новости и позволяет анализировать аудиторию — подписчиков. В предыдущих постах мы уже описывали кейсы с использованием различных API: Vkontakte API, Facebook API, GitHub API. Сегодня мы расскажем вам о том, что представляет из себя YouTube API, как получить ключ API, а также наглядно покажем, какую информацию можно собрать с его помощью. В двух словах, с помощью YouTube API можно находить каналы по ключевым словам, выгружать данные канала, а также статистику по видео, опубликованным на этих каналах.

Подготовительный этап для работы с YouTube API

Для начала, нужно разобраться в том, как получить доступ к API. Этот процесс подробно изложен на сайте для разработчиков, на который вы можете перейти по ссылке. Если коротко, то необходимо иметь или завести аккаунт Google, войти в профиль для разработчиков, создать проект, получить ключ API и подключить к нему API YouTube Data API v3. Далее, с использованием этого ключа вам будет доступен весь необходимый функционал.
После того, как вы успешно получили ключ, можно открывать любой удобный ноутбук (Jupyter Notebook, Collab и т. д.), устанавливать и подключать нужные для работы библиотеки.

# установка библиотек
	pip install --upgrade google-api-python-client
	pip install --upgrade google-auth-oauthlib google-auth-httplib2
	# импорт необходимых библиотек
import googleapiclient.discovery
import time

Квоты

Один важный момент, который важно знать при использовании Youtube API — это наличие дневных квот на использование функций YouTube API в бесплатном режиме. На день дается квота 10000 юнитов, вызов функции поиска стоит 100 юнитов, вызов информации по объекту — 1 юнит, загрузка видео на YouTube стоит 1600 юнитов. Если вам недостаточно дневной квоты, то вы можете подать запрос в Google на её увеличение, в котором нужно подробно указать цели вашей деятельности c YouTube API.

Поиск YouTube-каналов по ключевым словам

Для начала заведем несколько переменных, которые понадобятся нам в процессе сбора информации.

channels_data = {}
channels_data_full = {}
video_data = {}

Дальше написан скрипт, который можно использовать для поиска перечня каналов по ключевым словам. Мы искали каналы, в названии или описании которых используются следующие слова: s_query = ’аналитика данных data’. Сначала выводятся каналы, в названии или описании которых присутствуют все три слова, затем хотя бы любые два, затем хотя бы одно. Чем больше ключевых слов по теме мы укажем, тем точнее будет результат.

api_service_name = "youtube"
api_version = "v3"
DEVELOPER_KEY = "" #тут нужно указать ключ, который вы получите при подключении YouTube API
 
youtube = googleapiclient.discovery.build(
   api_service_name, api_version, developerKey = DEVELOPER_KEY)
#строка поиска
s_query = 'аналитика данных data'
next_token = ''
 
while(True): 
 time.sleep(0.2)
 request = youtube.search().list(
     part="snippet",
     q=s_query,
     relevanceLanguage="ru",
     type="channel",
     maxResults=25,
     access_token=DEVELOPER_KEY,
     pageToken = next_token
 )
 response = request.execute()
 for item in response['items']:
   channels_data[item['snippet']['channelId']] = [item['snippet']['title'], item['snippet']['description']
   ]
 #берем только первые 25 результатов
 break

Добавим пару важных пояснений относительно скрипта. В начале цикла в этом скрипте (как и в двух последующих) мы вызываем функцию time.sleep(), чтобы инициировать двухсекундную задержку между вызовом функций. Это нужно для того, чтобы запросы к YouTube не были чересчур частыми (и вообще, это считается правилом хорошего тона в программировании, так что советуем взять на заметку).
Для простоты нашего примера мы сохранили только 25 первых каналов из всех подходящих под условия поиска. Если вам хочется найти все каналы, в которых упоминается хотя бы одно из ключевых слов, то нужно использовать следующее свойство:

try:
    next_token = response["nextPageToken"]
  except:
    break

Сбор полной информации по всем выбранным каналам

Теперь, когда названия и описания выбранных каналов собраны, можно переходить к следующему этапу, а именно — выгрузке всей информации об этих каналах, в том числе: количество подписчиков канала, количество видео, общее количество просмотров всех видео канала и страна в которой живет, автор канала.

scount = ''
for channel in channels_data:
   #получаем данные по каждому каналу
   time.sleep(0.2)
   r = youtube.channels().list(
         part="snippet, statistics",
         id=channel,
         access_token=DEVELOPER_KEY
   )
   resp = r.execute()
        
   try:
     if resp['items'][0]['statistics']['hiddenSubscriberCount']:
       scount = 'hidden'
     else:
       scount = resp['items'][0]['statistics']['subscriberCount']
  
     channels_data_full[channel] = [resp['items'][0]['snippet']['title'],
                                  resp['items'][0]['snippet']['description'],
                                  scount,
                                  resp['items'][0]['statistics']['videoCount'],
                                  resp['items'][0]['statistics']['viewCount'],
                                  resp['items'][0]['snippet']['country']
     ]
      
   except:
     pass

Теперь вся нужная информация о канале хранится в переменнной channels_data_full.

Получение информации о видео

Если у вас есть необходимость получить статистику по видео из выбранных каналов, то ниже приведен скрипт на этот случай. В итоге, вы получите словарь video_data с подробной информацией о каждом видео из плейлиста (список всех видео каждого канала): название канала, дата публикации, название и описание видео, количество просмотров, лайков/дизлайков и комментариев.

# получаем информацию по всем видео ранее найденных каналов
for channel in channels_data:
   #анализируем каналы
   time.sleep(0.2)
   r = youtube.channels().list(
           part="contentDetails",
           id=channel,
           access_token=DEVELOPER_KEY
     )
   resp = r.execute()           
   try:
     #получаем плейлист из видео для одного канала из списка
     id_playlist = resp['items'][0]['contentDetails']['relatedPlaylists']['uploads']     
     #получаем набор элементов плейлиста (видео)
     next_token = ''
     while(True):     
       time.sleep(0.2)
       r = youtube.playlistItems().list(
             part="contentDetails",
             playlistId=id_playlist,
             access_token=DEVELOPER_KEY,
             pageToken = next_token
       )
       resp = r.execute()
       for i in resp['items']:
         id_videos = i['contentDetails']['videoId']
         r = youtube.videos().list(
               part="snippet, statistics",
               id=id_videos,               
               access_token=DEVELOPER_KEY
         )
         resp1 = r.execute()       
         video_data[id_videos] = [channel,
                                   resp1['items'][0]['snippet']['publishedAt'],
                                   resp1['items'][0]['snippet']['title'],
                                   resp1['items'][0]['snippet']['description'],
                                   resp1['items'][0]['statistics']['viewCount'],
                                   resp1['items'][0]['statistics']['likeCount'],
                                   resp1['items'][0]['statistics']['dislikeCount'],
                                   resp1['items'][0]['statistics']['commentCount']
          ]
       break

В конце мы ставим break, то есть обрабатываем только одну часть видео из плейлиста. Если вы хотите обработать все видео, то нужно использовать функцию nextpagetoken, которую мы предложили в конце первого скрипта.
В итоге, если трансформировать словарь в привычный датафрейм, мы получим таблицу, которая содержит подробную информацию про все обработанные видео.

d = {'id': [x for x in video_data],
      'channel_id': [video_data[x][0] for x in video_data],
       'published_at': [video_data[x][1] for x in video_data],
      'title': [video_data[x][2] for x in video_data],
      'description': [video_data[x][3] for x in video_data],
      'viewCount': [video_data[x][4] for x in video_data],
      'likeCount': [video_data[x][5] for x in video_data],
      'dislikeCount': [video_data[x][6] for x in video_data],
      'commentCount': [video_data[x][7] for x in video_data]
   }
df = pd.DataFrame(d)
df.head()

Выводы

Конечно, это не все способы работы с YouTube API, однако, мы надеемся, что вы получили представление о том, как сильно расширяются возможности аналитика для получения и обработки информации с помощью этого инструмента.

Как и для чего экспортировать красивые отчеты из Jupyter Notebook в PDF

Время чтения текста – 7 минут

Если вы специалист по анализу данных и вам нужно представить отчет для заказчика, если вы ищете работу и не знаете, как оформить тестовое задание так, чтобы на вас обратили внимание, если у вас много учебных проектов, связанных с аналитикой и визуализацией данных, то сегодняшний пост будет вам очень и очень полезен. Дело в том, что смотреть на чужой код в Jupyter Notebook бывает проблематично, ведь результат часто теряется между множеством строк кода с подготовкой данных, импортом нужных библиотек и серией попыток реализовать ту или иную идею. Именно поэтому такой метод, как экспорт результатов в PDF-файл в формате LaTeX — это отличный вариант для итоговой визуализации, который сэкономит время и будет выглядеть презентабельно. В научных кругах статьи и отчеты очень часто оформляются именно с использованием LaTeX, поскольку он имеет ряд преимуществ:

  • Математические уравнения и формулы выглядят аккуратнее.
  • Библиография создается автоматически, на основе всех использованных в документе ссылок.
  • Автор может сосредоточиться на содержании, а не на внешнем виде документа, так как верстка текста и других данных происходит автоматически с помощью указания необходимых параметров в коде.

Сегодня мы подробно расскажем о том, как научиться экспортировать вот такие красивые отчеты из Jupyter Notebook в PDF с использованием LaTeX.

Установка LaTeX

Самый важный момент в формировании отчета из Jupyter Notebook на Python — это его экспорт в финальный файл. Для этого применяется одна библиотека — nbconvert — которая конвертирует ваш ноутбук в любой удобный формат документа: pdf (как в нашем случае), html, latex или другой. Эту библиотеку нужно не просто установить, а провести некоторую процедуру по предустановке нескольких других пакетов: Pandoc, TeX и Chromium. По ссылке на библиотеку весь процесс описан очень подробно для каждого программного обеспечения, поэтому подробно мы на нем останавливаться не будем.
Как только вы завершили все предварительные шаги, нужно установить и импортировать библиотеку в ваш Jupyter Notebook.

!pip install nbconvert
import nbconvert

Экспорт таблиц в Markdown формат

Обычно, таблицы не представляют в отчетах, поскольку их бывает трудно быстро прочесть, но иногда все-таки необходимо добавить небольшую таблицу в итоговый документ. Для того, чтобы таблица выглядела аккуратно, нужно представить ее в Markdown формате. Это можно сделать вручную, но если в таблице много данных, то лучше придумать более удобный метод. Мы предлагаем использовать следующую простую функцию pandas_df_to_markdown_table(), которая преобразует любой датафрейм в markdown-table. Единственный нюанс: после преобразования исчезают строчные индексы, потому, если они важны (как в нашем примере), то стоит записать их в переменную в первой колонке датафрейма.

data_g = px.data.gapminder()
summary = round(data_g.describe(),2)
summary.insert(0, 'metric', summary.index)

# Функция для преобразования dataframe в Markdown Table
def pandas_df_to_markdown_table(df):
    from IPython.display import Markdown, display
    fmt = ['---' for i in range(len(df.columns))]
    df_fmt = pd.DataFrame([fmt], columns=df.columns)
    df_formatted = pd.concat([df_fmt, df])
    display(Markdown(df_formatted.to_csv(sep="|", index=False)))

pandas_df_to_markdown_table(summary)

Экспорт изображения в отчет

В этом примере мы будем строить bubble-chart, про методику построения которых рассказывали в недавнем посте. В прошлый раз мы использовали пакет Seaborn, наглядно показывая, что отображение данных размером кругов на графике происходит корректно. Такие же графики можно построить и при помощи пакета Plotly.
Для того чтобы отобразить график, построенный в Plotly в отчете тоже нужно немного постараться. Дело в том, что plt.show() не поможет отобразить график при экспорте. Поэтому, нужно сохранить получившийся график в рабочей директории, а затем, используя библиотеку iPython.display, отобразить его с помощью функции Image().

from IPython.display import Image
import plotly.express as px
fig = px.scatter(data_g.query("year==2007"), x="gdpPercap", y="lifeExp",
                 size="pop", color="continent",
                 log_x=True, size_max=70)
fig.write_image('figure_1.jpg')
Image(data = 'figure_1.jpg', width = 1000)

Формирование и экспорт отчета

Когда все этапы анализа данных завершены, отчет можно экспортировать. Если вам нужны заголовки или текст в отчете, то пишите его в ячейках ноутбука, сменив формат Code на Markdown. Для экспорта можно использовать терминал, запуская там вторую строку без восклицательного знака, либо можно запустить код, написанный ниже, в ячейке ноутбука. Мы советуем не загружать отчет кодом, поэтому используем параметр TemplateExporter.exclude_input=True, чтобы ячейки с кодом не экспортировались. Также, при запуске этой ячейки код выдает стандартный поток (standard output) и, чтобы в отчете его не было видно, в начале ячейки нужно написать %%capture.

%%capture
!jupyter nbconvert --to pdf --TemplateExporter.exclude_input=True ~/Desktop/VALIOTTI/Reports/Sample\LaTeX\ Report.ipynb
!open ~/Desktop/VALIOTTI/Reports/Sample\ LaTeX\ Report.pdf

Если вы все сделали верно и методично, то в итоге получится вот такой отчет! Презентуйте данные красиво :)

Граф телеграм-каналов по теме аналитики

Время чтения текста – 4 минуты

Авторы самых разных блогов в телеграме часто публикуют подборки любимых каналов, которыми они хотят поделиться со своей аудиторией. Идея, конечно, не новая, но я решил не просто составить рейтинг интересных аналитических телеграм-блогов, а решить эту задачу аналитически.

В рамках текущего курса моей учебы, я изучаю много современных подходов к анализу и визуализации данных. В самом начале курса было разминочное упражнение: объектно-ориентированное программирование на Python для сбора и итеративного построения графа с TMDB API. В задаче этот метод применяется для построения графа связи актеров, где связь — игра в одном и том же фильме. Но я решил, что можно применить его и к другой задаче: построению графа связей аналитического сообщества.

Поскольку последнее время мой временной ресурс особенно ограничен, а аналогичную задачу для курса я уже выполнил, то я решил передать эти знания кому-то еще, кто интересуется аналитикой. К счастью, в этот момент, ко мне в личку постучался кандидат на вакансию младшего аналитика данных — Андрей. Он сейчас находится в процессе постижения всех тонкостей аналитики, поэтому мы договорились на стажировку, в рамках которой Андрей спарсил данные с telegram-каналов.

Основной задачей Андрея был сбор всех текстов с телеграм-канала Интернет-аналитика, выделение каналов, на которые ссылался Алексей Никушин, сбор текстов из этих телеграм-каналов и ссылок на этих каналах. Под “ссылкой” подразумевается любое упоминание канала: через @, через ссылку или репостом. В результате парсинга, у Андрея получилось два файла: nodes и edges.
Теперь я представлю вам граф, который получился у меня на основе этих данных и прокомментирую результаты.

Пользуясь случаем, хочу выразить мое почтение команде karpov.courses, поскольку у Андрея отличное знание языка Python!

В результате топ-10 каналов по показателю degree (количество связей) выглядит так:

  1. Интернет-аналитика
  2. Reveal The Data
  3. Инжиниринг Данных
  4. Data Events
  5. Datalytics
  6. Чартомойка
  7. LEFT JOIN
  8. Epic Growth
  9. RTD: ссылки и репосты
  10. Дашбордец

По-моему, получилось супер-круто и визуально интересно, а Андрей — большой молодец! Кстати, он тоже начал свой канал ”Это разве аналитика?”, где публикуются новости аналитики.

Забегая вперед: у этой задачи имеется продолжение. С помощью Марковской цепи мы смоделировали в каком канале окажется пользователь, если будет переходить итеративно по всем упоминаниям в каналах. Получилось очень интересно, но об этом мы расскажем в следующий раз!

Ранее Ctrl + ↓