Подготовка данных (data wrangling)
Data wrangling (или data munging) — это превращение «сырых» данных в удобный вид. Данные редко приходят чистыми. Их вводят люди, их собирают сайты, их выгружают из Excel. Поэтому аналитик тратит на чистку много времени.
В этом уроке нет новых функций. Мы собираем план: что обычно сломано и чем это чинить. Работаем с таблицами tutorial.crunchbase_companies_clean_date и tutorial.sf_crime_incidents_2014_01.
Что обычно сломано
Заголовок раздела «Что обычно сломано»| Проблема | Пример в наших данных | Чем чинить |
|---|---|---|
| Дата хранится как текст | founded_at = '9/4/14' | strptime, CAST, SUBSTR |
| Число хранится как текст | '1,000' | REPLACE + CAST, TRY_CAST |
| Лишние символы | location = '(37.78, -122.42)' | TRIM, REPLACE |
| Разный регистр и пробелы | 'Software ', 'SOFTWARE' | LOWER, TRIM |
| Несколько значений в одной колонке | '1200 Block of POLK ST' | SUBSTR, POSITION, LEFT |
| Пропуски | category_code IS NULL | COALESCE, CASE |
| Дубли | Одна компания в двух строках | DISTINCT, GROUP BY |
Про функции для строк — в уроке про строки. Про даты — в уроке про даты.
Пример: чистим домен
Заголовок раздела «Пример: чистим домен»В колонке homepage_url лежит полный адрес. Нам нужен только домен. Уберём https://, http:// и www.:
SELECT homepage_url, REPLACE(REPLACE(REPLACE(homepage_url, 'https://', ''), 'http://', ''), 'www.', '') AS domainFROM tutorial.crunchbase_companies_clean_dateWHERE homepage_url IS NOT NULLLIMIT 5;Функции вложены друг в друга. Сначала работает самая внутренняя.
Пример: заполняем пропуски
Заголовок раздела «Пример: заполняем пропуски»COALESCE берёт первое значение, которое не NULL:
SELECT COALESCE(category_code, 'unknown') AS category, COUNT(*) AS companiesFROM tutorial.crunchbase_companies_clean_dateGROUP BY 1ORDER BY 2 DESCLIMIT 5;Пример: делим одну колонку на две
Заголовок раздела «Пример: делим одну колонку на две»Адрес вида 1200 Block of POLK ST хранит номер дома и улицу вместе. Достанем улицу:
SELECT address, SUBSTR(address, POSITION(' Block of ' IN address) + 10) AS streetFROM tutorial.sf_crime_incidents_2014_01WHERE POSITION(' Block of ' IN address) > 0LIMIT 5;Практика
Заголовок раздела «Практика»Решайте сами, без AI. Сначала напишите запрос, потом сверьтесь с проверкой, и только потом открывайте решение.
Задание 1
Заголовок раздела «Задание 1»Из homepage_url получите домен без https://, http:// и www.. Посчитайте, сколько компаний у каждого домена. Покажите сначала самые частые. Пустые адреса пропустите.
Проверка: 61127 строк. Первая: askforoffer.com — 5 компаний.
Решение
SELECT REPLACE(REPLACE(REPLACE(homepage_url, 'https://', ''), 'http://', ''), 'www.', '') AS domain, COUNT(*) AS companiesFROM tutorial.crunchbase_companies_clean_dateWHERE homepage_url IS NOT NULLGROUP BY 1ORDER BY 2 DESC, 1;Задание 2
Заголовок раздела «Задание 2»В таблице tutorial.sf_crime_incidents_2014_01 возьмите только адреса, где есть текст Block of. Достаньте название улицы (всё после Block of). Посчитайте инциденты по улицам. Покажите сначала самые частые.
Проверка: 833 улицы. Первая: MARKET ST — 467.
Решение
SELECT SUBSTR(address, POSITION(' Block of ' IN address) + 10) AS street, COUNT(*) AS incidentsFROM tutorial.sf_crime_incidents_2014_01WHERE POSITION(' Block of ' IN address) > 0GROUP BY 1ORDER BY 2 DESC, 1;Задание 3
Заголовок раздела «Задание 3»В колонке time время хранится текстом HH:MM. Достаньте час как число. Посчитайте инциденты по часам. Покажите сначала самый загруженный час.
Проверка: 24 строки. Первая: час 18 — 761 инцидент.
Решение
SELECT LEFT(time, 2)::INTEGER AS hour, COUNT(*) AS incidentsFROM tutorial.sf_crime_incidents_2014_01GROUP BY 1ORDER BY 2 DESC, 1;