Skip to content

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 состоит из двух неразрывно связанных между собой компонентов (метаданных):

  1. series.values — это скрытый внутренний буфер данных, который является чистым, низкоуровневым массивом numpy.ndarray. Вся векторизованная скорость, C-оптимизация и поддержка ufuncs унаследованы Pandas именно отсюда.
  2. 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")])