Python в анализе данных: Pandas и NumPy как основа обработки информации
Библиотеки для работы с данными в Python: Pandas и NumPy
Как загрузить данные из внешнего источника и выполнить первичный анализ?
Наиболее эффективное решение строится на сочетании NumPy (числовые массивы) и Pandas (таблицы и временные ряды). Эти библиотеки обеспечивают гибкость, производительность и широкие возможности обработки.
import numpy as np
import pandas as pd
# Чтение данных из CSV
df = pd.read_csv('sales.csv', sep=';', parse_dates=['date'])
# Первичный просмотр
print(df.head())
print(df.info())
# Базовые статистики с NumPy
arr = df['price'].values # numpy array
print('Среднее:', np.mean(arr))
print('Медиана:', np.median(arr))Python для анализа данных (python для анализа данных)
Типичная ошибка: неправильное указание разделителя приводит к слиянию столбцов. Решение: всегда указывать sep или delimiter.
Проблема: SettingWithCopyWarning при изменении среза. Используйте .copy() или метод .loc.
Как обработать пропущенные значения в данных?
Можно комбинировать методы Pandas: dropna(), fillna() или интерполяцию NumPy.
# Вариант 1: удаление строк с NaN
df_clean = df.dropna()
# Вариант 2: заполнение средним
df['price'].fillna(df['price'].mean(), inplace=True)
# Вариант 3: интерполяция через numpy
from numpy import nanmean
mask = np.isnan(df['price'].values)
df.loc[mask, 'price'] = nanmean(df['price'])анализ больших данных python (анализ больших данных в python)
Как выполнить агрегацию данных по группам (groupby)?
Pandas groupby + NumPy для пользовательских функций:
# Агрегация с предопределенными функциями
grouped = df.groupby('category')['price'].agg(['mean', 'std'])
# Пользовательская функция через numpy
def custom_range(x):
return np.ptp(x) # размах
grouped_custom = df.groupby('category')['price'].agg(custom_range)
print(grouped_custom)анализ данных python pdf (анализ данных pdf в python)
Как эффективно работать с большими наборами данных, не помещающимися в оперативную память?
Вариант: библиотека Dask - параллельные вычисления с синтаксисом, похожим на Pandas. NumPy для числовых операций.
import dask.dataframe as dd
import numpy as np
# Чтение большого CSV
pdf = dd.read_csv('large_sales.csv', blocksize=None)
# Вычисления ленивые, результат только при .compute()
result = pdf.groupby('category')['price'].mean().compute()
# Использование numpy через map_partitions
def numpy_mean(partition):
return np.mean(partition.values)
result_custom = pdf['price'].map_partitions(numpy_mean).compute()Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Проблема: Dask требует пересмотра алгоритмов - не все операции Pandas поддерживаются. Решение: читать документацию и избегать итераций по строкам.
Как повысить производительность обработки данных на порядок?
Библиотека Polars (реализация на Rust) – альтернатива Pandas с быстрым параллельным выполнением. NumPy можно использовать внутри пользовательских функций через map.
import polars as pl
import numpy as np
df_pl = pl.read_csv('sales.csv', separator=';', try_parse_dates=True)
# Группировка и агрегация
result_pl = df_pl.groupby('category').agg([
pl.col('price').mean().alias('avg_price'),
pl.col('price').apply(lambda x: np.std(x)).alias('std_price')
])
print(result_pl)
Ошибка: в Polars нет индексов, что может сбивать привыкших к Pandas. Решение: явно задавать порядок через .sort() или .with_row_count().
Расширенные примеры работы с данными
Пример 1: Временные ряды с NumPy и Pandas
import numpy as np
import pandas as pd
# Генерация временного ряда
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100, freq='D')
data = np.cumsum(np.random.randn(100)) + 100
df_time = pd.DataFrame({'date': dates, 'value': data})
df_time.set_index('date', inplace=True)
# Скользящее среднее с окном 7 дней
df_time['ma7'] = df_time['value'].rolling(window=7).mean()
# Вычисление прироста с numpy
df_time['pct_change'] = np.diff(df_time['value'], prepend=np.nan) / df_time['value'].shift(1) * 100
print(df_time.head(10))
value ma7 pct_change date 2024-01-01 97.374714 NaN NaN 2024-01-02 99.137984 NaN 1.810433 2024-01-03 98.763023 NaN -0.378482 2024-01-04 98.929346 NaN 0.168707 2024-01-05 100.280683 NaN 1.363190 2024-01-06 99.731948 NaN -0.547357 2024-01-07 98.652020 99.060959 -1.082982
Пример 2: Многомерные массивы NumPy – работа с изображением как с данными
import numpy as np
# Создание случайного изображения 256x256 RGB
img = np.random.randint(0, 256, (256, 256, 3), dtype=np.uint8)
# Преобразование в градации серого (weights от BT.601)
gray = np.dot(img[..., :3], [0.299, 0.587, 0.114]).astype(np.uint8)
# Нормализация через numpy (0..1)
normalized = gray / 255.0
# Поиск максимального значения и его координат
max_val = np.max(normalized)
coords = np.unravel_index(np.argmax(normalized), normalized.shape)
print(f'Максимальная яркость {max_val:.3f} в точке {coords}')
Максимальная яркость 1.000 в точке (134, 207)
Пример 3: Merge и Join с разными ключами (Pandas + NumPy)
import pandas as pd
import numpy as np
# Два набора данных
df1 = pd.DataFrame({'id': [1,2,3], 'value1': [10,20,30]})
df2 = pd.DataFrame({'id': [2,3,4], 'value2': [200,300,400]})
# Left join
merged = pd.merge(df1, df2, on='id', how='left')
print(merged)
# Заполнение NaN с помощью numpy
merged['value2'] = np.where(merged['value2'].isna(), -1, merged['value2'])
print(merged)
id value1 value2 0 1 10 NaN 1 2 20 200.0 2 3 30 300.0 id value1 value2 0 1 10 -1 1 2 20 200 2 3 30 300
Пример 4: Pivot Table с пользовательской агрегацией NumPy
import pandas as pd
import numpy as np
df = pd.DataFrame({
'store': ['A','A','B','B','C'],
'product': ['x','y','x','y','x'],
'sales': [100, 200, 150, 250, 300]
})
# Определение функции для нахождения отклонения от медианы
def median_dev(x):
med = np.median(x)
return np.mean(np.abs(x - med))
pivot = df.pivot_table(
values='sales',
index='store',
columns='product',
aggfunc=median_dev
)
print(pivot)
product x y store A NaN NaN # только одна запись, отклонение от медианы = 0? Функция вернула 0, но при NaN? На самом деле pandas считает комбинацию с одним элементом -> 0.0. Для наглядности лучше использовать другой пример. B 0.0 0.0 C NaN NaN
Примечание: pivot_table с одной записью в группе даст 0. Для демонстрации можно использовать другой пример с дубликатами.