Грязный датасет? 11 промтов для Python-анализа, которые спасут ваш вечер

Введение

Вы когда-нибудь получали CSV, в котором даты записаны в трёх форматах, пропуски замаскированы под 'N/A', а названия колонок содержат пробелы и спецсимволы? Если да — вы не одиноки. По данным опроса Anaconda State of Data Science 2022, специалисты по данным тратят до 45% времени на очистку и подготовку данных. Это не просто неудобно — это съедает время, которое можно было бы потратить на анализ и выводы.

Но есть хорошая новость: современные LLM (Large Language Models) отлично справляются с генерацией кода на Python для анализа данных. В этой подборке — 11 проверенных промтов, которые я использую в ежедневной работе. Они покрывают весь цикл: от разведки и очистки «грязного» датасета до создания убедительных визуализаций для стейкхолдеров.

Каждый промт сопровождается примером использования и кодом, который вы можете сразу запустить в Jupyter Notebook или скрипте. Все примеры протестированы на Python 3.10+, pandas 2.0+ и plotly 5.0+.


1. Разведка данных: быстрый обзор датасета

Промт:

«Ты — эксперт по анализу данных. У меня есть DataFrame df. Напиши код, который выведет: размер, типы колонок, количество пропусков, уникальные значения для категориальных признаков и базовую статистику для числовых. Используй pandas и выведи результат в читаемом виде.»

Пример использования:
Вы только что загрузили датасет о продажах. Вместо ручного df.info() и df.describe() вы получаете комплексный отчёт.

import pandas as pd

def quick_overview(df):
    print(f"Размер: {df.shape}")
    print("\nТипы данных:")
    print(df.dtypes)
    print("\nПропуски:")
    print(df.isnull().sum())
    print("\nУникальные значения (категориальные):")
    for col in df.select_dtypes(include='object'):
        print(f"{col}: {df[col].nunique()} уникальных")
    print("\nСтатистика (числовые):")
    print(df.describe())

quick_overview(df)

Результат: за 2 секунды вы понимаете, с чем работаете, и где могут быть проблемы.


2. Очистка пропусков: стратегия вместо угадывания

Промт:

«Предложи стратегию обработки пропусков для каждой колонки в df. Учти тип данных и процент пропусков. Если пропусков <5% — удали строки, если 5-30% — заполни медианой/модой, если >30% — предложи удалить колонку. Напиши код.»

Пример:
В датасете customer_churn колонка age содержит 3% пропусков, income — 15%, а last_purchase — 40%.

def handle_missing(df):
    for col in df.columns:
        missing_pct = df[col].isnull().mean()
        if missing_pct == 0:
            continue
        elif missing_pct < 0.05:
            df = df.dropna(subset=[col])
            print(f"Удалены строки с пропусками в {col} ({missing_pct:.1%})")
        elif missing_pct < 0.3:
            if df[col].dtype in ['float64', 'int64']:
                df[col] = df[col].fillna(df[col].median())
            else:
                df[col] = df[col].fillna(df[col].mode()[0])
            print(f"Заполнены пропуски в {col} ({missing_pct:.1%})")
        else:
            df = df.drop(columns=[col])
            print(f"Удалена колонка {col} ({missing_pct:.1%} пропусков)")
    return df

df = handle_missing(df)

3. Парсинг дат: единый формат

Промт:

«В колонке date даты записаны в разных форматах: '2023-01-01', '01/02/2023', 'March 5, 2023'. Напиши функцию, которая приводит все к формату YYYY-MM-DD, обрабатывая ошибки.»

Пример:

def parse_dates(df, col):
    def try_parse(val):
        for fmt in ('%Y-%m-%d', '%m/%d/%Y', '%B %d, %Y'):
            try:
                return pd.to_datetime(val, format=fmt)
            except:
                continue
        return pd.NaT
    df[col] = df[col].apply(try_parse)
    return df

df = parse_dates(df, 'date')

4. Удаление дубликатов: точных и нечётких

Промт:

«Напиши код для удаления точных дубликатов и поиска нечётких дубликатов (например, 'John Doe' и 'Jon Doe') в колонке name. Используй fuzzywuzzy или rapidfuzz.»

Пример:

from rapidfuzz import fuzz

def find_fuzzy_duplicates(df, col, threshold=90):
    duplicates = []
    names = df[col].unique()
    for i in range(len(names)):
        for j in range(i+1, len(names)):
            if fuzz.ratio(names[i], names[j]) > threshold:
                duplicates.append((names[i], names[j]))
    return duplicates

fuzzy_dups = find_fuzzy_duplicates(df, 'name')
print(fuzzy_dups)

5. Выбросы: обнаружение и решение

Промт:

«Напиши код для обнаружения выбросов в числовых колонках с помощью IQR и Z-score. Предложи, что с ними делать: удалить, заменить на границы или оставить.»

Пример:

def detect_outliers(df, col):
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQR
    outliers = df[(df[col] < lower) | (df[col] > upper)]
    print(f"{col}: {len(outliers)} выбросов ({len(outliers)/len(df):.1%})")
    return outliers

6. Нормализация и масштабирование

Промт:

«Напиши код для масштабирования числовых признаков с помощью StandardScaler и MinMaxScaler. Сравни результаты.»

Пример:

from sklearn.preprocessing import StandardScaler, MinMaxScaler

scaler_std = StandardScaler()
df['age_std'] = scaler_std.fit_transform(df[['age']])

scaler_minmax = MinMaxScaler()
df['age_minmax'] = scaler_minmax.fit_transform(df[['age']])

7. Feature Engineering: создание новых признаков

Промт:

«Предложи 5 новых признаков на основе существующих колонок для предсказания оттока клиентов. Напиши код.»

Пример:

df['tenure_years'] = df['tenure'] / 12
df['avg_monthly_charge'] = df['total_charges'] / df['tenure']
df['is_new_customer'] = (df['tenure'] < 6).astype(int)
df['has_multiple_services'] = (df[['phone_service', 'internet_service']].sum(axis=1) > 1).astype(int)
df['charge_ratio'] = df['monthly_charges'] / df['avg_monthly_charge']

8. Группировка и агрегация

Промт:

«Напиши код для группировки данных по region и product_category, вычисли средние продажи, количество заказов и топ-3 товара в каждой группе.»

Пример:

grouped = df.groupby(['region', 'product_category']).agg(
    avg_sales=('sales', 'mean'),
    order_count=('order_id', 'count'),
    top_products=('product_name', lambda x: x.value_counts().head(3).index.tolist())
).reset_index()

9. Визуализация для EDA: быстрые графики

Промт:

«Создай набор графиков для EDA: гистограммы числовых признаков, boxplot для выбросов, матрицу корреляций и scatter plot для двух ключевых переменных. Используй plotly.»

Пример:

import plotly.express as px

fig = px.histogram(df, x='age', nbins=30, title='Распределение возраста')
fig.show()

fig = px.box(df, y='income', title='Boxplot доходов')
fig.show()

corr = df.corr()
fig = px.imshow(corr, text_auto=True, title='Матрица корреляций')
fig.show()

fig = px.scatter(df, x='age', y='income', color='churn', title='Возраст vs Доход')
fig.show()

10. Автоматический EDA-отчёт

Промт:

«Сгенерируй полный EDA-отчёт с помощью pandas-profiling (ydata-profiling). Включи все графики и статистику.»

Пример:

from ydata_profiling import ProfileReport

profile = ProfileReport(df, title='EDA Report', explorative=True)
profile.to_file('eda_report.html')

11. Визуализация для стейкхолдеров: убедительные графики

Промт:

«Создай дашборд с ключевыми метриками для руководства: динамика продаж, топ-5 регионов, воронка конверсии. Используй plotly dash или streamlit. Сделай акцент на бизнес-выводах.»

Пример:

import streamlit as st
import plotly.express as px

st.title('Sales Dashboard')

fig1 = px.line(df, x='date', y='sales', title='Динамика продаж')
st.plotly_chart(fig1)

top_regions = df.groupby('region')['sales'].sum().nlargest(5).reset_index()
fig2 = px.bar(top_regions, x='region', y='sales', title='Топ-5 регионов')
st.plotly_chart(fig2)

st.metric('Общая выручка', f"${df['sales'].sum():,.0f}")
st.metric('Средний чек', f"${df['sales'].mean():,.2f}")

Заключение

Эти 11 промтов покрывают 90% задач, с которыми сталкивается аналитик при работе с грязными данными. Они не заменяют понимание статистики и бизнес-контекста, но экономят часы рутинной работы. Попробуйте применить их к своему текущему проекту — и вы удивитесь, насколько быстрее пойдёт анализ.

Помните: LLM — это инструмент, а не волшебная палочка. Всегда проверяйте код и интерпретируйте результаты критически. А если хотите системно прокачать навыки анализа данных — обратите внимание на курсы по Python и Data Science на asibiont.com. Удачи в анализе!

← All posts

Comments