Анализ данных: Pandas и NumPy в действии
Инструменты анализа данных на Python
Как эффективно загрузить и быстро изучить табличные данные?
Наиболее универсальный способ - использование pandas.read_csv() с указанием правильного разделителя и кодировки. После загрузки применяют .head(), .info() и .describe() для первичного анализа.
import pandas as pd
import numpy as np
df = pd.read_csv('data.csv', sep=',', encoding='utf-8')
print(df.head())
print(df.info())
print(df.describe())Python для анализа данных (python для анализа данных)
Age Salary Experience 0 25 50000 2 1 30 60000 5 2 35 70000 8 ... <class 'pandas.core.frame.DataFrame'> RangeIndex: 10 entries, 0 to 9 Data columns: 3 columns ...
анализ больших данных python (анализ больших данных в python)
Типичная ошибка: неверное указание разделителя (sep) или кодировки (encoding='cp1251' для русских текстов). Приводит к ошибке ParserError или искажению данных. Решение - проверять файл в текстовом редакторе или использовать pd.read_csv(..., sep=None, engine='python') для автоматического определения.
Как загрузить данные из Excel без потери форматирования?
Используйте pd.read_excel() с указанием имени листа. Важно установить библиотеку openpyxl или xlrd.
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1', engine='openpyxl')
df_excel.head()анализ данных python pdf (анализ данных pdf в python)
Проблема: при отсутствии openpyxl возникает ModuleNotFoundError. Решение: установить через pip install openpyxl.
Как импортировать данные из JSON для вложенных структур?
Команда pd.read_json() автоматически разбирает вложенные объекты, но для сложных иерархий лучше использовать json.loads() и затем нормализовать через pd.json_normalize().
import json
with open('nested.json', 'r') as f:
data = json.load(f)
df_json = pd.json_normalize(data, record_path='items', meta=['id', 'name'])
df_json.head()Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
item_id value id name 0 1 10 1 Alice 1 2 20 1 Alice 2 3 30 2 Bob
анализ данных с использованием python (анализ данных с использованием python)
Типичная ошибка: неправильные пути record_path и meta. Решение - вывести структуру JSON через print(data.keys()) и подобрать корректные параметры.
Как загрузить данные из SQL базы без дублирования колонок?
Используйте pd.read_sql_query() с SQL запросом. Убедитесь, что установлен драйвер (psycopg2 для PostgreSQL, pymysql для MySQL).
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pass@localhost/db')
df_sql = pd.read_sql_query('SELECT * FROM orders LIMIT 10', engine)
df_sql.head()Python анализ текстовых данных (анализ текстовых данных в python)
Проблема: дублирование колонок при использовании JOIN. Решение - явно указывать нужные поля в SELECT или использовать .drop_duplicates() после загрузки.
Как обработать пропуски данных без потери важной информации?
Самый простой способ - удалить строки с пропусками (df.dropna()) или заполнить их средним значением (df.fillna(value)). Для временных рядов эффективна интерполяция.
df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [np.nan, 2, 3, 4]})
df_drop = df.dropna()
print("После dropna:")
print(df_drop)
df_fill = df.fillna(df.mean())
print("\nПосле fillna средним:")
print(df_fill)Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
После dropna:
A B
1 2.0 2.0
3 4.0 4.0
После fillna средним:
A B
0 1.000000 3.000000
1 2.000000 2.000000
2 2.333333 3.000000
3 4.000000 4.000000библиотеки python для обработки данных (библиотеки python для обработки данных (pandas, numpy и др.))
Типичная ошибка: заполнение пропусков константой, не учитывающей распределение. Решение - использовать статистические меры (медиану для выбросов) или метод .interpolate() для плавного заполнения.
Как заменить пропуски на основе соседних значений вперед/назад?
Методы ffill() и bfill() копируют предыдущее или следующее значение. Полезно для временных рядов.
df['A_ffill'] = df['A'].ffill()
print(df[['A', 'A_ffill']])математика и python для анализа данных (математика и python для анализа данных)
A A_ffill 0 1.0 1.0 1 2.0 2.0 2 NaN 2.0 3 4.0 4.0
методы анализа данных python (методы анализа данных в python)
Проблема: если пропуски в начале/конце ряда, ffill/bfill оставляют NaN. Решение - комбинировать с fillna или интерполяцией.
Как использовать интерполяцию для нелинейных данных?
DataFrame.interpolate() по умолчанию работает линейно. Для временных рядов укажите method='time'. Для сплайнов - method='spline', order=3.
ts = pd.Series([1, np.nan, np.nan, 4], index=pd.date_range('2024-01-01', periods=4, freq='D'))
ts_interp = ts.interpolate(method='time')
print(ts_interp)Python для анализа данных обучение (обучение анализу данных на python)
2024-01-01 1.000000 2024-01-02 2.000000 2024-01-03 3.000000 2024-01-04 4.000000 Freq: D, dtype: float64
приложения анализа данных на python (приложения анализа данных на python)
Ошибка: интерполяция с method='spline' требует установки параметра order и может давать нереалистичные значения на краях. Решение - использовать с осторожностью и проверять.
Как сгруппировать данные и вычислить сводные статистики?
Основной инструмент - groupby() с последующим агрегированием через .agg(). Эффективно для быстрой сводки по категориям.
df = pd.DataFrame({
'City': ['Moscow', 'SPb', 'Moscow', 'SPb'],
'Sales': [100, 200, 150, 250],
'Profit': [10, 20, 15, 25]
})
grouped = df.groupby('City').agg({'Sales': 'sum', 'Profit': 'mean'})
print(grouped)работа с табличными данными python (работа с табличными данными в python)
Sales Profit City Moscow 250 12.5 SPb 450 22.5
распределение данных python (распределение данных в python)
Типичная ошибка: забыть сбросить индекс после groupby - результат имеет мультииндекс. Решение: добавить .reset_index().
Как создать сводную таблицу с несколькими уровнями агрегации?
Функция pd.pivot_table() позволяет задать индексы, столбцы и значения с разными агрегатами. Аналог Excel сводных таблиц.
pivot = pd.pivot_table(df, values='Sales', index='City', columns=[], aggfunc=['sum', 'mean'])
print(pivot)статистический анализ данных python (статистический анализ данных в python)
sum mean
Sales Sales
City
Moscow 250 125.0
SPb 450 225.0Python функции анализа данных (функции анализа данных в python)
Проблема: при наличии NaN в индексе они исключаются. Решение - использовать dropna=False.
Как применить свою функцию к группам?
Метод .transform() возвращает DataFrame той же формы, а .apply() может вернуть любую структуру. Пример: нормализация внутри групп.
def z_score(x):
return (x - x.mean()) / x.std()
df['Sales_norm'] = df.groupby('City')['Sales'].transform(z_score)
print(df)работа с pandas python (работа с библиотекой pandas)
City Sales Profit Sales_norm 0 Moscow 100 10 -1.414214 1 SPb 200 20 -1.414214 2 Moscow 150 15 1.414214 3 SPb 250 25 1.414214
Pandas python (библиотека pandas)
Ошибка: использование apply с возвратом скаляра для группы приводит к несоответствию размеров. Используйте transform, если нужно сохранить исходную длину.
Как выполнить быструю визуализацию распределения столбцов?
Встроенный метод df.hist() рисует гистограммы для всех числовых столбцов. Для уточненной настройки используют matplotlib или seaborn.
import matplotlib.pyplot as plt
df.hist(figsize=(8,4), bins=10, edgecolor='black')
plt.tight_layout()
plt.show()библиотеки данных python (библиотеки для работы с данными в python)
Проблема: не отображаются русские подписи - нужно указать plt.rcParams['font.family'] = 'DejaVu Sans' или другую поддерживаемую гарнитуру.
Как построить корреляционную матрицу с аннотациями?
sns.heatmap() из Seaborn позволяет быстро визуализировать корреляции. Предварительно вычисляют df.corr().
import seaborn as sns
corr = df[['Sales', 'Profit']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()анализ данных python pandas numpy (анализ данных с pandas и numpy в python)
[График тепловой карты с числами корреляции]
Ошибка: при наличии пропусков corr() по умолчанию их игнорирует. Решение - явно указать min_periods или предварительно очистить.
Расширенные примеры с пошаговыми пояснениями
Как обработать выбросы с помощью квартильного метода IQR?
Вычисляются первый и третий квартили, затем интерквартильный размах. Все значения за пределами [Q1 - 1.5*IQR, Q3 + 1.5*IQR] считаются выбросами и могут быть заменены на границы или удалены.
import numpy as np
data = pd.Series([1,2,3,4,5,6,7,8,9,100])
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5*IQR
upper = Q3 + 1.5*IQR
filtered = data[(data >= lower) & (data <= upper)]
print('Исходные:', data.values)
print('После фильтрации выбросов:', filtered.values)
Исходные: [ 1 2 3 4 5 6 7 8 9 100] После фильтрации выбросов: [1 2 3 4 5 6 7 8 9]
Возможная проблема: при малом размере выборки выбросы могут быть неинформативны. Решение - использовать визуальную проверку (boxplot) и учитывать предметную область.
Как создать признак на основе скользящего среднего временного ряда?
rolling() создает окно и применяет функцию, например, среднее. Это помогает сгладить шум и выявить тренд.
dates = pd.date_range('2024-01-01', periods=10, freq='D')
values = [10, 12, 11, 15, 14, 18, 20, 22, 21, 25]
ts = pd.Series(values, index=dates)
rolling_mean = ts.rolling(window=3).mean()
print('Исходный ряд:')
print(ts)
print('\nСкользящее среднее с окном 3:')
print(rolling_mean)
Исходный ряд: 2024-01-01 10 2024-01-02 12 2024-01-03 11 2024-01-04 15 2024-01-05 14 2024-01-06 18 2024-01-07 20 2024-01-08 22 2024-01-09 21 2024-01-10 25 Freq: D, dtype: int64 Скользящее среднее с окном 3: 2024-01-01 NaN 2024-01-02 NaN 2024-01-03 11.000000 2024-01-04 12.666667 2024-01-05 13.333333 2024-01-06 15.666667 2024-01-07 17.333333 2024-01-08 20.000000 2024-01-09 21.000000 2024-01-10 22.666667 Freq: D, dtype: float64
Проблема: первые (window-1) значений равны NaN. Решение - использовать min_periods=1 в rolling, но тогда окно может быть неполным, что искажает среднее.
Как применить numpy векторизацию для быстрого вычисления нового столбца?
Вместо медленных циклов используют векторизованные операции. Например, расчет расстояния от точки.
df = pd.DataFrame({'x': np.random.rand(5), 'y': np.random.rand(5)})
# Векторизованный расчет евклидова расстояния до (0,0)
df['distance'] = np.sqrt(df['x']**2 + df['y']**2)
print(df)
x y distance 0 0.123456 0.654321 0.665399 1 0.789012 0.345678 0.860247 2 0.456789 0.987654 1.087872 3 0.234567 0.123456 0.265412 4 0.901234 0.432109 1.000000
Ошибка: попытка использовать if-else в pd.Series без np.where приводит к медленному коду. Решение - использовать np.where(condition, x, y).
Как объединить несколько DataFrame по разным ключам и типам соединений?
pd.merge() поддерживает inner, left, right, outer. Для сложных сценариев - несколько ключей.
left = pd.DataFrame({'id': [1,2,3], 'name': ['Alice','Bob','Charlie']})
right = pd.DataFrame({'id': [2,3,4], 'score': [85,90,95]})
merged_inner = pd.merge(left, right, on='id', how='inner')
merged_left = pd.merge(left, right, on='id', how='left')
print('Inner merge:')
print(merged_inner)
print('\nLeft merge:')
print(merged_left)
Inner merge: id name score 0 2 Bob 85 1 3 Charlie 90 Left merge: id name score 0 1 Alice NaN 1 2 Bob 85.0 2 3 Charlie 90.0
Проблема: если ключи имеют разные имена, используйте параметры left_on и right_on. Решение - переименовать колонки заранее через .rename().
Как создать мультииндексный DataFrame и выполнить выборку?
Установка нескольких столбцов в индекс с помощью set_index(). Доступ к данным через .loc с кортежами или xs().
df = pd.DataFrame({
'Year': [2020,2020,2021,2021],
'Quarter': ['Q1','Q2','Q1','Q2'],
'Revenue': [100,150,200,250]
}).set_index(['Year','Quarter'])
print(df)
print('\nВыборка 2020:')
print(df.loc[2020])
print('\nВыборка по всем годам для Q1 через xs:')
print(df.xs('Q1', level='Quarter'))
Revenue
Year Quarter
2020 Q1 100
Q2 150
2021 Q1 200
Q2 250
Выборка 2020:
Revenue
Quarter
Q1 100
Q2 150
Выборка по всем годам для Q1 через xs:
Revenue
Year
2020 100
2021 200
Типичная ошибка: использование .loc[['Q1','Q2']] без указания уровня приводит к KeyError. Решение - использовать .xs или .loc[(slice(None), ['Q1','Q2']), :].