{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Python для сбора данных\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*\n", "\n", "### Семинар 5 по теме: группировка и агрегирование" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Часть 1: загрузка и преобразование файла JSON\n", "\n", "В рамках этого семинара мы поработаем с файлом в формате JSON. \n", "\n", "JSON расшифровывается как *JavaScript Object Notation*. Изначально этот формат хранения данных использовался в языке JavaScript, но теперь он потерял привязку к конкретному языку программирования и стал универсальным. С форматом JSON можно столкнуться при обращении к API, базам данных; формат часто применяется для хранения информации на сервере, к которому обращается сайт, например, в зависимости от запросов пользователей. *Object* здесь можно понимать как некоторую структуру хранения данных (список, кортеж, словарь), которая записывается в специальном виде, внешне напоминающим обычную строку.\n", "\n", "Импортируем модуль `json`:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "import json" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Начнём работать с реальными данными. Зайдём на [Портал открытых данных](https://data.mos.ru/opendata) Правительства Москвы в раздел Образование и выберем набор данных **Победители олимпиад**. Кликнем *Экспорт* и скачаем файл в формате `json`. Скачается, правда, zip-архив, но его можно распаковать. Сохраним название файла (или путь к нему) в переменную `name`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "name = \"data-27257-2020-02-03.json\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь загрузим содержимое файла в Python. Вообще при работе с json-файлами выделяют две операции: десериализация и сериализация. Десериализация – это преобразование объекта JSON в другую структуру данных (например, в питоновский словарь или список), а сериализация – это запись данных в формат JSON. Десериализуем:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "with open(name, \"r\", encoding=\"Windows-1251\") as read_file:\n", " data = json.load(read_file)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Запись с `with open()` as `read_file` эквивалентна созданию переменной `read_file` и присваиванию ей значения из `open()`. Плюс, так как текст в файле на кириллице, при загрузке файла имеет смысл указать кодировку (здесь это `Windows-1251`), иначе файл может не открыться или открыться, но с крокозябрами вместо букв.\n", "\n", "Посмотрим на `data`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В переменной `data` сохранён список словарей. Можем посмотреть на первый элемент списка:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'global_id': 4472939,\n", " 'Year': '2012/2013',\n", " 'ShortName': 'ГБОУ лицей «Вторая школа»',\n", " 'OlympiadType': 'Всероссийская олимпиада',\n", " 'Stage': '3',\n", " 'Class': '11',\n", " 'Subject': 'Иностранный язык (английский язык)',\n", " 'Status': 'призёр',\n", " 'FullName': 'Государственное бюджетное общеобразовательное учреждение города Москвы «Лицей «Вторая школа»'}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если привести данные в таком формате к привычному табличному виду, то получится, что в таблице у нас есть 9 столбцов (с `global_id` по `FullName`), а каждая строка таблицы описывается словарём как в ячейке выше. Данные в таком формате удобно хранить, к ним удобно писать запросы, выбирая значения по ключам в словарях, но иногда логичнее поместить их в таблицу. Для этого нам понадобится библиотека `pandas`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Превратим список словарей `data` в таблицу (датафрейм `pandas`):" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "olymp = pd.DataFrame(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим на первые несколько строк:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | global_id | \n", "Year | \n", "ShortName | \n", "OlympiadType | \n", "Stage | \n", "Class | \n", "Subject | \n", "Status | \n", "FullName | \n", "
---|---|---|---|---|---|---|---|---|---|
0 | \n", "4472939 | \n", "2012/2013 | \n", "ГБОУ лицей «Вторая школа» | \n", "Всероссийская олимпиада | \n", "3 | \n", "11 | \n", "Иностранный язык (английский язык) | \n", "призёр | \n", "Государственное бюджетное общеобразовательное ... | \n", "
1 | \n", "4472940 | \n", "2012/2013 | \n", "ГБОУ лицей «Вторая школа» | \n", "Всероссийская олимпиада | \n", "3 | \n", "11 | \n", "Иностранный язык (английский язык) | \n", "призёр | \n", "Государственное бюджетное общеобразовательное ... | \n", "
2 | \n", "4472941 | \n", "2012/2013 | \n", "ГБОУ лицей «Вторая школа» | \n", "Всероссийская олимпиада | \n", "3 | \n", "10 | \n", "Иностранный язык (английский язык) | \n", "призёр | \n", "Государственное бюджетное общеобразовательное ... | \n", "
3 | \n", "4472942 | \n", "2012/2013 | \n", "ГБОУ СОШ № 26 | \n", "Всероссийская олимпиада | \n", "4 | \n", "11 | \n", "Иностранный язык (английский язык) | \n", "победитель | \n", "Государственное бюджетное образовательное учре... | \n", "
4 | \n", "4472943 | \n", "2012/2013 | \n", "ГБОУ СОШ № 26 | \n", "Всероссийская олимпиада | \n", "3 | \n", "11 | \n", "Иностранный язык (английский язык) | \n", "призёр | \n", "Государственное бюджетное образовательное учре... | \n", "