Закажи экспресс-аудит своего дела онлайн всего за 199 ₽
и получи рекомендации по улучшению - Жми сюда !

5 основных концепций Python, которые должны знать специалисты по анализу данных.

В этой статье мы подробно рассмотрим пять важнейших концепций Python, которые помогут вам перейти от написания неуклюжего, медленного «спагетти-кода» к созданию молниеносно быстрых, готовых к использованию в производственной среде и функционально эффективных конвейеров обработки данных.

5 основных концепций Python, которые должны знать специалисты по анализу данных.

# Введение

Не стоит использовать Python для анализа данных просто «потому что все остальные так делают!». Доминирование Python в области обработки данных не случайно. Это язык, построенный на очень выразительном и читаемом синтаксисе, который абстрагирует низкоуровневое управление памятью. Однако эта же высокоуровневая абстракция имеет свою цену: стандартное выполнение Python осуществляется с использованием динамической типизации и интерпретации, что может сделать итерацию мучительно медленной.

Для создания высокопроизводительных систем обработки данных специалисту по анализу данных необходимо перейти от стандартных процедурных шаблонов кодирования к специализированным, векторизованным и ориентированным на память подходам. В этой статье мы подробно рассмотрим пять основных концепций Python, которые помогут вам перейти от написания неуклюжего, медленного «спагетти-кода» к созданию молниеносно быстрых, готовых к использованию в производственной среде и функционально эффективных конвейеров обработки данных.

# 1. Векторизация NumPy

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

Решение заключается в векторизации с помощью NumPy. Вместо последовательной обработки элементов в байт-коде Python, NumPy переносит циклы в высокооптимизированные, предварительно скомпилированные расширения C. Эти операции работают со всеми массивами одновременно, выполняя непрерывные блоки массивов на машинном уровне, часто используя инструкции SIMD (Single Instruction, Multiple Data).

// Неуклюжий способ

Предположим, у нас есть список из миллиона значений с плавающей запятой, представляющих собой необработанные показания датчика, и нам нужно масштабировать каждое показание в 1,5 раза и применить калибровочную константу 10,0. Используя итеративный цикл в Python:

import time # Большой список из 10 миллионов показаний датчиков n_elements = 10_000_000 data_list = [float(x) for x in range(n_elements)] # Масштабирование значений с помощью явного цикла Python start_time = time.time() scaled_list = [] for val in data_list: scaled_list.append(val * 1.5 + 10.0) loop_duration = time.time() — start_time print(f»Реализация цикла заняла: {loop_duration:.6f} секунд»)

Выход:

Выполнение цикла заняло: 0,378866 секунд

// Векторизованный способ

Вот элегантная векторизованная альтернатива. Мы загружаем данные в непрерывный массив NumPy и выполняем арифметические операции непосредственно над объектом массива:

import numpy as np import time # Большой список из 10 миллионов показаний датчиков n_elements = 10_000_000 # Векторизованный способ: NumPy выполняет все вычисления в предварительно скомпилированных циклах C data_array = np.arange(n_elements, dtype=float) start_time = time.time() scaled_array = data_array * 1.5 + 10.0 numpy_duration = time.time() — start_time print(f»Реализация NumPy заняла: {numpy_duration:.6f} секунд») print(f»Ускорение: {loop_duration / numpy_duration:.1f}x быстрее!»)

Выход:

Реализация цикла заняла: 0,348456 секунды. Реализация NumPy заняла: 0,013395 секунды. Ускорение: в 26 раз быстрее!

Векторизация арифметических операций позволяет добиться значительного повышения производительности за счет более чистого и лаконичного кода. Цикл исключается из кода Python и выполняется полностью в высокоскоростном коде C.

# 2. Вещание: математические правила для несоответствующих размеров

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

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

Правила вещания следующие:

  1. Если массивы имеют разный ранг (количество измерений), добавьте к форме массива с более низким рангом единицы до тех пор, пока обе формы не будут иметь одинаковую длину.
  2. Два измерения совместимы, если они равны или если одно из них равно 1.
  3. Если массив совместим, он ведет себя так, как если бы он был растянут вдоль измерения размера 1, чтобы соответствовать форме другого массива.

// Неуклюжий способ

Предположим, у нас есть матрица признаков 3×4 (3 образца, 4 признака), и мы хотим вычесть средние значения столбцов, чтобы «вычесть» средние значения признаков:

import numpy as np features = np.array([ [10.0, 20.0, 30.0, 4.0], [12.0, 24.0, 36.0, 8.0], [14.0, 28.0, 42.0, 12.0] ]) # Среднее значение каждого столбца признаков (форма: (4,)) col_means = np.mean(features, axis=0) # Использование вложенных циклов для ручного де-среднего demeaned_clunky = np.zeros_like(features) for idx in range(features.shape[0]): for col_idx in range(features.shape[1]): demeaned_clunky[idx, col_idx] = features[idx, col_idx] — col_means[col_idx] # Альтернатива: разбиение массива на блоки для принудительного сопоставления shapes tiled_means = np.tile(col_means, (features.shape[0], 1)) demeaned_tiled = features — tiled_means

// По-питоновски

При широковещательной рассылке мы выполняем вычитание напрямую. NumPy автоматически выравнивает матрицу признаков (3, 4) с массивом средних значений столбцов (4, ), рассматривая форму средних значений столбцов как (1, 4):

import numpy as np features = np.array([ [10.0, 20.0, 30.0, 4.0], [12.0, 24.0, 36.0, 8.0], [14.0, 28.0, 42.0, 12.0] ]) col_means = np.mean(features, axis=0) # Вычитание в стиле Python с помощью автоматического широковещательного преобразования demeaned_broadcasting = features — col_means # Деление каждой строки на ее сумму строк # row_sums имеет форму (3,) -> чтобы разделить (3, 4) на (3,), мы расширяем форму до (3, 1) с помощью np.newaxis row_sums = np.sum(features, axis=1) normalized_features = features / row_sums[:, np.newaxis] print(«Demeaned:n», demeaned_broadcasting) print(«nНормализованные строки:n», normalized_features)

Выход:

Обезличение: [[-2. -4. -6. -4.] [ 0. 0. 0. 0.] [ 2. 4. 6. 4.]] Нормализованные строки: [[0.15625 0.3125 0.46875 0.0625 ] [0.15 0.3 0.45 0.1 ] [0.14583333 0.29166667 0.4375 0.125 ]]

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

# 3. Методы Pandas .pipe() и .assign(): Чистые, функциональные конвейеры

Подготовка данных в Pandas часто превращается в запутанный, последовательный код. Разработчики создают множество промежуточных DataFrame (df1, df2 и т. д.), изменяют переменные на месте или используют цепочки скобок. Это приводит к коду, который трудно читать, сложно тестировать и который печально известен своей склонностью к появлению ужасного предупреждения SettingWithCopyWarning.

Современный Pandas поощряет переход от процедурных изменений к функциональным, декларативным конвейерам обработки данных. Используя метод `.assign()` для создания признаков и метод `.pipe()` для многократно используемых операций с несколькими столбцами, вы можете объединять шаги в одном конвейере.

// Неуклюжий способ

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

import pandas as pd import numpy as np raw_data = { 'Customer_ID': [101, 102, 103, 104, 105], 'Age': [25, -5, 47, 120, 31], 'Country': ['usa', 'CANADA', 'usa', 'Germany', 'canada'], 'Raw_Spend': [120.50, 450.00, 80.00, np.nan, 300.00] } df = pd.DataFrame(raw_data) # Последовательные промежуточные изменения df_clean = df.copy() # 1. Отфильтровываем недействительные значения возраста df_clean = df_clean[(df_clean['Age'] >= 0) & (df_clean['Age'] pd.DataFrame: df_out = dataframe.copy() df_out['Country'] = df_out['Country'].str.upper().str.strip() return df_out # Единый элегантный функциональный конвейер df_clean_pipeline = ( df.query(«Age >= 0 and Age

Источник: www.kdnuggets.com

✅ Найденные теги: 5, Python, Должны, Концепций, Которые, новости, Основных

Добавить комментарий

Новости других рубрик

Архив рубрики ~Лента новостей~: «The Apple Boogie» — промо-альбом Mac 1987 года на кассете [видео] Архив рубрики ~Лента новостей~: Хакеры взломали аккаунты в Instagram, обманом заставив чат-бот службы поддержки Meta AI предоставить им доступ. Архив рубрики ~Лента новостей~: Созданные с помощью ИИ синтетические нейроны ускоряют картирование головного мозга. Архив рубрики ~Лента новостей~: Контекст для LLM в тестировании: от калькулятора страховой премии до ТЗ на сотню страниц Архив рубрики ~Лента новостей~: Искусственный интеллект меняет наше мышление, а не заменяет его | Письма читателей Архив рубрики ~Лента новостей~: Вышел MiniMax-M3, превосходящий GPT-5.5 и Gemini 3.1 Pro по ключевым показателям производительности, при этом его стоимость составляет всего 5-10% от цены предыдущего устройства. Архив рубрики ~Лента новостей~: Теология возможных миров. Есть ли боги в мультивселенной, или мультивселенная и есть Бог? Архив рубрики ~Лента новостей~: Каннский кинофестиваль утверждает, что Wall Street Journal ошибается: на этой неделе он не представит художественный фильм, созданный искусственным интеллектом