Питон в реальной жизни
9 ноября. Модуль json
JSON - это текстовый формат обмена данными. Условно можно представить, чо это формат, в котором бывают:
- простые типы данных: целые числа, действительные числа, строки, bool
- списки
- словари
Подробнее можно почитать, например, в википедии (но не факт, что от этого станет понятнее).
Давайте для примера посмотрим на json-файл с информацией о нашей школе (откроется в новом окне, скорее всего вам браузер его покажет довольно красиво, а не просто как текстовый файл).
Мы будем использовать модуль json
(он входит в стандартную поставку python), и из него нам понадобится две функции: для ввода данных и для записи.
В примерах ниже я сразу покажу, как считывать данные из json-файла, и как их записать:
import json
with open(INPUTFILENAME, encoding="utf-8") as fin:
data = json.loads(fin.read())
with open(RESULTFILENAME, "w", encoding="utf-8") as fout:
print(json.dumps(data), file=fout)
INPUTFILENAME
и RESULTFILENAME
- здесь должно быть указано имя файла. Параметр encoding="utf-8"
нужен, если ваш файл в кодировке
utf-8 (де-факто сегодня это стандарт для кодировки файлов, который стоит использовать). При этом на Портале открытых данных города Москвы
по крайней мере некоторые dataset'ы выложены в кодировке ANSI-1251, для работы с ними нужно указывать encoding="cp1251"
При записи полезно указать еще два параметра:
ensure_ascii=False
- тогда русские буквы будут записаны как русские буквы, а не как их коды
indent=4
- тогда данные будут записаны красивой "лесенкой", а не все вперемешку в одну строчку.
То есть блок записи должен выглядеть как-то так:
with open(RESULTFILENAME, "w", encoding="utf-8") as fout:
print(json.dumps(data, ensure_ascii=False, indent=4), file=fout)
Упражнения
Победители и призеры олимпиад
Давайте посмотрим на набор данных Победители и призеры олимпиад.
Сделайте следующее:
- Скачайте набор данных в формате json (он будет заархивирован, его надо разархивировать). На всякий случай, зеркало данных за октябрь 2021 года
- Посмотрите на данные в табличном виде прямо на сайте. Там можно нажать на параметры, и отобразить все столбцы, а не только интересующие нас.
Набор данных в json представляет собой список словарей, имеющих те же поля. В "паспорте объекта" можно посмотреть описание полей.
Попробуйте открыть и посмотреть на данные в виде json (осторожно, файл большой, и не всякий инструмент его безболезненно откроет).
- Напишите программу, которая напечатает первый элемент списка данных, и посмотрите, какие там есть поля.
- Поймите, какие олимпиады описывает этот файл (поле "OlympiadType" каждой записи)
- Для Всероссийской олимпиады поймите, про какие этапы там содержится информация.
- За каждый год попробуйте посчитать:
- Количество призеров и победителей, которые вообще есть в этом файле (в разбивке по годам)
- Количество призеров и победителей из нашей школы (в разбивке по годам)
- Теперь посчитайте те же значения, но в разбивке по олимпиадам/этапам Всероссийской олимпиады
- Попробуйте посчитать те же значения в разбивке по предметам. Какой предмет самый массовый для нашей школы и как это меняется год от года?
- Попробуйте построить свой рейтинг московских школ по числу победителей/призеров. Посмотрите, какие школы лидируют в интересующих вас преметах. Как эти параметры меняются с годами?
Московские школы
Посмотрите на датасет Образовательные учреждения города Москвы.
- Скачайте набор данных в формате json. На всякий случай, зеркало данных за октябрь 2021.
- Найдите в данных нашу школу, и поймите какая полезная информация там вообще есть. Сколько в нашей школе зданий? А учеников?
- Обратите внимание, что в датасете есть не только школы, но и разные другие организации. Как понять, что запись соответствует школе?
- Сколько в Москве школ?
- Сколько зданий в московских школах (найдите самую большую школу, найдите среднее и медианное количество)
- Сколько в московских школах учеников: всего, максимум в одной школе, среднее количество. Сколько в среднем учеников приходится на одно школьное здание?
- На вкладке "паспорт" доступны предыдущии версии этого датасета. К сожалению, их можно скачать только в виде Excel. Упражнение с двумя звездочками: подумайте, как скачанные в формате Excel данные прочитать питоном?
- Давайте скачаем версию 3.2 от 21 августа 2017 года. Здесь есть скачанная сохраненная копия в формате xls,
а здесь в формате json (в кодировке utf-8, в качестве имен полей взяты названия столбцов).
- Сколько школ было в Москве тогда? А сколько у них было зданий?
- Обратите внимание, что в том датасете есть интересный столбец "Наличие вступительных испытаний и школьной формы". В скольких школах были вступительные испытания? А школьная форма?
Общественное питание
Посмотрите на датасет Общественное питание в Москве
Давайте попробуем посмотреть, как пандемия повлияла на ресторанный бизнес.
- Скачайте несколько наборов данных так, чтобы между ними проходил примерно год. Я рекомендую начать осенью 2017 и дальше с интервалом год.
Соответственно, мы будем сравнивать изменения, которые происходили в допандемийные 2018, 2019 года и после начала пандемии: 2020, 2021.
Ниже я кладу скачанные xlsx-ки и их же, переделанные в json (кодировка utf-8):
- Найдите в наборах данных нашу школьную столовую. А еще свою любимую кафешку. Посмотрите, во всех ли наборах они есть в неизменном виде, или с ними происходили какие-то изменения?
- Меняется ли как-то общее количество заведений питания в Москве?
- Меняется ли как-то общее число посадочных мест?
- Давайте посчитаем, сколько примерно заведений питания закрывается/открывается новых за год? В разбивке по годам.
- Найдите два наиболее близко расположенных друг к другу Макдональдса. Где такое наблюдается? Какое расстояние между ними?
"Я знаю пять имен девочек, я знаю пять имен мальчиков"
- Вот вам два датасета:
- Напечатайте топ-5 самых популярных имен за все время среди мальчиков? А среди девочек? А наименее популярные? А насколько последний вопрос имеет смысл?
- Какие имена в одном и том же виде используются и для мальчиков, и для девочек?
- Посчитайте топ-10 имен за каждый месяц. Если объединить эти топы за все время, сколько имен окажется в списке? Какие это имена?
Пояснение. Если в каком-то месяце в топ-10 попали 10 каких-то имен, а в следующем месяце вместо одного из них попало какое-то другое, то в итоговом списке будет 11 имен.
- Можете ли вы заметить какие-то изменения предпочтений родителей в именах между 2015 годом и, скажем, 2020?
Есть ли какие-то всплески любви к определенным именам в определенные месяцы/сезоны?
30 ноября. Рисование на карте
Скачайте архив. Запустите программу example.py (остальные файлы и директория templates при этом тоже нужны).
Она создаст файл example.html - откройте его в браузере. Почитайте текст программы и попробуйте что-нибудь поменять,
запустите программу заново, и обновите открытый html-файл в браузере.
Выполните какие-нибудь из упражнений:
- Нарисуйте на карте все здания школы, у которой больше всего зданий.
- Нарисуйте на карте все Макдональдсы.
- Возьмите из датасета про школы ломаные, описывающие каждое из зданий нашей школы, и отобразите его на карте.
- Найдите и отобразите на карте 30-50 ресторанов/кафе/столовых в окрестности нашей школы.
- Выберите из датасета про победителей и призеров олимпиад top-30 школ, отобразите на карте где находятся эти школы.
- Нарисуйте на карте все велодорожки.
- Нарисуйте все вестибюли метро, чтобы при наведении мышки всплывало название станции.
- Придумайте себе задание самостоятельно.
7 декабря. Еще данные и визуализация
ДТП с пострадавшими
Внимание! В этом датасете приведены реальные данные про ДТП с пострадавшими и погибшими.
Подумайте заранее, готовы ли вы (и хотите ли вообще) работать с такого рода данными.
Вам дан датасет про ДТП с пострадавшими в Москве и Московской области за 2020 год:
В этом файле данные записаны в кодировке utf-8, но каждая строка является отдельным json-ом, описывающим одно ДТП.
Это дает возможность обрабатывать данные, не загружая их в память целиком.
Пример кода для работы с данными:
with open(FILENAME, encoding="utf-8") as fin:
for curline in fin:
data = json.loads(curline)
обработать данные из переменной data прежде, чем считать в эту переменную следующую строчку
Упражнения:
- Отобразите на карте все точки, где произошли ДТП в окрестности школы (или своего дома) с дополнительной информацией о ДТП
- Сложное задание Отобразите все точки ДТП вдоль вашего маршрута из дома до школы
- Найдите и отобразите на карте наиболее опасные места. То есть такие места, в которых примерно в одном месте происходит
много ДТП. Подумайте, что значит "примерно в одном месте" и "много ДТП"?
- Посчитайте статистику по числу ДТП, а также по числу пострадавших/погибших, например, по месяцам или даже по неделям.
Сравните периоды между собой и попробуйте сделать какие-то выводы. При этом полезно вспомнить, что было в 2020 году:
- Январь-февраль были очень снежными и ознаменовались высокими баллами пробок
- Примерно с середины марта начался локдаун
- Апрель - пик локдауна
- Май-август - постепенно снимающиеся ограничения
- Сентябрь - выход всех в школу
- Октябрь-декабрь - дистанционная учеба для 6-11 классов, частичный локдаун
Автобусные маршруты Москвы
Посмотрите на датасет про автобусные маршруты
(скачанные данные за 22 ноября 2021). Упражнения:
- Сколько всего в Москве маршрутов?
- Какой маршрут самый длинный
- Нарисуйте на карте все маршруты, проходящие по улице 26 Бакинских Комиссаров между Юго-Западной и Ленинским проспектом
Города
В случайном месте Интернета я нашел API, которое, в частности, умеет выдавать список каких-то городов.
Вот описание на сайте,
где я скачал данные. А вот и сами данные. Упражнения:
- Сколько всего городов в этом датасете?
- Сколько российских городов в этом датасете?
- Нарисуйте на карте все российские города
- Сколько разных часовых поясов встречается в датасете?
- В каком часовом поясе больше всего/меньше всего городов? Попробуйте как-то визуализировать эти данные
- Найдите два самых близких друг к другу города. Найдите город, у которого ближайший к нему город дальше всего. Визуализируйте результат
- Рядом с этими данными лежали еще датасет про страны и аэропорты.
Сколько стран и сколько аэропортов в этих данных?
- Отобразите на карте все российские аэропорты.