Appearance
2. Одномерные структуры: pandas.Series и основы метаданных
Понятие pandas.Series и связь с NumPy
Что такое pandas.Series на физическом уровне
Главным базовым кирпичиком, из которого строятся все датасеты в Pandas, является структура pandas.Series. Физически это одномерный векторизованный массив, очень похожий на обычный numpy.ndarray, но обладающий важнейшим расширением — явными индексными метками (explicit index).
В NumPy к элементам вектора можно было обращаться строго по их порядковым числовым позициям 0, 1, 2.... В pandas.Series вы можете назначить каждой ячейке уникальное имя: текстовую строку (например, название города, ID пользователя), дату или произвольное число.
Внутреннее устройство Series: Владение индексами и C-буфером
Объект pandas.Series состоит из двух неразрывно связанных между собой компонентов (метаданных):
series.values— это скрытый внутренний буфер данных, который является чистым, низкоуровневым массивомnumpy.ndarray. Вся векторизованная скорость, C-оптимизация и поддержка ufuncs унаследованы Pandas именно отсюда.series.index— это специальный индексный объект Pandas (коллекция меток), который накладывается поверх буфера данных и связывает каждую текстовую или числовую метку с конкретным физическим смещением в памяти.
python
import pandas
# Creating a Series with explicit string indices
# Internal buffer is a NumPy array under the hood
features_list = [0.25, 0.88, 0.12]
index_labels = ["feature_A", "feature_B", "feature_C"]
model_features = pandas.Series(data=features_list, index=index_labels)
print(model_features)
# Outputs:
# feature_A 0.25
# feature_B 0.88
# feature_C 0.12
# dtype: float64
# Accessing the underlying low-level C-buffer
print(type(model_features.values)) # Outputs strictly: <class 'numpy.ndarray'>
print(model_features.index) # Outputs Index object: Index(['feature_A', 'feature_B', 'feature_C'], dtype='object')Создание из списка с пропусками: автоматическое приведение типов
В реальных загрузках в сырые списки часто попадают пропуски (сбой датчика, незаполненная анкета). Они передаются в конструктор в виде маркера numpy.nan. Поскольку pandas.Series работает только с однородными данными, присутствие хотя бы одного NaN автоматически превращает весь буфер в вещественный тип float64 — целые числа расширяются до чисел с плавающей запятой. Отдельно стоит запомнить: значения NaN не участвуют в расчете средних, стандартных отклонений и других агрегаторов (см. Урок 9).
python
import numpy
import pandas
# A raw python list with a single missing entry marker
noisy_list = [1, 3, 5, numpy.nan, 6, 8]
noisy_series = pandas.Series(data=noisy_list)
print(noisy_series)
# Outputs:
# 0 1.0
# 1 3.0
# 2 5.0
# 3 NaN
# 4 6.0
# 5 8.0
# dtype: float64
print(noisy_series.dtype) # Outputs: float64 (integers auto-upcast because of the NaN marker)Автоматическое выравнивание данных по индексам
Главная практическая ценность наличия явных индексов заключается в механизме автоматического выравнивания (alignment). Когда две структуры pandas.Series участвуют в математической операции, Pandas складывает или умножает элементы не по их физическому порядку в массиве, а строго сопоставляя одинаковые индексные метки. Это полностью исключает логические ошибки смещения признаков при подготовке датасетов.
Фундаментальные характеристики и аудит структуры
Ключевые свойства метаданных объекта Series
Для контроля геометрии, типов данных и физических параметров одномерного контейнера на практике используются встроенные атрибуты:
.shape— кортеж геометрии. Для Series он всегда одномерный и содержит длину оси, например(3,)..dtype— тип данных элементов внутри скрытого C-буфера (например,float32,int64). Как и в NumPy, Series соблюдает свойство строгой однородности для быстрой математики..size— общее количество элементов в контейнере..name— строковое название признака. В машинном обучении это свойство автоматически становится названием колонки при сборке полноценных таблиц.
python
import pandas
target_labels = pandas.Series(data=[1, 0, 1], name="class_label")
print(target_labels.shape) # Outputs layout: (3,)
print(target_labels.dtype) # Outputs element type: int64
print(target_labels.size) # Outputs: 3
print(target_labels.name) # Outputs: class_labelУпражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию)
1. Конструирование Series с явными текстовыми индексами
Задача: Создайте объект pandas.Series на основе списка значений [120, 450, 310]. Назначьте ячейкам явные строковые индексы: ["user_1", "user_2", "user_3"]. Выведите структуру на экран.
Посмотреть решение
python
import pandas
metrics_list = [120, 450, 310]
user_labels = ["user_1", "user_2", "user_3"]
# Instantiating a Series with custom index references
users_series = pandas.Series(data=metrics_list, index=user_labels)
print(users_series)2. Извлечение низкоуровневого буфера NumPy
Задача: Дан объект prices = pandas.Series(data=[99.9, 14.5, 49.0]). Обратитесь к его внутреннему свойству, возвращающему чистый массив numpy.ndarray, и выведите тип полученного объекта в консоль для подтверждения связи с NumPy.
Посмотреть решение
python
import pandas
prices = pandas.Series(data=[99.9, 14.5, 49.0])
# Accessing the underlying C-level memory buffer layout
raw_buffer = prices.values
print(type(raw_buffer)) # Outputs: <class 'numpy.ndarray'>3. Назначение кастомного имени признака
Задача: Создайте одномерный контейнер из списка вероятностей [0.12, 0.85]. При инициализации передайте параметр name="prediction_probabilities". Выведите объект и атрибут .name созданного объекта.
Посмотреть решение
python
import pandas
# Defining feature metadata tracking names at instantiation
probabilities_series = pandas.Series(data=[0.12, 0.85], name="prediction_probabilities")
print("Assigned feature name:", probabilities_series)
print("Assigned feature name:", probabilities_series.name)4. Комплексный аудит метаданных контейнера
Задача: Создайте Series из чисел от 0 до 99 с помощью функции pandas.Series(range(100)). Выведите на экран три её фундаментальные характеристики: форму (.shape), тип элементов (.dtype) и общий объем элементов (.size).
Посмотреть решение
python
import pandas
large_series = pandas.Series(data=range(100))
# Printing structural characteristics properties
print("Shape layout:", large_series.shape)
print("Data type:", large_series.dtype)
print("Elements total count:", large_series.size)5. Извлечение объекта индексных меток
Задача: Создайте структуру Series, где данными будет список [1, 2], а индексами — ["A", "B"]. Выведите в консоль значение свойства .index этого объекта.
Посмотреть решение
python
import pandas
letters_series = pandas.Series(data=[1, 2], index=["A", "B"])
# Extracting metadata index structural collection object
print(letters_series.index)Упражнения смешанные (5 шт) (включают материал прошлых уроков)
6. Создание Series на базе сгенерированного NumPy-вектора
Задача: Сгенерируйте линейную числовую последовательность из 4 элементов в диапазоне от -1.0 до 1.0 включительно с помощью функции numpy.linspace() (Урок 3 модуля NumPy). Передайте полученный массив в качестве данных в конструктор pandas.Series(), явно назначив текстовые индексы ["w1", "w2", "w3", "w4"] (Урок 2 модуля Pandas). Выведите итоговый объект.
Посмотреть решение
python
import numpy
import pandas
# Step 1: Generate uniform vector stream (NumPy Lesson 3)
numpy_weights = numpy.linspace(-1.0, 1.0, 4)
# Step 2: Bind data block into an explicit pandas container (Pandas Lesson 2)
weights_series = pandas.Series(data=numpy_weights, index=["w1", "w2", "w3", "w4"])
print(weights_series)7. Анализ физического веса C-буфера Series в оперативной памяти
Задача: Создайте массив NumPy из 10 000 нулей, принудительно задав энергоэффективный тип данных numpy.float32 (Урок 4 модуля NumPy). На его основе соберите объект pandas.Series (Урок 2 модуля Pandas). Выведите полный физический объем занимаемой памяти элементами в байтах с помощью атрибута .nbytes.
Посмотреть решение
python
import numpy
import pandas
# Building quantized low-precision allocation block (NumPy Lesson 4)
quantized_buffer = numpy.zeros(10000, dtype=numpy.float32)
# Packing array references into a pandas sequence (Pandas Lesson 2)
monolith_series = pandas.Series(data=quantized_buffer)
print("Physical array size footprint in RAM:", monolith_series.nbytes, "bytes")
# Outputs: 40000 bytes (10000 items * 4 bytes)8. Проверка шагов памяти (Strides) унаследованного буфера Series
Задача: Создайте одномерную структуру features_series = pandas.Series([10, 20, 30]). Поскольку внутренний буфер .values — это массив numpy.ndarray, обратитесь к его низкоуровневому свойству .strides (Урок 2 модуля NumPy). Выведите полученный шаг в байтах на экран.
Посмотреть решение
python
import pandas
features_series = pandas.Series([10, 20, 30])
# Accessing low-level NumPy array strides properties via .values layout block
bytes_step = features_series.values.strides
print("Memory buffer bytes strides step:", bytes_step) # Typically outputs: (8,)9. Интроспекция методов создания Series в Jupyter
Задача: Напишите строку кода для выполнения в ячейке Jupyter Notebook, которая открывает интерактивную справочную Docstring-документацию по главному конструктору pandas.Series с использованием символа интроспекции (Урок 1 модуля NumPy).
Посмотреть решение
python
import pandas
# The built-in help call opens the Series constructor documentation in the pager
help(pandas.Series)10. Поиск функций по маске названия внутри пространства Pandas
Задача: Представьте, что вы забыли точное название функций чтения таблиц в pandas, но помните, что они начинаются на префикс read. Напишите поисковый маскированный запрос для Jupyter Notebook, который отфильтрует и выведет все подходящие методы (Урок 1 модуля NumPy).
Посмотреть решение
python
import pandas
# Reflection via dir() lists all ingestion functions with the read_ prefix
print([name for name in dir(pandas) if name.startswith("read")])