Анализ и предоставление данных, скрытых за отдельными номерами.

В конце декабря 2021 года в округе Монтгомери в штате Мэриленд произошел всплеск коронавируса, связанный с введением нового варианта омикрон.

Государственные школы округа Монтгомери (MCPS), округа, в котором я учусь, справились с этой новой угрозой коронавируса с помощью системы цветового кодирования, основанной на проценте инфицированных людей в школе. Многие ученики и родители полагались на эту систему, чтобы понять общую ситуацию с коронавирусом в своей школе, а также возможность перехода в виртуал.

Школы с «красным уровнем» более 5% должны были быть сделаны с учетом перехода на виртуальные, но почти каждая школа округа преодолела этот порог за считанные дни. Сразу после этого округ снял 5-процентный порог и прекратил предоставление данных об общем проценте населения каждой школы с положительным ковидом.

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

Мне было интересно узнать реальную статистику ковида в нашем округе, которую мы не знали. Официальная информационная панель, созданная округом, никогда не была точной и актуальной, поэтому я вместе со своим хорошим другом Сарааншем решил создать свою собственную.

Я знал, что у меня есть сила в веб-разработке, поэтому я хотел работать с кем-то, кто мог бы помочь мне с разбором и анализом данных. С мощью Python и библиотекой pandas мы двигались вперед.

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

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

Пришло время приступить к созданию внешнего интерфейса, который в конечном итоге будет размещен на веб-сайте для использования людьми. Поскольку я был новичком в создании визуализаций данных, я хотел использовать библиотеку, которая была бы простой и легкой в ​​запуске. Я выбрал ApexCharts с очень простым API.

Благодаря своему опыту разработки за последние несколько лет я многое узнал об организации кода. Все мои первые проекты были созданы без каких-либо принципов объектно-ориентированного программирования, они были беспорядочными и обычно объединялись в один файл. Я знал, что мне нужно оставаться организованным, если я хочу иметь возможность быстро создать этот проект и поддерживать его в будущем.

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

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

Действие Github проверяет наличие обновлений в каталоге server/data и после обновления создает контейнер Ubuntu, размещенный на GitHub. После установки зависимостей, указанных в requirements.txt для скрипта Python, контейнер запускает скрипт, а GitHub Actions отправляет все изменения, внесенные в файлы JSON.

Затем я загрузил все созданные мной классы визуализации.

Перед тем, как приступить к созданию внешнего интерфейса, я использовал Figma, чтобы создать прототип того, как я хотел бы, чтобы он выглядел. Я также спланировал, как я буду кодировать функцию фильтрации.

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

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

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

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

Веб-сайт не является веб-сайтом без HTML. В нем нет ничего особенного, и вы можете посмотреть его здесь, если хотите. Я разработал его, полностью помня о мобильном пользовательском интерфейсе, используя инструменты разработчика Chromium для переключения между настольным и мобильным представлением при его создании.

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

Я купил наш домен всего за пару долларов и использовал Netlify для его размещения. У меня много веб-сайтов, размещенных на Netlify, и процесс всегда был быстрым и легким. Я также решил использовать Cloudflare не потому, что я беспокоился о том, что наш сайт выйдет из строя, а потому, что я хотел иметь возможность просматривать аналитику и повышать общую производительность.

Наконец-то люди смогли увидеть полную картину COVID в MCPS.

Немного пост-стартовой статистики: за 24 часа после запуска было более 700 уникальных посетителей после продвижения в Instagram, Discord и Facebook. Всплеск COVID был временным, и он больше не вызывал беспокойства у большинства, поскольку общее количество активных случаев заболевания падало день ото дня. Общее количество посетителей на нашем сайте также снижается с каждым днем.

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

Вы можете просмотреть наш репозиторий Github здесь и посетить сайт самостоятельно здесь.

Спасибо за чтение.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.