При изучении дата-инжиниринга часто возникает вопрос: «откуда брать данные?»

И тут я вижу два варианта:

  1. Брать реальные данные откуда‑то.

  2. Генерить данные самостоятельно.

Первый вариант хорош, но сложнее, потому что к такого вида данным сложнее получить доступ и я бы этот вариант использовал, если вы хотите на этих данных строить какой‑то продукт или аналитику. Если обобщить, то сделать данные «полезными».

Второй вариант как по мне более предпочтителен, потому что вы сможете проверить больше инструментов и возможностей в своих 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

user_id

int

song_id

int

listen_duration

float

Все эти данные вы можете сгенерировать самостоятельно при помощи инструментов из этой статьи.

На самом деле — это типовая задача, которая описывает бизнес. Поэтому автоматизация такой задачи будет хорошим pet-проектом для вас.

  • Find all Lyft rides which happened on rainy days before noon — очень простая задача, в которой нужно посчитать количество поездок в дождь до полудня. Если опять же говорить про модель данных, то она довольно простая и у вас не составит труда нагенерить данных для неё.

column

column type

index

int

weather

varchar

hour

int

travel_distance

float

gasoline_cost

float

Заключение

Поиск/получение/генерация данных на самом деле довольно частая проблема и я постарался предложить свои варианты решения. В данной статье я постарался указать самые доступные и понятные инструменты. Если у вас есть какие-то интересные источники для генерации данных, то можете поделиться ими в комментариях.


Также если вам необходима консультация/менторство/мок-собеседование и другие вопросы по дата-инженерии, то вы можете обращаться ко мне. Все контакты указаны по ссылке.

Комментарии (0)