Анализ данных: Pandas и NumPy в действии

Раздел: Data Science -> 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.0

Python функции анализа данных (функции анализа данных в 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 или предварительно очистить.

- большие данные python (большие данные в python)
- Python системный анализ данных (анализ данных с помощью python)
- повторяющиеся значения python (поиск повторяющихся значений в списке в python)

Расширенные примеры с пошаговыми пояснениями

Как обработать выбросы с помощью квартильного метода 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']), :].

Python для анализа данных - comments

En
Python для анализа данных (python)