2.1 СТРУКТУРЫ ДАННЫХ PYTHON В АНАЛИЗЕ ДАННЫХ

2.1.1 PYTHON КАК ИНСТРУМЕНТ РАБОТЫ С ДАННЫМИ

В первом модуле были рассмотрены архитектура языка Python и организация рабочей среды. Однако знание принципов выполнения программ является лишь основой. Для практической работы аналитика необходимо владеть инструментами обработки данных. Цель данной главы – показать, каким образом Python используется как прикладной инструмент анализа данных. В реальных аналитических задачах работа с данными представляет собой последовательный процесс, включающий несколько этапов:

·       загрузку данных из внешних источников;

·       преобразование данных во внутренние структуры программы;

·       очистку и подготовку данных;

·       численный и табличный анализ;

·       визуализацию и интерпретацию результатов.

Такой процесс в аналитике часто называют конвейером анализа данных (data analysis pipeline). Структура главы и лабораторных работ отражает эту последовательность. Каждая лабораторная работа соответствует отдельному этапу анализа данных (таблица 2.1).

 

Таблица 2.1 – Соответствие лабораторных работ этапам анализа данных

Лабораторная работа

Этап анализа данных

ЛР2

чтение файлов и первичная очистка данных

ЛР3

численный анализ данных с использованием NumPy

ЛР4

табличный анализ данных с использованием Pandas

ЛР5

визуализация данных

ЛР6

применение методов анализа и моделирования

 

Таким образом, в рамках главы проходим полный цикл базового анализа данных – от чтения исходного файла до построения и интерпретации аналитических моделей. В рамках главы рассматриваются:

·       встроенные структуры данных языка Python;

·       работа с файлами различных форматов;

·       обработка текстовых данных с помощью регулярных выражений;

·           численные вычисления с использованием библиотеки NumPy;

·           табличная обработка данных в Pandas;

·       визуализация результатов анализа;

·       базовые методы аналитики и моделирования данных.

Освоение этих инструментов формирует технологическую основу для дальнейшего изучения методов машинного обучения и анализа данных, которые рассматриваются в последующих главах.

2.1.2 СТРУКТУРЫ ДАННЫХ PYTHON

В анализе данных информация в процессе обработки представляется в виде структур данных Python. Даже если данные поступают из файлов или баз данных, они преобразуются во внутренние объекты языка. Структура данных – это способ организации информации в памяти, обеспечивающий её хранение, доступ и преобразование. Без понимания внутренних структур хранения невозможно корректно выполнять преобразование данных и передавать их в специализированные библиотеки анализа. Встроенные структуры данных Python, применяемые в анализе:

·       список (list);

·       кортеж (tuple);

·       словарь (dict);

·       множество (set).

СПИСКИ. Список – это изменяемая упорядоченная последовательность элементов:

numbers = [10, 20, 30, 40]

Основные операции со списками представлены в таблице 2.2.

 

Таблица 2.2 – Основные операции со списками

Операция

Пример

Назначение

Доступ по индексу

numbers[0]

Получение элемента

Изменение элемента

numbers[1] = 25

Замена значения

Добавление элемента

numbers.append(50)

Добавление в конец

Длина списка

len(numbers)

Количество элементов

 

Список является изменяемым типом, что означает возможность изменения его содержимого без создания нового объекта. Список применяется в тех случаях, когда необходимо:

·       сохранить набор числовых значений, считанных из файла;

·       сформировать выборку для последующей передачи в NumPy или Pandas;

·       накапливать результаты вычислений в цикле;

·       передать последовательность данных в модель машинного обучения.

Методика применения списка в анализе данных. Использование списка в аналитике обычно включает следующие этапы:

1)      Инициализация пустой структуры.

2)      Постепенное накопление значений.

3)      Контроль корректности типов данных.

4)      Передача сформированной выборки в библиотеку численного анализа или визуализации.

Именно такая последовательность будет применяться в Лабораторной работе №2 при загрузке и первичной обработке данных из текстовых файлов. Например, при чтении файла построчно:

values = []

with open("data.txt") as file:
    for line in file:
        values.append(float(line.strip()))

Пояснение к коду

values = []создаётся пустой список. Он будет использоваться для накопления числовых значений, считанных из файла.

with open("data.txt") as file: файл data.txt открывается в режиме чтения. Конструкция with обеспечивает автоматическое закрытие файла после завершения работы, даже если возникнет ошибка.

for line in file: файл читается построчно. На каждой итерации переменная line содержит одну строку текста.

line.strip()метод strip() удаляет пробелы и символы перевода строки (\n) в начале и конце строки. Это необходимо, поскольку при чтении из файла каждая строка обычно заканчивается символом новой строки.

float(line.strip())преобразование строки в вещественное число.
Если строка содержит текст, не являющийся числом, возникнет ошибка
ValueError.

values.append(...) – метод append() добавляет полученное число в конец списка.

В приведённом фрагменте программа открывает текстовый файл, считывает его построчно, преобразует каждую строку в вещественное число и формирует список числовых значений.

 В результате переменная values содержит выборку данных, которая может быть далее передана в библиотеку NumPy, использована для вычисления статистических показателей, визуализации или обучения модели.

Следует учитывать, что при наличии в файле пустых строк или некорректных значений, не приводимых к типу float, выполнение программы завершится ошибкой ValueError. В практических задачах анализа данных рекомендуется дополнительно применять механизм обработки исключений (try-except), обеспечивающий устойчивость загрузки данных.

КОРТЕЖИ. Кортеж – это неизменяемая упорядоченная последовательность элементов.

point = (5, 10)

Попытка изменить элемент приводит к ошибке:

point[0] = 7

Кортеж относится к неизменяемым типам данных. Это означает, что после создания его структура и значения элементов не могут быть изменены.

В аналитике кортежи применяются в тех случаях, когда структура данных должна быть зафиксирована и защищена от изменения.

Когда следует использовать кортеж. Кортеж следует использовать тогда, когда:

·       изменение структуры данных недопустимо;

·       данные должны использоваться в качестве ключа;

·       необходимо обеспечить неизменность возвращаемого результата.

Неизменяемость обеспечивает защиту данных от случайного изменения и делает вычислительный процесс более предсказуемым.

Методика применения кортежа в анализе данных. Использование кортежа целесообразно, если:

1)      Структура данных не должна изменяться в процессе вычислений.

2)      Значения используются как составной идентификатор.

3)      Требуется вернуть несколько взаимосвязанных результатов без риска их модификации.

4)      Необходимо зафиксировать параметры алгоритма.

Таким образом, кортеж выступает средством фиксации аналитического результата и повышения надёжности программы.

1. Возврат нескольких значений из функции

# Определение функции statistics.

# Параметр values – список числовых значений.

def statistics(values):

    # Функция возвращает минимальное и максимальное значение списка.

    # Возвращаемые значения автоматически объединяются в кортеж.

    return min(values), max(values)

 

# Вызов функции для конкретного списка чисел

result = statistics([10, 5, 20])

 

# Вывод результата на экран

print(result)

При выполнении возвращается: (5, 20).

Python автоматически объединяет несколько возвращаемых значений в кортеж. Поскольку кортеж является неизменяемым типом данных, полученные результаты не могут быть изменены без создания нового объекта.

Методический акцент. Такой способ возврата данных предотвращает случайное изменение промежуточных аналитических результатов.

2. Использование в качестве ключа словаря

Ключ словаря в Python должен быть неизменяемым объектом. Это связано с тем, что словарь использует механизм хеширования, а хеш возможен только для неизменяемых объектов.

# Создание пустого словаря

coordinates = {}

 

# Кортеж как ключ (допустимо)

point = (10, 20)

coordinates[point] = "A"

В данном случае кортеж (10, 20) используется как составной ключ, например, для хранения значения, связанного с координатами точки. Если попытаться использовать список:

point = [10, 20]

coordinates[point] = "A"

– то возникнет ошибка TypeError, поскольку список является изменяемым объектом и не может быть использован в качестве ключа. Таким образом, кортежи позволяют формировать составные ключи словаря (например, координаты, параметры модели, пары признаков), тогда как изменяемые структуры для этой цели неприменимы.

3. Хранение параметров, которые не должны изменяться

Если параметры алгоритма заданы кортежем:

weights = (0.2, 0.5, 0.3)

– элементы кортежа не могут быть изменены, поскольку кортеж является неизменяемым типом данных. Попытка изменения:

weights[0] = 0.4

– приведёт к ошибке TypeError.

Это означает, что параметры, переданные в функцию, не могут быть модифицированы через изменение элементов структуры. Таким образом, кортеж используется для фиксации набора значений, которые должны оставаться постоянными в процессе выполнения программы.

СЛОВАРИ. Словарь – это структура данных, содержащая пары «ключ–значение».

student = {

    "name": "Анна",

    "age": 21,    "score": 88

}

Словарь представляет собой модель именованной записи: каждому признаку (ключу) соответствует конкретное значение. В аналитике словарь используется тогда, когда данные имеют структуру «признак – значение», а доступ к информации должен осуществляться по имени признака, а не по его позиции. Основные операции со словарём приведены в таблице 2.3.

 

Таблица 2.3 – Основные операции со словарями

Операция

Пример

Назначение

Доступ к значению

student["score"]

Получение значения по ключу

Изменение значения

student["score"] = 90

Обновление существующего значения

Добавление новой пары

student["group"] = "A1"

Добавление нового ключа

Получение всех ключей

student.keys()

Просмотр структуры словаря

Словари являются изменяемыми объектами.

Когда следует использовать словарь. Словарь целесообразно применять, если:

• данные имеют именованные признаки;

• требуется доступ по ключу, а не по индексу;

• порядок элементов не имеет принципиального значения;

• структура может расширяться новыми полями.

В отличие от списка, который хранит значения по их позиции, словарь хранит данные по имени признака, что повышает читаемость и устойчивость к изменениям структуры.

Методика применения словаря в анализе данных. Использование словаря в аналитике обычно включает:

1)      Формирование именованной структуры признаков.

2)      Доступ к значениям по имени, а не по позиции.

3)      Расширение структуры при добавлении новых признаков.

4)      Передачу параметров или записей в функции обработки.

Таким образом, словарь выступает базовой моделью табличной строки и набора параметров. Именно этот принцип лежит в основе последующей табличной структуры DataFrame (раздел 2.5).

1. Представление строки таблицы

CSV (Comma-Separated Values) – текстовый формат хранения табличных данных, в котором значения в строке разделяются запятыми.

Пример содержимого CSV-файла:

name,age,score
Анна,21,88

Первая строка содержит имена столбцов, вторая – значения одной записи.

После чтения такая строка может быть представлена словарём:

student = {
    "name": "Анна",
    "age": 21,
    "score": 88
}

Доступ к значению осуществляется по имени признака:

print(student["score"])

Методический акцент. Использование словаря устраняет зависимость от порядка столбцов. Даже если в файле изменится порядок полей, обращение по ключу "score" останется корректным. Это особенно важно при работе с внешними источниками данных.

2. Передача параметров модели

При настройке алгоритма параметры удобно объединять в словарь:

params = {
    "learning_rate": 0.01,
    "max_depth": 5,
    "n_estimators": 100
}

Внутри функции осуществляется обращение к значению словаря по имени ключа. Это позволяет явно управлять параметрами алгоритма и исключает зависимость от порядка их передачи:

# Определение функции обучения модели.

# Параметр parameters – словарь с настройками алгоритма.

def train_model(parameters):

    # Из словаря извлекается значение параметра "max_depth"

    depth = parameters["max_depth"]

   

    # В реальной задаче переменная depth далее используется

    # при настройке модели (например, глубины дерева решений)

Такой способ передачи данных позволяет:

·       явно именовать каждый параметр;

·       обращаться к значениям независимо от их порядка;

·       добавлять новые параметры без изменения структуры вызова функции.

Методический акцент. Словарь обеспечивает гибкость структуры и удобство масштабирования алгоритмов. Использование словаря особенно целесообразно в задачах машинного обучения, где число настраиваемых параметров может изменяться в процессе разработки модели.

Связь с лабораторной работой. Свойства словарей будут использованы в Лабораторной работе №2 при представлении строк файла в виде именованных структур и передаче параметров обработки в функции анализа.

Кроме того, понимание словаря необходимо для дальнейшего освоения библиотеки Pandas (раздел 2.5), где таблица фактически является расширенной системой именованных столбцов.

МНОЖЕСТВА. Множество – это неупорядоченная коллекция уникальных элементов. Это означает, что одинаковые значения автоматически исключаются.

values = {1, 2, 3, 3}
print(values)

Результат выполнения:

{1, 2, 3}

Повторяющееся значение 3 не сохраняется, поскольку множество хранит только уникальные элементы. Порядок вывода элементов при этом не гарантируется. Основные операции представлены в таблице 2.4.

 

Таблица 2.4 – Основные операции со множествами

Операция

Пример

Назначение

Добавление элемента

values.add(4)

Добавление значения

Удаление элемента

values.remove(2)

Удаление значения

Пересечение

A & B

Общие элементы

Объединение

A | B

Объединение всех элементов

Разность

A - B

Элементы A без элементов B

 

Когда следует использовать множество. Множество следует использовать, если:

• требуется исключить повторяющиеся значения;

• необходимо определить количество уникальных элементов;

• выполняются операции пересечения, объединения или разности;

• порядок элементов не имеет значения.

Множество не поддерживает обращение к элементам по индексу и не сохраняет порядок их добавления, поэтому не используется для хранения упорядоченных наблюдений. Данная структура целесообразна в задачах, где требуется работать исключительно с уникальными значениями без учёта их последовательности.

Методика применения множества в анализе данных. Использование множества в аналитике обычно включает:

1)      Преобразование списка в множество для удаления дубликатов.

2)      Определение числа уникальных категорий.

3)      Сравнение наборов идентификаторов.

4)      Выявление пересечений между выборками.

Таким образом, множество – это инструмент анализа структуры данных, а не их последовательности.

1. Удаление дубликатов

Если данные представлены списком, например,

cities = ["Караганда", "Алматы", "Караганда", "Томск"]

– то для получения уникальных значений выполняется преобразование списка в множество:

unique_cities = set(cities)

print(unique_cities)

Результат выполнения:

{'Караганда', 'Алматы', 'Томск'}

Повторяющееся значение "Караганда" автоматически исключается, поскольку множество хранит только уникальные элементы. Порядок элементов при выводе не гарантируется. Количество уникальных категорий определяется функцией len():

print(len(unique_cities))

Таким образом, преобразование в множество позволяет одновременно:

·       удалить дубликаты;

·       определить число различных значений.

2. Поиск пересечения категорий

Пусть заданы два множества:

group_a = {"Анна", "Иван", "Мария"}

group_b = {"Мария", "Ольга"}

Общие элементы определяются операцией пересечения:

common = group_a & group_b

print(common)

Результат выполнения:

{'Мария'}

Операция & возвращает новое множество, содержащее элементы, присутствующие одновременно в обоих наборах.

Аналитическое применение. Механизм пересечения используется при:

• сравнении списков идентификаторов;

• определении общих категорий в разных выборках;

• анализе пересечения признаков в наборах данных;

• выявлении общих клиентов, событий или объектов в нескольких источниках.

Связь с лабораторной работой. В Лабораторной работе №2 множества будут использоваться:

·       для анализа уникальных значений в файлах;

·       для сравнения различных выборок данных;

·       для выявления пересечений категорий.

Итоги подраздела

В подразделе рассмотрены основные встроенные структуры данных Python: список, кортеж, словарь и множество. Показано, что каждая структура реализует собственную модель организации данных:

·       список – упорядоченная изменяемая последовательность элементов;

·       кортеж – неизменяемая последовательность значений;

·       словарь – именованная структура на основе пар «ключ–значение»;

·       множество – неупорядоченная коллекция уникальных элементов.

Особое внимание уделено различию между изменяемыми и неизменяемыми структурами, поскольку это напрямую влияет на поведение программы при передаче данных в функции, формировании коллекций и предотвращении побочных изменений. Рассмотренные структуры выполняют различные роли в аналитическом процессе:

·       списки используются при первичном чтении и накоплении данных;

·       словари применяются для представления записей и параметров моделей;

·       множества позволяют анализировать уникальные значения и пересечения категорий;

·       кортежи используются для фиксации неизменяемых наборов данных и результатов вычислений.

Таким образом, структуры данных Python являются базовым инструментом организации информации в памяти и подготовительным этапом к дальнейшей работе с файлами, табличными форматами и специализированными библиотеками анализа данных. Понимание их свойств необходимо для корректной организации вычислений, подготовки данных и предотвращения логических ошибок при обработке информации.

Контрольные вопросы

1.       В чём различие между списком и кортежем?

2.       Почему кортежи относятся к неизменяемым типам данных?

3.       В каких случаях целесообразно использовать словарь?

4.       Почему список нельзя использовать в качестве ключа словаря?

5.       В чём аналитический смысл множества?

6.       Как получить уникальные значения из списка?

7.       Чем отличаются изменяемые и неизменяемые структуры данных?

8.        Какова роль встроенных структур Python в последующей работе с NumPy и Pandas?