Лабораторная работа II «curl, SQL JOIN и объединение данных из нескольких источников»

Лабораторная работа 2 «curl, SQL JOIN и объединение данных из нескольких источников»

( командные curl-запросы, HTTP/FTP/SMTP, SQL JOIN, объединение файлов, баз данных и API, подготовка данных для BI. )

Цель работы

Освоить диагностические и тестовые HTTP-запросы из командной строки, получить данные минимум из трех разных источников и построить на Python и SQL единый аналитический набор данных.

Здесь главный учебный результат — студент должен понять, что получить данные и объединить данные — разные этапы инженерного конвейера.

Исходные данные

Собранные студентом данные:

organizations.csv
regions.db

и REST endpoint:

GET /api/transactions

Рекомендуемая структура данных:

organizations.csv

org_id
org_name
city_id
sector

API /api/transactions

transaction_id
org_id
date
amount
currency

SQLite regions.db, таблица cities

city_id
city_name
region_name
population

В данные следует намеренно добавить несколько проблемных ключей: организацию без операций, операцию с неизвестным org_id, город без организации и одну повторяющуюся строку. Тогда различие INNER/LEFT JOIN будет видно практически.

Задание студенту

Ваша задача — получить данные командными и программными средствами, объединить CSV + API + SQLite и построить аналитическую витрину.

Этап A. Диагностика curl.

В терминале выполните:

curl --version

Зафиксируйте версию программы и список протоколов, которые поддерживает конкретная установленная сборка.

curl поддерживает большое число протоколов, включая HTTP/HTTPS, FTP/FTPS и SMTP/SMTPS, но официальный manual уточняет, что конкретная сборка может поддерживать не все из них. [документация]

Далее средствами curl выполните запросы к учебному REST API:

GET списка ресурсов;
GET одного ресурса;
POST;
PUT или PATCH;
DELETE;
HEAD.

Для каждого варианта необходимо сохранить команду и существенную часть ответа.

Студент должен самостоятельно применить параметры для:

вывода response headers;
передачи query parameters;
отправки JSON;
добавления собственного HTTP-заголовка;
следования redirect;
записи ответа в файл.

Официальная документация curl описывает GET как стандартное получение ресурса, --head/-I для HEAD, --location/-L для следования HTTP redirect и --header/-H для собственных заголовков. 

Этап B. Анализ протоколов.

Составьте сравнительную таблицу:

Протокол

Типичная задача

Шифрованный вариант

Поддерживается вашей сборкой curl

HTTP

HTTPS

FTP

FTPS

SMTP

SMTPS

Не требуется подключаться к произвольным FTP- или SMTP-серверам в интернете.

При наличии подготовленного локального учебного FTP/SMTP-сервиса студент выполняет один дополнительный curl-запрос по FTP или SMTP. Передавать реальные учетные данные в открытой командной строке не следует: документация curl отдельно предупреждает, что аргументы запущенной программы могут быть видны другим локальным пользователям.

Этап C. Загрузка источников в Python.

В Jupyter Notebook:

organizations = ...
transactions = ...
cities = ...

где:

  • organizations читается из CSV;

  • transactions получается через REST API;

  • cities извлекается SQL-запросом из SQLite.

Для каждого набора выведите:

shape
dtypes
head()
isna().sum()
число уникальных ключей
число дубликатов

Этап D. Очистка ключей.

Приведите org_id и city_id к одинаковым типам данных.

Проверьте:

дубли ключей;
NULL;
ключи, присутствующие только слева;
ключи, присутствующие только справа.

Нельзя сразу вызывать merge() и считать задачу законченной: студент должен сначала определить ожидаемую кардинальность связи:

1:1
1:N
N:1
N:N

Этап E. Объединение средствами pandas.

Постройте:

  1. organizations INNER JOIN transactions;

  2. organizations LEFT JOIN transactions;

  3. полученный набор LEFT JOIN cities.

Используйте pandas.merge().

Для контроля объединения следует применить:

indicator=True

и там, где кардинальность известна:

validate="one_to_many"
# или
validate="many_to_one"

pandas.merge реализует database-style join, а параметры indicator и validate специально предназначены соответственно для анализа происхождения строк и проверки ожидаемого типа отношения между ключами.

Для каждого JOIN покажите:

число строк до;
число строк после;
число matched;
число left_only;
число right_only.

Этап F. SQL JOIN.

Загрузите подготовленные таблицы в SQLite и выполните аналогичное объединение SQL-запросом.

Обязательные конструкции:

INNER JOIN
LEFT JOIN
GROUP BY
COUNT(...)
SUM(...)
AVG(...)

SQLite определяет INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN; для учебной переносимости студентам лучше использовать стандартные INNER JOIN ... ON ... и LEFT JOIN ... ON .... Для LEFT JOIN строки левой таблицы, которым не найдено соответствие справа, остаются в результате, а отсутствующие правые поля заполняются NULL.

Студент должен сравнить результат SQL JOIN и pandas.merge и объяснить, совпадают ли число строк и агрегаты.

Этап G. Построение витрины.

Создайте итоговый набор:

org_id
org_name
sector
city_name
region_name
transactions_count
total_amount
avg_amount
last_transaction_date

Сохраните:

data/processed/data_mart.csv
data/processed/data_mart.parquet

Этап H. Визуализация и BI.

На Python постройте минимум два графика:

общая сумма операций по регионам;
TOP организаций по общей сумме.

Поскольку рабочая программа отдельно предусматривает BI-инструменты, рекомендуется дополнительно импортировать data_mart.csv в Power BI, Tableau или Qlik и сформировать одну страницу дашборда. 

Что студент должен сдать

lab_2.ipynb
src/loaders.py
src/transform.py
src/database.py
results/curl_commands.txt
data/processed/data_mart.csv
data/processed/data_mart.parquet
results/dashboard.png
README.md

Критерии приемки

Полностью выполненная работа должна демонстрировать цепочку:

curl
↓
получение источников
↓
проверка ключей
↓
pandas.merge
↓
SQL JOIN
↓
сравнение результатов
↓
аналитическая витрина
↓
визуализация / BI

На защите необходимо объяснить INNER JOIN, LEFT JOIN, связь 1:N, назначение ключа, причину возникновения дубликатов после JOIN и отличие curl от библиотеки Requests.

Автор: к.п.н., Румянцев Сергей Александрович, доцент Финансового университета при Правительстве РФ; доцент ОЧУВО Международного инновационного университета; Консалтинг, управление разработкой ПО; системный и бизнес анализ; менеджмент; аналитиз данных; управление ИТ. Телефон для связи +79269444818 (мессенджеры)   Короткая ссылка:

Лабораторная работа 2 «curl, SQL JOIN и объединение данных из нескольких источников»

( командные curl-запросы, HTTP/FTP/SMTP, SQL JOIN, объединение файлов, баз данных и API, подготовка данных для BI. )

Цель работы

Освоить диагностические и тестовые HTTP-запросы из командной строки, получить данные минимум из трех разных источников и построить на Python и SQL единый аналитический набор данных.

Здесь главный учебный результат — студент должен понять, что получить данные и объединить данные — разные этапы инженерного конвейера.

Исходные данные

Собранные студентом данные:

organizations.csv
regions.db

и REST endpoint:

GET /api/transactions

Рекомендуемая структура данных:

organizations.csv

org_id
org_name
city_id
sector

API /api/transactions

transaction_id
org_id
date
amount
currency

SQLite regions.db, таблица cities

city_id
city_name
region_name
population

В данные следует намеренно добавить несколько проблемных ключей: организацию без операций, операцию с неизвестным org_id, город без организации и одну повторяющуюся строку. Тогда различие INNER/LEFT JOIN будет видно практически.

Задание студенту

Ваша задача — получить данные командными и программными средствами, объединить CSV + API + SQLite и построить аналитическую витрину.

Этап A. Диагностика curl.

В терминале выполните:

curl --version

Зафиксируйте версию программы и список протоколов, которые поддерживает конкретная установленная сборка.

curl поддерживает большое число протоколов, включая HTTP/HTTPS, FTP/FTPS и SMTP/SMTPS, но официальный manual уточняет, что конкретная сборка может поддерживать не все из них. [документация]

Далее средствами curl выполните запросы к учебному REST API:

GET списка ресурсов;
GET одного ресурса;
POST;
PUT или PATCH;
DELETE;
HEAD.

Для каждого варианта необходимо сохранить команду и существенную часть ответа.

Студент должен самостоятельно применить параметры для:

вывода response headers;
передачи query parameters;
отправки JSON;
добавления собственного HTTP-заголовка;
следования redirect;
записи ответа в файл.

Официальная документация curl описывает GET как стандартное получение ресурса, --head/-I для HEAD, --location/-L для следования HTTP redirect и --header/-H для собственных заголовков. 

Этап B. Анализ протоколов.

Составьте сравнительную таблицу:

Протокол

Типичная задача

Шифрованный вариант

Поддерживается вашей сборкой curl

HTTP

HTTPS

FTP

FTPS

SMTP

SMTPS

Не требуется подключаться к произвольным FTP- или SMTP-серверам в интернете.

При наличии подготовленного локального учебного FTP/SMTP-сервиса студент выполняет один дополнительный curl-запрос по FTP или SMTP. Передавать реальные учетные данные в открытой командной строке не следует: документация curl отдельно предупреждает, что аргументы запущенной программы могут быть видны другим локальным пользователям.

Этап C. Загрузка источников в Python.

В Jupyter Notebook:

organizations = ...
transactions = ...
cities = ...

где:

  • organizations читается из CSV;

  • transactions получается через REST API;

  • cities извлекается SQL-запросом из SQLite.

Для каждого набора выведите:

shape
dtypes
head()
isna().sum()
число уникальных ключей
число дубликатов

Этап D. Очистка ключей.

Приведите org_id и city_id к одинаковым типам данных.

Проверьте:

дубли ключей;
NULL;
ключи, присутствующие только слева;
ключи, присутствующие только справа.

Нельзя сразу вызывать merge() и считать задачу законченной: студент должен сначала определить ожидаемую кардинальность связи:

1:1
1:N
N:1
N:N

Этап E. Объединение средствами pandas.

Постройте:

  1. organizations INNER JOIN transactions;

  2. organizations LEFT JOIN transactions;

  3. полученный набор LEFT JOIN cities.

Используйте pandas.merge().

Для контроля объединения следует применить:

indicator=True

и там, где кардинальность известна:

validate="one_to_many"
# или
validate="many_to_one"

pandas.merge реализует database-style join, а параметры indicator и validate специально предназначены соответственно для анализа происхождения строк и проверки ожидаемого типа отношения между ключами.

Для каждого JOIN покажите:

число строк до;
число строк после;
число matched;
число left_only;
число right_only.

Этап F. SQL JOIN.

Загрузите подготовленные таблицы в SQLite и выполните аналогичное объединение SQL-запросом.

Обязательные конструкции:

INNER JOIN
LEFT JOIN
GROUP BY
COUNT(...)
SUM(...)
AVG(...)

SQLite определяет INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN; для учебной переносимости студентам лучше использовать стандартные INNER JOIN ... ON ... и LEFT JOIN ... ON .... Для LEFT JOIN строки левой таблицы, которым не найдено соответствие справа, остаются в результате, а отсутствующие правые поля заполняются NULL.

Студент должен сравнить результат SQL JOIN и pandas.merge и объяснить, совпадают ли число строк и агрегаты.

Этап G. Построение витрины.

Создайте итоговый набор:

org_id
org_name
sector
city_name
region_name
transactions_count
total_amount
avg_amount
last_transaction_date

Сохраните:

data/processed/data_mart.csv
data/processed/data_mart.parquet

Этап H. Визуализация и BI.

На Python постройте минимум два графика:

общая сумма операций по регионам;
TOP организаций по общей сумме.

Поскольку рабочая программа отдельно предусматривает BI-инструменты, рекомендуется дополнительно импортировать data_mart.csv в Power BI, Tableau или Qlik и сформировать одну страницу дашборда. 

Что студент должен сдать

lab_2.ipynb
src/loaders.py
src/transform.py
src/database.py
results/curl_commands.txt
data/processed/data_mart.csv
data/processed/data_mart.parquet
results/dashboard.png
README.md

Критерии приемки

Полностью выполненная работа должна демонстрировать цепочку:

curl
↓
получение источников
↓
проверка ключей
↓
pandas.merge
↓
SQL JOIN
↓
сравнение результатов
↓
аналитическая витрина
↓
визуализация / BI

На защите необходимо объяснить INNER JOIN, LEFT JOIN, связь 1:N, назначение ключа, причину возникновения дубликатов после JOIN и отличие curl от библиотеки Requests.

https://webprogr.ru/~9SXJF
Короткая ссылка на новость:https://webprogr.ru/~9SXJF


Последние новости

Лабораторная работа II «curl, SQL JOIN и объединение данных из нескольких источников»

Лабораторная работа 2 «curl, SQL JOIN и объединение данных из нескольких источников»

( командные curl-запросы, HTTP/FTP/SMTP, SQL JOIN, объединение файлов, баз данных и API, подготовка данных для BI. )

Цель работы

Освоить диагностические и тестовые HTTP-запросы из командной строки, получить данные минимум из трех разных источников и построить на Python и SQL единый аналитический набор данных.

Здесь главный учебный результат — студент должен понять, что получить данные и объединить данные — разные этапы инженерного конвейера.

Исходные данные

Собранные студентом данные:

organizations.csv
regions.db

и REST endpoint:

GET /api/transactions

Рекомендуемая структура данных:

organizations.csv

org_id
org_name
city_id
sector

API /api/transactions

transaction_id
org_id
date
amount
currency

SQLite regions.db, таблица cities

city_id
city_name
region_name
population

В данные следует намеренно добавить несколько проблемных ключей: организацию без операций, операцию с неизвестным org_id, город без организации и одну повторяющуюся строку. Тогда различие INNER/LEFT JOIN будет видно практически.

Задание студенту

Ваша задача — получить данные командными и программными средствами, объединить CSV + API + SQLite и построить аналитическую витрину.

Этап A. Диагностика curl.

В терминале выполните:

curl --version

Зафиксируйте версию программы и список протоколов, которые поддерживает конкретная установленная сборка.

curl поддерживает большое число протоколов, включая HTTP/HTTPS, FTP/FTPS и SMTP/SMTPS, но официальный manual уточняет, что конкретная сборка может поддерживать не все из них. [документация]

Далее средствами curl выполните запросы к учебному REST API:

GET списка ресурсов;
GET одного ресурса;
POST;
PUT или PATCH;
DELETE;
HEAD.

Для каждого варианта необходимо сохранить команду и существенную часть ответа.

Студент должен самостоятельно применить параметры для:

вывода response headers;
передачи query parameters;
отправки JSON;
добавления собственного HTTP-заголовка;
следования redirect;
записи ответа в файл.

Официальная документация curl описывает GET как стандартное получение ресурса, --head/-I для HEAD, --location/-L для следования HTTP redirect и --header/-H для собственных заголовков. 

Этап B. Анализ протоколов.

Составьте сравнительную таблицу:

Протокол

Типичная задача

Шифрованный вариант

Поддерживается вашей сборкой curl

HTTP

HTTPS

FTP

FTPS

SMTP

SMTPS

Не требуется подключаться к произвольным FTP- или SMTP-серверам в интернете.

При наличии подготовленного локального учебного FTP/SMTP-сервиса студент выполняет один дополнительный curl-запрос по FTP или SMTP. Передавать реальные учетные данные в открытой командной строке не следует: документация curl отдельно предупреждает, что аргументы запущенной программы могут быть видны другим локальным пользователям.

Этап C. Загрузка источников в Python.

В Jupyter Notebook:

organizations = ...
transactions = ...
cities = ...

где:

  • organizations читается из CSV;

  • transactions получается через REST API;

  • cities извлекается SQL-запросом из SQLite.

Для каждого набора выведите:

shape
dtypes
head()
isna().sum()
число уникальных ключей
число дубликатов

Этап D. Очистка ключей.

Приведите org_id и city_id к одинаковым типам данных.

Проверьте:

дубли ключей;
NULL;
ключи, присутствующие только слева;
ключи, присутствующие только справа.

Нельзя сразу вызывать merge() и считать задачу законченной: студент должен сначала определить ожидаемую кардинальность связи:

1:1
1:N
N:1
N:N

Этап E. Объединение средствами pandas.

Постройте:

  1. organizations INNER JOIN transactions;

  2. organizations LEFT JOIN transactions;

  3. полученный набор LEFT JOIN cities.

Используйте pandas.merge().

Для контроля объединения следует применить:

indicator=True

и там, где кардинальность известна:

validate="one_to_many"
# или
validate="many_to_one"

pandas.merge реализует database-style join, а параметры indicator и validate специально предназначены соответственно для анализа происхождения строк и проверки ожидаемого типа отношения между ключами.

Для каждого JOIN покажите:

число строк до;
число строк после;
число matched;
число left_only;
число right_only.

Этап F. SQL JOIN.

Загрузите подготовленные таблицы в SQLite и выполните аналогичное объединение SQL-запросом.

Обязательные конструкции:

INNER JOIN
LEFT JOIN
GROUP BY
COUNT(...)
SUM(...)
AVG(...)

SQLite определяет INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN; для учебной переносимости студентам лучше использовать стандартные INNER JOIN ... ON ... и LEFT JOIN ... ON .... Для LEFT JOIN строки левой таблицы, которым не найдено соответствие справа, остаются в результате, а отсутствующие правые поля заполняются NULL.

Студент должен сравнить результат SQL JOIN и pandas.merge и объяснить, совпадают ли число строк и агрегаты.

Этап G. Построение витрины.

Создайте итоговый набор:

org_id
org_name
sector
city_name
region_name
transactions_count
total_amount
avg_amount
last_transaction_date

Сохраните:

data/processed/data_mart.csv
data/processed/data_mart.parquet

Этап H. Визуализация и BI.

На Python постройте минимум два графика:

общая сумма операций по регионам;
TOP организаций по общей сумме.

Поскольку рабочая программа отдельно предусматривает BI-инструменты, рекомендуется дополнительно импортировать data_mart.csv в Power BI, Tableau или Qlik и сформировать одну страницу дашборда. 

Что студент должен сдать

lab_2.ipynb
src/loaders.py
src/transform.py
src/database.py
results/curl_commands.txt
data/processed/data_mart.csv
data/processed/data_mart.parquet
results/dashboard.png
README.md

Критерии приемки

Полностью выполненная работа должна демонстрировать цепочку:

curl
↓
получение источников
↓
проверка ключей
↓
pandas.merge
↓
SQL JOIN
↓
сравнение результатов
↓
аналитическая витрина
↓
визуализация / BI

На защите необходимо объяснить INNER JOIN, LEFT JOIN, связь 1:N, назначение ключа, причину возникновения дубликатов после JOIN и отличие curl от библиотеки Requests.

Рейтинг@Mail.ru