При изучении дата-инжиниринга часто возникает вопрос: «откуда брать данные?»
И тут я вижу два варианта:
Брать реальные данные откуда‑то.
Генерить данные самостоятельно.
Первый вариант хорош, но сложнее, потому что к такого вида данным сложнее получить доступ и я бы этот вариант использовал, если вы хотите на этих данных строить какой‑то продукт или аналитику. Если обобщить, то сделать данные «полезными».
Второй вариант как по мне более предпочтителен, потому что вы сможете проверить больше инструментов и возможностей в своих pet‑проектах и не особо задумываться над качеством и источником данных. Но также стоит упомянуть, что можно генерить довольно правдоподобные данные, которые можно будет использовать для аналитики или визуализаций.
Тут стоит сразу оговориться, что статья опубликована в сентябре 2024-го и поэтому какие-то библиотеки, ресурсы и прочее, которые были рассмотрены в статье могут быть не доступны.
Давайте пойдем по порядку, ниже будут приведены примеры того откуда можно брать данные, также частично будут приводиться примеры получения данных через Python.
Web scraping
Наверное один из самых простых вариантов для получения данных. Тут как раз мы можем скрапить почти любые сайты и получать информацию с них для наших дата‑инженерных задач.
Давайте на примере попробуем спарсить сайт с землетрясениями. Для меня как жителя Иркутска — это довольно популярный сайт.
Типовая задача дата‑инженера — это инкрементально забирать данные с источника. Код ниже позволяет получить информацию о землетрясениях в Прибайкалье за весь период, но его можно усовершенствовать и получать данные за «вчера».
import requests
import pandas as pd
from bs4 import BeautifulSoup
import re
url = 'https://seis-bykl.ru/'
try:
# Отправляем GET-запрос к сайту
response = requests.get(url)
response.raise_for_status()
# Проверяем успешность запроса
except requests.RequestException as e:
print(f"Ошибка при запросе к сайту: {e}")
# Создаем объект BeautifulSoup для парсинга HTML
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find_all('table', {'width': '85%', 'border': '1', 'align': 'center'})
# Выбор нужной таблицы на странице
table = table[2]
# Извлекаем данные из таблицы
data = []
headers = []
header_row = table.find('tr')
if header_row:
headers = [th.text.strip() for th in header_row.find_all(['th', 'td'])]
# Пропускаем первую строку (заголовки)
for row in table.find_all('tr')[1:]:
cols = row.find_all('td')
if cols:
row_data = []
for col in cols:
# Очищаем текст от лишних пробелов и переносов строк
text = re.sub(r'\s+', ' ', col.text.strip())
row_data.append(text)
data.append(row_data)
df = pd.DataFrame(data=data, columns=headers)
Вот таким не хитрым способом у нас есть возможность получить информацию с почти любого сайта.
Далее с этой информацией уже можно как-то работать:
Загрузить в БД
Загрузить в
.csv
,.parquet
,.xlsx
, etc.«Покрутить» данные на уровне Python.
Провести аналитику.
Сделать визуализацию.
И другие варианты.
Стоит отметить, что не все сайты так просто парсятся. Чем популярнее сайт, тем больше на нём защиты и разных ограничений для парсинга. Но думаю, что вы сможете найти более-менее простой сайт и сделать свой pet-проект на основании этих данных.
Free API
Существует репозиторий в GitHub public-apis. В нём вы сможете найти множество разных бесплатных API по вашим интересам. Благодаря данными API вы сможете реализовать сбор реальных или искусственных данных.
Важно: перед работой с данным репозиторием прошу вас ознакомиться с данным issues
Для первых и простых примеров рекомендую воспользоваться следующими API.
Official Joke API
Пример задачи: Реализовать DAG, который будет каждый час генерировать шутку через Official Joke API.
import requests
import json
r = requests.get(url='https://official-joke-api.appspot.com/random_joke')
joke = json.loads(r.text)
Randomuser
Пример задачи: Реализовать DAG, который будет каждые пять минут генерировать пользователя через Randomuser.me-Node. Существует уже готовый сайт, к которому можно обращаться.
import json
import requests
r = requests.get(url='https://randomuser.me/api/')
random_user = json.loads(r.text)
Faker
Есть довольно простой способ для получения данных — это их генерация, как я говорил ранее.
Как раз для этого существует библиотека Faker.
Я сейчас покажу, как можно использовать Faker
для генерации информации по «людям». Но вы можете также ознакомиться с другими Faker
по ссылке.
Пример создания ненастоящего пользователя:
from faker import Faker
fake = Faker(locale='ru_RU')
fake_user = {
'first_name': fake.first_name(),
'last_name': fake.last_name(),
'middle_name': fake.middle_name(),
'phone_number': fake.phone_number(),
'address': fake.address(),
'administrative_unit': fake.administrative_unit(),
'city': fake.city(),
'city_name': fake.city_name(),
'country': fake.country(),
'country_code': fake.country_code(),
'postcode': fake.postcode(),
'region': fake.region(),
'street_address': fake.street_address(),
'street_name': fake.street_name(),
'street_title': fake.street_title(),
'registration_at': fake.date_time_ad(),
'birthday': fake.date_time_ad(),
}
Python methods
Но не стоит также забывать о том, что если вам не нужные настоящие данные, то их можно сгенерировать стандартными пакетами Python.
UUID
Самый простой вариант как помне — это генерация uuid
. Данный uuid
каждый раз уникален (почти) и их можно использовать как Primary key
.
При помощи
uuid
можно воссоздать регистрацию пользователей, добавьте колонку сcreated_at
и вы получите регистрацию "пользователя".
import uuid
uuid.uuid4()
Random
И не стоит забывать про великий рандом. При помощи рандома вы можете получить любые значения, в любом диапазоне.
При помощи рандома можно сгенерировать «продажи». Вы можете сделать какое‑то количество «продаж» за день и уже проводить аналитику на них. Или если вам нужно попробовать создавать DAG с нуля и не знаете, что можно загрузить в БД, то рандомное число — не самый плохой вариант.
import random
random.randint(10,100)
NYC taxi
На данном сайте есть информация по поездкам такси Нью-Йорка. Есть данные с 2009-го до 2024-го года.
На этих данных можно проводить аналитику и также можно пробовать загружать их в свои проекты для проведения исследования или создания pet-проектов.
Kaggle
Вообще, Kaggle больше предназначен для Data Science и Machine Learning, но никто не запрещает нам брать оттуда данные и использовать для своих pet-проектов.
Если вы перейдете по ссылке, то сразу сможете попасть на страницу с датасетами, которые можно использовать.
Как можно использовать данные
Выше я перечислил часть источников, откуда можно брать данные для своих pet-проектов. Давайте немного обсудим а какие могут быть проекты и в какую сторону можно подумать.
Я люблю всё приводить на примерах и поэтому вам необходимо представить, что вы владелец бизнеса.
И вы хотите знать всё о вашем бизнесе. Вам важно знать и понимать вашу аудиторию, ваш рынок и прочие моменты, которые касаются бизнеса.
На основании вашего "бизнеса" вы можете совершать pet-проекты в виде:
Расчёта среднего возраста покупателя каждый день.
Гендерное распределение пользователей каждый день.
Средний чек продаж.
И множество других атрибутов, которые могут описать ваш бизнес.
Если у вас плохо с фантазией, то можете воспользоваться кейсами-вопросами с платформы StrataScratch.
Для примера можете воспользоваться следующими задачами:
Aggregate Listening Data— в данной задаче необходимо посчитать общее время прослушивания и количество уникальных песен. Модель данных для задачи довольно простая:
column |
column type |
---|---|
|
|
|
|
|
|
Все эти данные вы можете сгенерировать самостоятельно при помощи инструментов из этой статьи. |
На самом деле — это типовая задача, которая описывает бизнес. Поэтому автоматизация такой задачи будет хорошим pet-проектом для вас.
Find all Lyft rides which happened on rainy days before noon — очень простая задача, в которой нужно посчитать количество поездок в дождь до полудня. Если опять же говорить про модель данных, то она довольно простая и у вас не составит труда нагенерить данных для неё.
column |
column type |
---|---|
|
|
|
|
|
|
|
|
|
|
Заключение
Поиск/получение/генерация данных на самом деле довольно частая проблема и я постарался предложить свои варианты решения. В данной статье я постарался указать самые доступные и понятные инструменты. Если у вас есть какие-то интересные источники для генерации данных, то можете поделиться ими в комментариях.
Также если вам необходима консультация/менторство/мок-собеседование и другие вопросы по дата-инженерии, то вы можете обращаться ко мне. Все контакты указаны по ссылке.