Создание пространственной базы данных#
Материалы к практическому занятию#
Скачайте Данные_на_практику.rar.
В директории Student создайте папку Группа_ФИО. Разархивируйте скаченные материалы
Подготовка к работе#
PostgreSQL предоставляет несколько инструментов для администрирования. Основным является psql — это командная строка, через которую выполняются SQL-запросы. Он предназначен для ввода команд вручную и позволяет выполнять любые операции с базой данных, включая создание, изменение и удаление данных и объектов базы.
Помимо psql, широкое распространение получил графический интерфейс pgAdmin — бесплатный и открытый инструмент, позволяющий работать с базами данных PostgreSQL в более наглядной форме. В pgAdmin все те же команды и запросы, которые можно вводить в psql, доступны через удобный графический интерфейс, что делает его предпочтительным для пользователей, предпочитающих визуальные средства управления.
На практике мы будем использовать pgAdmin, так как он упрощает работу с базами данных за счёт удобного интерфейса и визуализации. Чтобы начать работу, выполните следующие шаги:
- Откройте pgAdmin, найдя его в меню Пуск на вашем компьютере.
- При первом запуске, если во вкладке Servers нет ни одной записи (см. рисунок ниже), нужно добавить сервер вручную.
- Для этого нажмите правой кнопкой мыши (ПКМ) на Servers и выберите опцию Create -> Server (в некоторых версиях это может быть Register -> Server).
- В открывшемся окне введите название сервера, например, Postgres, в поле Name.
После этого необходимо настроить подключение к серверу базы данных:
- Перейдите во вкладку Connection.
- В поле Host name/address введите «localhost», если вы работаете на локальном компьютере, либо адрес сервера, если база данных находится удалённо.
- Поле Port оставьте по умолчанию — 5432.
- В поле Username введите «postgres», если вы используете стандартного администратора базы данных.
- В поле Password укажите пароль, который был установлен при установке PostgreSQL.
После настройки подключения нажмите Save, и ваш сервер будет добавлен в список. Теперь вы можете работать с базой данных через pgAdmin, создавая, изменяя и просматривая данные, а также выполняя различные SQL-запросы.
Чтобы создать базу данных, достаточно нажать правой кнопкой мыши (ПКМ) по названию сервера в pgAdmin:
- Выберите опцию Create -> Database.
- В открывшемся окне задайте имя для базы данных, например, Tests.
- В поле Owner укажите владельца базы данных (по умолчанию это может быть пользователь postgres, если другого владельца не назначали).
После создания базы данных необходимо активировать расширение PostGIS, так как оно изначально недоступно и требует ручной активации:
- Раскройте список баз данных, нажав на имя сервера, затем выберите вашу базу данных (например, Tests).
- Перейдите в раздел Extensions.
- Нажмите правой кнопкой мыши (ПКМ) по Extensions и выберите Create -> Extension.
- В новом окне в поле Name выберите «PostGIS» из списка доступных расширений.
- Нажмите Save для активации расширения.
Теперь расширение PostGIS будет активировано для вашей базы данных, и вы сможете работать с пространственными данными, используя все функции, которые оно предоставляет.
Для проверки, что расширение PostGIS успешно активировано в вашей базе данных, выполните следующие шаги:
- Выберите БД (щелкнув по ней. она загорится голубым цветом)
- Перейдите в меню Tools и выберите Query Tool.
- В открывшемся окне введите следующий SQL-запрос:
SELECT postgis_full_version();
Загрузка готовой БД#
Чтобы загрузить готовую базу данных из архива и восстановить её в PostgreSQL через pgAdmin, выполните следующие шаги:
-
Разархивируйте файл Данные_на_практику.rar. Внутри вы найдете файл резервной копии базы данных nyc_data.backup.
-
Создайте новую базу данных для восстановления данных. Для этого нажмите правой кнопкой мыши (ПКМ) на сервере, выберите Create -> Database, дайте имя базе данных, например, nyc_data, и укажите владельца.
-
После создания базы данных выполните восстановление резервной копии:
-
Нажмите ПКМ на созданной базе данных nyc_data.
- Выберите Restore из выпадающего меню.
-
В окне восстановления:
-
В поле Filename укажите путь к файлу nyc_data.backup (или нажмите на кнопку выбора файла и найдите его).
-
Оставьте остальные настройки по умолчанию и нажмите Restore.
-
Процесс восстановления начнётся. После его завершения база данных будет готова к использованию, и вы сможете работать с данными, которые были загружены.
Описание данных#
Данные для данного практикума включают четыре шейп-файла для города Нью-Йорк и одну атрибутивную таблицу с социодемографическими переменными. Мы загрузим наши шейп-файлы как таблицы PostGIS и добавим социодемографические данные позже в ходе занятия.
Ниже описаны количество записей и атрибуты каждой из наших таблиц. Эти данные и их взаимосвязи важны для последующего анализа.
Для изучения структуры таблиц в pgAdmin нажмите правой кнопкой мыши на выбранной таблице и выберите Properties. Вы найдете краткое описание свойств таблицы, включая список атрибутов в разделе Columns.
Таблица nyc_census_blocks#
Блок переписи населений — это самая мелкая географическая единица, для которой собираются данные переписи. Все более крупные географические единицы (группы блоков, тракты, метрополии, округа и т.д.) могут быть сформированы объединением блоков. В данной таблице к блокам прикреплены демографические данные.
Количество записей: 38 794
Атрибут | Описание |
---|---|
blkid |
Уникальный 15-значный код блока переписи (например: 360050001009000) |
popn_total |
Общее количество людей в блоке переписи |
popn_white |
Количество людей, идентифицирующих себя как "Белые" |
popn_black |
Количество людей, идентифицирующих себя как "Темнокожие" |
popn_nativ |
Количество людей, идентифицирующих себя как "Коренные американцы" |
popn_asian |
Количество людей, идентифицирующих себя как "Азиаты" |
popn_other |
Количество людей, относящихся к другим категориям |
boroname |
Название района Нью-Йорка (Манхэттен, Бронкс, Бруклин, Статен-Айленд, Куинс) |
geom |
Полигональная граница блока |
Таблица nyc_neighborhoods#
Нью-Йорк имеет богатую историю районных названий и границ. Районы являются социальными конструкциями, не всегда совпадающими с административными границами.
Количество записей: 129
Атрибут | Описание |
---|---|
name |
Название района |
boroname |
Название района Нью-Йорка |
geom |
Полигональная граница района |
Таблица nyc_streets#
Центральные линии улиц формируют транспортную сеть города. Улицы классифицированы по типам, чтобы различать, например, аллеи, магистрали и пешеходные улицы.
Количество записей: 19 091
Атрибуты:
name — название улицы.
oneway — является ли улица односторонней («yes» = да, «» = нет).
type — тип дороги (primary, secondary, residential, motorway).
geom — центральная линия улицы.
Атрибут | Описание |
---|---|
name |
Название улицы |
oneway |
Является ли улица односторонней («yes» = да, «» = нет) |
type |
Тип дороги (primary, secondary, residential, motorway) |
geom |
Центральная линия улицы |
Таблица nyc_subway_stations#
Станции метро соединяют поверхностный мир с подземной сетью метро. Расположение станций определяет доступность для разных категорий населения.
Количество записей: 491
Атрибут | Описание |
---|---|
name |
Название станции |
borough |
Название района Нью-Йорка |
routes |
Линии метро, проходящие через станцию |
transfers |
Линии, на которые можно пересесть на этой станции |
express |
Является ли станция остановкой для экспресс-поездов («express» = да, «» = нет) |
geom |
Точечное местоположение станции |
Таблица nyc_census_sociodata#
Эта таблица содержит социоэкономические данные, собранные на уровне переписных участков. Чтобы проводить пространственный анализ, эти данные необходимо связать с географическими данными блоков или участков переписи.
Атрибут | Описание |
---|---|
tractid |
Уникальный 11-значный код переписного участка |
transit_total |
Общее количество работников в участке |
transit_private |
Количество работников, использующих частный транспорт |
transit_public |
Количество работников, использующих общественный транспорт |
transit_walk |
Количество работников, ходящих пешком |
transit_other |
Количество работников, использующих другие виды транспорта |
transit_none |
Количество работников, работающих из дома |
transit_time_mins |
Общее количество минут, проведенных в пути |
family_count |
Количество семей в участке |
family_income_median |
Медианный доход семьи |
family_income_mean |
Средний доход семьи |
edu_total |
Общее количество людей с образовательной историей |
edu_no_highschool_dipl |
Количество людей без диплома средней школы |
edu_highschool_dipl |
Количество людей с дипломом средней школы |
edu_college_dipl |
Количество людей с дипломом колледжа |
edu_graduate_dipl |
Количество людей с дипломом магистра |
Простые запрос на sql#
SQL, или язык структурированных запросов, используется для работы с реляционными базами данных, позволяя задавать вопросы к данным и обновлять их. Мы уже видели SQL в действии на прошлых практиках.
Однако, теперь, когда мы загрузили данные в базу, давайте использовать SQL для извлечения информации непосредственно из этих данных.
Например, задайтесь вопросом:
Как вывести названия всех районой Нью-Йорка?
Чтобы выполнить этот запрос, откройте SQL-окно запросов в pgAdmin, нажав кнопку Query Tool.
Tip
SELECT name FROM nyc_neighborhoods;
Нажмите кнопку "Выполнить запрос" (зелёный треугольник). Этот запрос вернёт 129 результатов, представляющих все районы Нью-Йорка.
Но что произошло на самом деле? Для лучшего понимания рассмотрим четыре основных "глагола" SQL:
SELECT — возвращает строки в ответ на запрос.
INSERT — добавляет новые строки в таблицу.
UPDATE — изменяет существующие строки.
DELETE — удаляет строки из таблицы.
В рамках курса мы будем работать преимущественно с SELECT, чтобы формулировать запросы к таблицам.
Запросы SELECT#
Запрос типа SELECT обычно имеет следующую структуру:
SELECT столбцы FROM таблица WHERE условие;
Где:
- столбцы — это имена столбцов или функции, применяемые к значениям столбцов.
- таблица — это источник данных, которым может быть одна таблица или результат соединения нескольких таблиц.
- условие — это фильтр, ограничивающий количество возвращаемых строк.
Рассмотрим другой пример:
"Какие районы входят в состав Бруклина?"
Для этого используем запрос с фильтром:
Tip
SELECT name
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
Этот запрос вернёт 23 результата.
Иногда возникает необходимость применить функцию к результатам запроса.
"Сколько букв в названиях всех районов в Бруклине?"
К счастью, PostgreSQL имеет встроенную функцию для работы с длиной строк, char_length(string):
Tip
SELECT char_length(name)
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
Часто нас больше интересует статистика по всем результатам, а не отдельные строки. В таких случаях используются агрегатные функции, которые обрабатывают несколько строк и возвращают одно значение.
"Какова средняя длина названий районов в Бруклине и стандартное отклонение?"
Tip
SELECT avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
Результат будет выглядеть так:
avg | stddev |
---|---|
11.74 | 3.91 |
Группировка результатов с помощью GROUP BY#
Иногда нам нужно агрегировать данные по группам. Для этого используется оператор GROUP BY.
"Какова средняя длина названий районов в Нью-Йорке, распределённая по районам?"
Tip
SELECT boroname, avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
GROUP BY boroname;
Результат покажет средние значения и стандартные отклонения по каждому району:
boroname | avg | stddev |
---|---|---|
Brooklyn | 11.74 | 3.91 |
Manhattan | 11.82 | 4.31 |
The Bronx | 12.04 | 3.67 |
Queens | 11.67 | 5.01 |
Staten Island | 12.29 | 5.20 |
Задание на практику#
Таблица nyc_census_blocks
была дополнена:
Определение таблицы nyc_census_blocks:
- blkid
: Уникальный 15-значный код для каждого блока переписи. Например: “360050001009000”.
- popn_total
: Общее количество людей в блоке переписи.
- popn_white
: Количество людей, идентифицирующих себя как «белые» в блоке.
- popn_black
: Количество людей, идентифицирующих себя как «темнокожие» в блоке.
- popn_nativ
: Количество людей, идентифицирующих себя как «коренные американцы» в блоке.
- popn_asian
: Количество людей, идентифицирующих себя как «азиаты» в блоке.
- popn_other
: Количество людей, идентифицирующих себя с другими категориями в блоке.
- hous_total
: Общее количество жилых единиц в блоке.
- hous_own
: Количество жилых единиц, принадлежащих владельцам, в блоке.
- hous_rent
: Количество жилых единиц, занимаемых арендаторами, в блоке.
- boroname
: Название района Нью-Йорка: Манхэттен, Бронкс, Бруклин, Статен-Айленд, Куинс.
- geom
: Полигональная граница блока.
Полезные функции агрегации SQL:
- avg(): среднее значение (mean) в наборе записей.
- sum(): сумма значений в наборе записей.
- count(): количество записей в наборе записей.
Сколько записей в таблице nyc_streets
?
Ответ: 19091
Сколько улиц в Нью-Йорке начинается на букву 'B'?
Ответ: 1282
Каково население города Нью-Йорка?
Ответ: 8175032
Каково население Бронкса?
Ответ: 1385108
Сколько «районов» в каждом округе?
Результат:
boroname | count |
---|---|
Queens | 30 |
Brooklyn | 23 |
Staten Island | 24 |
The Bronx | 24 |
Manhattan | 28 |
Каков процент белого населения в каждом районе?
Результат:
boroname | white_pct |
---|---|
Brooklyn | 42.80% |
Manhattan | 57.45% |
The Bronx | 27.90% |
Queens | 39.72% |
Staten Island | 72.89% |