Appearance
8. Чтение датасетов из файлов (CSV, JSON, Parquet) и первичный EDA
Ввод-вывод и форматы хранения данных
Работа с дисковой подсистемой
В реальных ИИ-проектах датасеты практически никогда не создаются вручную внутри кода. Они хранятся на жестких дисках локальных серверов или в облачных хранилищах. Библиотека pandas предоставляет мощный набор встроенных функций для чтения структурированной информации из файлов различных форматов, автоматически переводя их в двумерные структуры pandas.DataFrame.
Текстовые форматы: CSV и JSON
- CSV (Comma-Separated Values): Текстовый формат, где данные разделены запятыми (или другими разделителями, например, точкой с запятой
;или знаком табуляции\t). Для его чтения применяется функцияpandas.read_csv(filepath). Текстовые файлы универсальны, но занимают много места на диске и считываются процессором медленно, так как интерпретатору приходится парсить каждую строчку. - JSON (JavaScript Object Notation): Формат хранения данных в виде структурированных пар «ключ-значение» или вложенных списков. Считывается функцией
pandas.read_json(filepath). Часто используется при работе с API веб-сервисов и логами выгрузки из баз данных NoSQL.
Промышленный стандарт Big Data и AI: формат Parquet
В современной инженерии данных и машинном обучении текстовые CSV-файлы вытеснены специализированным бинарным форматом Parquet (.parquet). Чтение таких файлов выполняется функцией pandas.read_parquet(filepath).
Преимущества формата Parquet перед CSV:
- Колоночное хранение (Columnar Storage): Данные внутри файла упакованы не по строкам, а по столбцам. Если для обучения модели вам нужны только 2 признака из 100, Pandas считает с диска исключительно блоки этих двух столбцов, полностью игнорируя остальные.
- Эффективное сжатие: За счет однородности данных внутри колонок бинарные алгоритмы сжимают Parquet-файлы в 4–10 раз сильнее, экономя дисковое пространство.
- Строгая типизация: В отличие от CSV, где типы данных угадываются на лету, Parquet жестко хранит метаданные типов (
int32,float32). При чтении файлы загружаются в RAM мгновенно без накладных расходов на приведение типов.
Оптимизация RAM при загрузке тяжелых файлов
Если попытаться загрузить терабайтный CSV-файл целиком в оперативную память, сервер мгновенно упадет со стандартной ошибкой переполнения памяти Out of Memory. Чтобы этого избежать, функции чтения pandas поддерживают параметры прецизионного ограничения ввода:
usecols— принимает список названий только тех столбцов фичей, которые реально нужны для обучения модели. Все остальные колонки игнорируются при чтении, колоссально экономя оперативную память.dtype— словарь, в котором вы принудительно задаете низкобитные типы данных для колонок еще до момента их импорта в RAM (например, сжатиеfloat64доfloat32).index_col— указывает, какой именно столбец из файла нужно сразу сделать явной индексной осью строк таблицы, предотвращая создание лишнего числового индекса по умолчанию.
python
import pandas
# Production configuration blueprint for memory-optimized data loading
file_path = "dataset.csv"
target_features = ["feature_age", "feature_salary", "target_class"]
optimized_dtypes = {
"feature_age": "int8",
"feature_salary": "float32",
"target_class": "int8"
}
# Loading only required columns with strict memory-efficient types preset
df_optimized = pandas.read_csv(
filepath_or_buffer=file_path,
usecols=target_features,
dtype=optimized_dtypes,
index_col="feature_age"
)Первичный EDA: распределение категорий, корреляции и слияние таблиц
Аудит распределения категорий через .value_counts()
Первый практический шаг работы с загруженной таблицей — понимание распределения ее признаков. Метод series.value_counts() возвращает одномерную структуру, где индекс — уникальное значение признака, а данные — абсолютная частота его встречаемости в выборке (отсортированы по убыванию). Это базовый инструмент первичного EDA: по нему сразу видны дисбаланс классов и аномальные категории.
python
import pandas
# Compact sample table simulating loaded device usage logs
usage_logs = {
"feature_device": ["ios", "android", "ios", "windows", "android", "ios"],
"target_class": [1, 0, 1, 0, 1, 0]
}
df_logs = pandas.DataFrame(usage_logs)
print("Total samples count:", len(df_logs)) # Outputs: 6
# Counting category occurrences sorted by frequency in descending order
device_distribution = df_logs["feature_device"].value_counts()
print(device_distribution)
# Outputs:
# ios 3
# android 2
# windows 1
# Name: count, dtype: int64Матрица корреляций признаков: .corr()
Для проверки числовых зависимостей между признаками и целевой переменной применяется метод dataframe.corr(). Он рассчитывает симметричную матрицу коэффициентов корреляции Пирсона по всем числовым столбцам таблицы. Текстовые признаки перед корреляционным анализом необходимо перевести в числовой формат: стандартный прием — сравнить столбец с конкретной категорией (получив булеву Series) и привести её к целым int через метод .astype(int) (True -> 1, False -> 0).
python
# Extracting a numeric-relevant subset into a safe isolated copy
# (a plain column selection would trigger a SettingWithCopyWarning on write)
correlation_frame = df_logs[["feature_device", "target_class"]].copy()
# Binary encoding: the equality comparison returns a boolean Series,
# then astype(int) casts True/False flags into 1/0 integers
correlation_frame["feature_device"] = (correlation_frame["feature_device"] == "ios").astype(int)
# Computing the symmetric Pearson correlation matrix over numeric columns
correlation_matrix = correlation_frame.corr()
print(correlation_matrix)
# Diagonal entries are always 1.0 (a column correlates perfectly with itself);
# off-diagonal cells carry the signed strength of pairwise linear dependencies.Слияние двух датасетов: .join() по индексу
Когда признаки и целевые метки хранятся в двух отдельных файлах (классическая схема features.csv + labels.csv), их необходимо объединить. Метод dataframe.join(other) склеивает две таблицы по совпадающим индексным меткам строк, независимо от физического порядка строк во второй таблице. Перед слиянием индексы обеих таблиц должны быть приведены к единой шкале (например, через присваивание numpy.arange()), а для проверки устойчивости пайплайна строки второй таблицы можно случайно перемешать методом sample(frac=1) — выборка 100% строк в случайном порядке.
python
import numpy
import pandas
# Dataset one: feature table with an explicit ID index (as if loaded with index_col)
df_features = pandas.DataFrame(
{"feature_velocity": [10.5, 12.0, 9.8, 14.2], "feature_mass": [2.1, 3.4, 1.9, 4.0]},
index=numpy.arange(1, 5)
)
# Dataset two: target labels with a default automatic index 0..3 (does not match the IDs)
df_targets = pandas.DataFrame({"target_class": [1, 0, 1, 0]})
# Step 1: Remapping the target table index onto the feature table ID scale
df_targets.index = numpy.arange(1, 5)
# Step 2: Shuffling rows to prove that join works by index, not physical order
df_targets = df_targets.sample(frac=1)
# Step 3: Merging the two tables along the shared index axis
merged_df = df_features.join(df_targets)
print(merged_df)
# The target_class values align with the correct velocity/mass rows
# even though the rows in df_targets were randomized.Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию)
1. Чтение классического CSV-датасета
Задача: Напишите строку кода, которая считывает датасет из текстового файла с именем "train_data.csv", лежащего в текущей папке. Результат сохраните в переменную raw_df.
Посмотреть решение
python
import pandas
# Basic file read pipeline activation
raw_df = pandas.read_csv(filepath_or_buffer="train_data.csv")2. Чтение Parquet-файла с жесткими метаданными
Задача: Напишите команду для загрузки высокоскоростного бинарного файла со структурой весов или эмбеддингов с именем "embeddings_logs.parquet".
Посмотреть решение
python
import pandas
# Columnar binary parquet format parsing
embeddings_df = pandas.read_parquet(path="embeddings_logs.parquet")3. Загрузка JSON-файла конфигураций модели
Задача: Импортируйте структурированный файл метаданных "hyperparameters.json" в формате JSON внутрь объекта pandas.DataFrame.
Посмотреть решение
python
import pandas
# Parsing structural JSON key-value blocks
config_df = pandas.read_json(path_or_buf="hyperparameters.json")4. Ограничение импорта столбцов через usecols
Задача: Напишите вызов функции pandas.read_csv() для файла "huge_matrix.csv", настроив параметр usecols так, чтобы из файла загрузились исключительно два столбца признаков: "feature_X" и "feature_Y".
Посмотреть решение
python
import pandas
# Memory isolation: loading only necessary column arrays to prevent RAM spikes
subset_df = pandas.read_csv(
filepath_or_buffer="huge_matrix.csv",
usecols=["feature_X", "feature_Y"]
)5. Принудительное назначение индексного столбца при чтении
Задача: Загрузите CSV-файл "users_logs.csv", настроив параметр index_col так, чтобы колонка с именем "user_id" сразу стала ведущей индексной осью строк таблицы, минуя создание дублирующих индексов по умолчанию.
Посмотреть решение
python
import pandas
# Index optimization setup during initial disk data streaming
indexed_df = pandas.read_csv(
filepath_or_buffer="users_logs.csv",
index_col="user_id"
)Упражнения смешанные (5 шт) (включают материал прошлых уроков)
6. Энергоэффективное чтение CSV с квантованием dtypes и аудит структуры describe
Задача: Напишите код для загрузки файла "metrics.csv", настроив параметры так, чтобы колонка "epoch_num" загрузилась с типом данных numpy.int8, а колонка "loss_val" — с типом numpy.float32 (Урок 4 модуля NumPy / Урок 8 модуля Pandas). К полученному оптимизированному DataFrame примените метод генерации базовых математических показателей распределения .describe() (Урок 5 модуля Pandas). Выведите результат.
Посмотреть решение
python
import numpy
import pandas
# Dict setup specifying type constraints for specific headers before parsing
type_constraints = {
"epoch_num": numpy.int8,
"loss_val": numpy.float32
}
# Step 1: Optimized file stream reading (Lesson 4 NumPy & Lesson 8 Pandas)
optimized_df = pandas.read_csv(filepath_or_buffer="metrics.csv", dtype=type_constraints)
# Step 2: Distribution summary stats generation (Lesson 5 Pandas)
distribution_summary = optimized_df.describe()
print(distribution_summary)7. Изоляция матрицы фичей X сразу после чтенияParquet-файла
Задача: Загрузите бинарный колоночный файл "tabular_features.parquet" (Урок 8 модуля Pandas). Известно, что в этой таблице последний столбец имеет имя "target_class". Используя метод .drop(axis=1), отделите матрицу признаков X от целевого вектора, удалив целевую колонку по горизонтальной оси столбцов (Урок 7 модуля Pandas). Выведите форму .shape полученной матрицы X (Урок 5 модуля Pandas).
Посмотреть решение
python
import pandas
# Step 1: High-speed binary disk parsing (Lesson 8)
full_table_df = pandas.read_parquet(path="tabular_features.parquet")
# Step 2: Isolating training feature spaces via drop axis=1 mechanics (Lesson 5 & Lesson 7)
matrix_X = full_table_df.drop("target_class", axis=1)
print("Features dimension matrix coordinates:", matrix_X.shape)8. Булево маскирование и фильтрация отслайсенного батча строк после загрузки CSV
Задача: Прочитайте файл логов "sensor_data.csv", ограничив загрузку только столбцами ["amplitude", "status"] с помощью usecols (Урок 8 модуля Pandas). Используя оператор .loc[] и побитовое условие &, отберите из полученной таблицы строки, где значение столбца "amplitude" строго больше 10.5 и одновременно "status" равен строго строке "valid" (Урок 6 модуля Pandas). Выведите отфильтрованный батч.
Посмотреть решение
python
import pandas
# Step 1: Loading isolated sub-columns grid from disk (Lesson 8)
raw_subset_df = pandas.read_csv(filepath_or_buffer="sensor_data.csv", usecols=["amplitude", "status"])
# Step 2: Complex bitwise condition masking over row coordinates (Lesson 6)
clean_batch_df = raw_subset_df.loc[
(raw_subset_df["amplitude"] > 10.5) & (raw_subset_df["status"] == "valid"), :
]
print(clean_batch_df)9. Векторизованный расчет экспоненты над столбцом загруженного датасета
Задача: Загрузите файл конфигураций "logits.json" в формате JSON (Урок 8 модуля Pandas). Извлеките из него отдельный изолированный столбец признаков "raw_logits" в виде объекта pandas.Series (Урок 2 модуля Pandas). Примените к числовому буферу значений этого столбца .values универсальную функцию вычисления экспоненты numpy.exp() из модуля NumPy (Урок 8 модуля NumPy) для получения вероятностей Softmax-компонента. Выведите результат.
Посмотреть решение
python
import numpy
import pandas
# Step 1: Loading json data logs structure (Lesson 2 & Lesson 8)
logits_df = pandas.read_json(path_or_buf="logits.json")
logits_series = logits_df["raw_logits"]
# Step 2: Applying low-level vector ufunc transformation directly over array layers (NumPy Lesson 8)
exponential_outputs = numpy.exp(logits_series.values)
print(exponential_outputs)10. Оценка RAM-памяти Parquet-файла цепочкой интроспекции Jupyter
Задача: Напишите строку кода для выполнения в ячейке Jupyter Notebook, которая открывает интерактивную Docstring-справку по встроенному методу загрузки бинарных колоночных файлов pandas.read_parquet с помощью символа интроспекции (Урок 1 модуля NumPy / Урок 1 модуля Pandas).
Посмотреть решение
python
import pandas
# The built-in help call opens the read_parquet documentation in the pager
help(pandas.read_parquet)