Собираем данные оперштаба в гугл-таблицу с помощью python

Mikhail.Stas
5 min readJul 11, 2021

Привет, сегодня я поведаю вам короткую историю, как за 10–15 минут собрать данные оперштаба в обновляемую гугл таблицу. Думаю, сайт оперштаба не нуждается в представлении, но для тех кто был в спячке последние 1,5 года: на этом сайте ежедневно публикуются данные о количестве заболевших, погибших и выздоровевших после COVID-19, с детализацией по регионам России.

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

А зачем это надо вообще?

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

Ну и вообще, иметь живые данные и строить на них какую-то аналитику всегда интереснее, чем использовать для обучения типовые датасеты которые встречаются в каждом обучении.

Дисклеймер.

Я не буду рассказывать как поставить на машину питон, установить нужные библиотеки и JupyterLab. По этой теме есть куча инфы, например:

  • тут видео по установке питона,
  • тут про то как ставить пакеты c библиотеками,
  • тут официальная инструкция по установке JupyterLab.

Если вы осилили установку питона, библиотек к нему и запуск JupyterLab, то вы точно сможете сделать всё описанное ниже самостоятельно, я в вас верю!

Но, если у вас всё-таки появятся вопросы или предложения, пишите их в комментариях к статье, я постараюсь вам ответить.

И… мы начинаем!

Сначала нам нужно скраулить данные с самого сайта, данные хранятся в виде JSON, потому, сложностей с их получением не возникнет. Просто копипастим код и запускаем.

Теперь у нас в объекте data лежит распаршенный JSON, загрузим его в Pandas DataFrame, и добавим в него колонку с датой с помощью функции utcnow(), так нам будет легче отличить срез за один день, от среза за другой день.

В результате выполнения скрипта вы получите вывод нашего датафрема в виде первых 5 и последних 5 его строк, примерно в таком виде:

Как видно, тут много лишней информации, например описание деталей изоляции, дата начала изоляции и подобное. Очистим всё лишнее и выведем столбцы в нужном порядке.

Вот, так гораздо лучше! Я намеренно оставил координаты и коды регионов, чтобы использовать эти данные в будущем для аналога хитмапа.

А нам осталось только сохранить данные в гугл-таблицу. Для этого воспользуемся готовыми библиотеками gspread и gspread_dataframe. На этом этапе часто возникают сложности, но тут нет никакой магии, всё описано в документации к озвученным выше библиотекам. Кратко:

  1. Нужно создать новый проект в гугловой консоли для разработчиков, либо использовать уже имеющийся.
  2. В новом проекте нужно включить использование API google sheets. Кликаем на кнопку в “ENABLES APIS AND SERVICIES” и в поле поиска ищем “Google Sheets API”, добавляем к нашему проекту.
  3. Завести в нашем проекте новый сервисный аккаунт: идем в креденшиалс кликаем сверху “CREATE CREDENTIALS -> SERVICE ACCOUNT”, указываем там требуемые параметры, роль ставим “Owner”.
  4. Получить ключ для сервисного аккаунта: идем в список сервисных аккаунтов, выбираем наш проект, выбираем аккаунт, далее идем на вкладку “Keys”, выбираем “ADD KEY -> Create New Key”. Скачиваем полученный JSON с ключем и кладем в папочку рядом с нашим скриптом. Копируем полный адрес нашего сервисного аккаунта (выглядит как длинный email).
  5. Осталось предоставить доступ нашему роботу в гугл-таблицу, идем в таблицы, создаем новый файл, открываем его, в правом верхнем углу есть кнопочка “Share”, клацаем её и в появивемся окшке поиска выбиваем имя нашего аккаунта, выбираем роль “Editor”.

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

Теперь у нас есть всё для того чтобы сохранить данные в таблицу. Для этих целей воспользуемя скриптом ниже, указав в нужны местах путь к JSON с секретом для робота (который мы получили в п.4), идентификатор гугл-таблицы, и название листа (по умолчанию обычно Sheet1). Этот скрипт определят функцию export_to_sheets, которую мы будем использовать в дальнейшем при записи данных в файл. Функцию можно определить один раз в самом начале, и далее просто использовать ее когда надо.

Далее, просто запускаем нашу функцию export_to_sheets с нужными нам параметрами (название листа, название датафрейма, и метод записи (a — добавить записи, w -перезаписать таблицу):

Если после выполнения выводится “True”, то данные записаны, можно идти в таблицу и проверять, результат будет примерно таким:

Дальше, можно сконвертировать наш блокнот в полноценный скрипт убрав оттуда выводы, cделать это можно прямо запустив терминал в JupyterLab, и воспользовавшись утилитой nbconvert прямо в терминале:

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

Далее можно настроить расписание на ежедневное выполнение вашего скрипта, в винде это можно сделать через виндовый шедуллер, в маке /линуксе добавить скрип в crone.

Спасибо что дочитали до конца, а в следующей статье я покажу как можно на этих данных собрать свой дашборд в Google Data Studio.

Всё самое актуальное в моем телеграм-канале, присоединяйтесь:

--

--