Инженерия промптов для анализа данных в Python и Pandas с использованием ChatGPT: Как это работает?

Что такое инженерия промптов и зачем она нужна в анализе данных?

Инженерия промптов (prompt engineering) — это процесс формулирования и оптимизации входных данных (промптов) для языковых моделей (LLM), таких как ChatGPT, с целью получения наиболее точных, релевантных и полезных ответов. В контексте анализа данных, это искусство создания таких запросов к LLM, которые помогают автоматизировать, ускорять или улучшать различные этапы работы с данными: от исследования и очистки до генерации кода, интерпретации результатов и создания отчетов.

Эффективная инженерия промптов позволяет аналитикам использовать мощь LLM для:

Генерации кода: Автоматическое создание фрагментов кода на Python с использованием библиотеки Pandas для выполнения специфических задач.

Интерпретации данных: Получение объяснений сложных паттернов, аномалий или результатов статистических тестов на естественном языке.

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

Исследования данных: Быстрое получение сводной информации, описательных статистик или идей для дальнейшего анализа.

Роль ChatGPT в анализе данных с использованием Python и Pandas

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

Ключевые преимущества использования ChatGPT:

Ускорение разработки: Быстрая генерация кода для стандартных операций.

Снижение когнитивной нагрузки: Возможность формулировать задачи на высоком уровне абстракции.

Новые подходы к анализу: Использование LLM для задач, трудно решаемых традиционными методами (например, сложный анализ текстов).

Обучение и поддержка: Получение объяснений кода, функций и концепций анализа данных.

Обзор основных понятий: Pandas, Python, ChatGPT

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

Pandas: Ключевая библиотека Python для манипулирования данными. Она предоставляет мощные и удобные структуры данных, такие как DataFrame (двумерная таблица) и Series (одномерный массив), а также широкий набор функций для чтения, записи, очистки, преобразования, агрегации и визуализации данных.

ChatGPT: Семейство больших языковых моделей, разработанных OpenAI. Они обучены на огромных объемах текстовых данных и способны понимать и генерировать человекоподобный текст, а также код на различных языках программирования, включая Python.

Основы работы с ChatGPT для анализа данных в Pandas

Установка и настройка окружения: Python, Pandas, API ChatGPT

Для взаимодействия с ChatGPT из Python вам потребуется:

Установленный Python: Версия 3.7 или выше.

Библиотека Pandas: Устанавливается через pip: pip install pandas.

Библиотека OpenAI: Для взаимодействия с API ChatGPT: pip install openai.

Рекомендуется использовать виртуальные окружения (venv или conda) для изоляции зависимостей проекта.

Подключение к API ChatGPT и аутентификация

Для использования API ChatGPT необходим API-ключ от OpenAI. Получить его можно на официальном сайте OpenAI после регистрации.

import os
import pandas as pd
from openai import OpenAI
from typing import Dict, Any, Optional

# Рекомендуется хранить ключ в переменной окружения
# Установите переменную окружения OPENAI_API_KEY
# client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
# Или укажите ключ напрямую (менее безопасно)
# client = OpenAI(api_key="YOUR_API_KEY")

# Инициализация клиента (пример с переменной окружения)
try:
    client = OpenAI()
    # Проверка доступности моделей (опционально)
    # models = client.models.list()
    # print("Доступные модели:", [model.id for model in models.data])
except Exception as e:
    print(f"Ошибка инициализации клиента OpenAI: {e}")
    client = None


def get_chatgpt_response(prompt: str, model: str = "gpt-3.5-turbo", temperature: float = 0.7) -> Optional[str]:
    """Отправляет промпт в ChatGPT и возвращает ответ.

    Args:
        prompt (str): Текстовый промпт для модели.
        model (str): Идентификатор используемой модели ChatGPT.
        temperature (float): Параметр креативности ответа (0.0 - 2.0).

    Returns:
        Optional[str]: Ответ от ChatGPT или None в случае ошибки.
    """
    if not client:
        print("Клиент OpenAI не инициализирован.")
        return None
    try:
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}]
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"Ошибка при запросе к API ChatGPT: {e}")
        return None

# Пример базового запроса
prompt_example = "Что такое Pandas DataFrame?"
response_example = get_chatgpt_response(prompt_example)

if response_example:
    print(f"Ответ ChatGPT на '{prompt_example}':\n{response_example}")

Базовые запросы к ChatGPT для получения информации о данных

На начальном этапе анализа данных можно использовать ChatGPT для получения общих сведений о DataFrame или для генерации базового кода Pandas.

Предположим, у нас есть DataFrame df_campaigns с данными о рекламных кампаниях:

# Пример DataFrame (загрузка из CSV или создание вручную)
data = {
    'campaign_id': ['cmp1', 'cmp2', 'cmp1', 'cmp3', 'cmp2'],
    'date': pd.to_datetime(['2023-10-01', '2023-10-01', '2023-10-02', '2023-10-02', '2023-10-03']),
    'clicks': [150, 220, 180, 90, 250],
    'cost': [50.0, 75.0, 60.0, 30.0, 85.0],
    'conversions': [5, 8, 7, 3, 10]
}
df_campaigns = pd.DataFrame(data)

# Промпт для получения общей информации
prompt_info = f"У меня есть Pandas DataFrame со следующими первыми 5 строками:\n\n{df_campaigns.head().to_string()}\n\nНапиши код Python Pandas, чтобы показать общую информацию о DataFrame (количество записей, типы данных столбцов, ненулевые значения)."

code_info_response = get_chatgpt_response(prompt_info)

if code_info_response:
    print("\nКод для получения информации о DataFrame:")
    print(code_info_response)
    # Обычно ответ содержит что-то вроде: print(df.info())

Создание эффективных промптов для Pandas DataFrame

Основные принципы составления промптов для анализа данных

Конкретность: Четко укажите, что вы хотите получить. Вместо "Проанализируй данные" используйте "Рассчитай среднюю стоимость клика (cost/clicks) для каждой кампании".

Контекст: Предоставьте модели информацию о структуре данных (названия столбцов, типы данных, примеры строк). Можно передать df.head().to_string() или df.info() в текстовом виде.

Формат вывода: Уточните, в каком виде вы хотите получить ответ (код Python, текстовое описание, JSON и т.д.).

Роль модели: Можно явно указать роль ("Ты — ассистент по анализу данных на Python…") для настройки тона и стиля ответа.

Итеративность: Начинайте с простых запросов и усложняйте их по мере необходимости, уточняя детали.

Примеры промптов для исследования структуры DataFrame (head, describe, info)

# Промпт для генерации кода для describe()
prompt_describe = f"Дан Pandas DataFrame df_campaigns с колонками {list(df_campaigns.columns)}. Напиши код Python Pandas для вывода описательных статистик (count, mean, std, min, max, etc.) для числовых столбцов."

code_describe = get_chatgpt_response(prompt_describe)
if code_describe: print(f"\nКод для describe():\n{code_describe}") # Ожидаем: print(df_campaigns.describe())

# Промпт для интерпретации вывода info()
# Предположим, мы получили вывод df_campaigns.info()
info_output = df_campaigns.info(verbose=False) # Захватываем вывод

# Используем StringIO для имитации текстового вывода
from io import StringIO
info_output_buffer = StringIO()
df_campaigns.info(buf=info_output_buffer)
info_output_str = info_output_buffer.getvalue()

prompt_interpret_info = f"Вот вывод метода .info() для моего DataFrame:\n\n{info_output_str}\n\nОбъясни кратко, что означает эта информация для аналитика данных."

interpretation_info = get_chatgpt_response(prompt_interpret_info)
if interpretation_info: print(f"\nИнтерпретация info():\n{interpretation_info}")

Промпты для фильтрации и сортировки данных

# Промпт для фильтрации
prompt_filter = f"У меня есть DataFrame df_campaigns с колонками {list(df_campaigns.columns)}. Напиши код Python Pandas для фильтрации строк, где количество кликов (clicks) больше 150 и стоимость (cost) меньше 80."

code_filter = get_chatgpt_response(prompt_filter)
if code_filter: print(f"\nКод для фильтрации:\n{code_filter}")

# Промпт для сортировки
prompt_sort = f"Напиши код Python Pandas для сортировки DataFrame df_campaigns по столбцу 'conversions' в порядке убывания."

code_sort = get_chatgpt_response(prompt_sort)
if code_sort: print(f"\nКод для сортировки:\n{code_sort}")
Реклама

Промпты для агрегации и группировки данных

# Промпт для группировки и агрегации
prompt_groupby = f"Дан DataFrame df_campaigns с колонками {list(df_campaigns.columns)}. Напиши код Python Pandas для группировки данных по 'campaign_id' и расчета суммарных 'clicks', 'cost' и 'conversions' для каждой кампании."

code_groupby = get_chatgpt_response(prompt_groupby)
if code_groupby: print(f"\nКод для группировки и агрегации:\n{code_groupby}")

# Промпт для расчета кастомной метрики (CTR)
prompt_custom_metric = f"В DataFrame df_campaigns есть столбцы 'clicks' и 'impressions' (предположим, что он есть). Напиши код Pandas для добавления нового столбца 'CTR', рассчитанного как (clicks / impressions) * 100. Обработай случай деления на ноль, заменив результат на 0."

# Заметка: ChatGPT может не знать о существовании 'impressions'.
# Хороший промпт может включать пример данных или явное указание столбцов.
# Добавим 'impressions' для примера
df_campaigns['impressions'] = [10000, 15000, 12000, 5000, 18000]

prompt_custom_metric_updated = f"В DataFrame df_campaigns есть столбцы 'clicks' и 'impressions'. Напиши код Pandas для добавления нового столбца 'CTR', рассчитанного как (clicks / impressions) * 100. Если impressions равно 0, CTR должен быть 0."

code_custom_metric = get_chatgpt_response(prompt_custom_metric_updated)
if code_custom_metric: print(f"\nКод для расчета CTR:\n{code_custom_metric}")

Продвинутые техники инженерии промптов

Использование контекста и истории запросов для улучшения результатов

API ChatGPT позволяет передавать историю диалога (список сообщений от пользователя и ассистента). Это крайне важно для многошагового анализа, когда последующие запросы зависят от предыдущих.

def get_chatgpt_response_with_history(messages: list[Dict[str, str]], model: str = "gpt-3.5-turbo") -> Optional[str]:
    """Отправляет промпт с историей сообщений.

    Args:
        messages (list[Dict[str, str]]): Список сообщений [{'role': 'user'/'assistant', 'content': '...'}].
        model (str): Идентификатор модели.

    Returns:
        Optional[str]: Ответ от ChatGPT или None в случае ошибки.
    """
    if not client:
        print("Клиент OpenAI не инициализирован.")
        return None
    try:
        response = client.chat.completions.create(
            model=model,
            messages=messages
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"Ошибка при запросе к API ChatGPT: {e}")
        return None

# Пример использования истории
messages = [
    {"role": "user", "content": f"У меня есть DataFrame df_campaigns с колонками {list(df_campaigns.columns)}. Напиши код для расчета общей суммы 'cost'."}
]

response1_content = get_chatgpt_response_with_history(messages)
if response1_content:
    messages.append({"role": "assistant", "content": response1_content})
    print(f"Ответ 1:\n{response1_content}")

    # Следующий запрос, использующий контекст предыдущего
    messages.append({"role": "user", "content": "Теперь рассчитай среднюю стоимость конверсии (total cost / total conversions) для всего DataFrame."}) 
    response2_content = get_chatgpt_response_with_history(messages)
    if response2_content:
        messages.append({"role": "assistant", "content": response2_content})
        print(f"\nОтвет 2 (с учетом контекста):\n{response2_content}")

Создание цепочек промптов для решения сложных задач анализа

Сложные аналитические задачи можно разбить на последовательность более простых шагов, где вывод одного шага (например, отфильтрованный DataFrame или результат агрегации) используется как вход для следующего промпта. Это позволяет модели сосредоточиться на конкретной подзадаче.

Пример цепочки:

Промпт 1: Отфильтровать DataFrame df_sales, оставив только продажи за последний квартал.

Промпт 2 (используя результат 1): Сгруппировать отфильтрованные данные по категории продукта и рассчитать суммарный доход.

Промпт 3 (используя результат 2): Определить топ-3 категории продуктов по доходу и представить результат в виде текстового отчета.

Автоматизация генерации промптов на основе метаданных DataFrame

Для повторяющихся задач анализа на разных наборах данных можно генерировать промпты программно. Используя метаданные DataFrame (df.columns, df.dtypes, df.info()), можно автоматически создавать контекстную часть промпта.

def generate_prompt_for_summary(df: pd.DataFrame, task_description: str) -> str:
    """Генерирует промпт, включая метаданные DataFrame.

    Args:
        df (pd.DataFrame): Входной DataFrame.
        task_description (str): Описание задачи для ChatGPT.

    Returns:
        str: Сгенерированный промпт.
    """
    columns = list(df.columns)
    
    # Получаем информацию о типах данных
    buffer = StringIO()
    df.info(buf=buffer)
    df_info = buffer.getvalue()
    
    # Берем первые строки для примера
    df_head = df.head().to_string()

    prompt = f"Контекст: Работаем с Pandas DataFrame.\n"
    prompt += f"Столбцы: {columns}\n"
    prompt += f"Информация о типах данных и non-null значениях:\n{df_info}\n"
    prompt += f"Первые 5 строк:\n{df_head}\n\n"
    prompt += f"Задача: {task_description}"
    
    return prompt

# Пример использования
task = "Напиши код Python Pandas для расчета среднего значения столбца 'clicks'."
prompt = generate_prompt_for_summary(df_campaigns, task)
print(f"\nАвтоматически сгенерированный промпт:\n{prompt}")

# response = get_chatgpt_response(prompt)
# if response: print(response)

Примеры использования и кейсы

Анализ продаж: создание промптов для выявления трендов и аномалий

Предположим, df_sales содержит колонки date, product_id, revenue, quantity.

Промпт для тренда: "Дан DataFrame df_sales с ежедневными продажами (‘date’, ‘revenue’). Напиши код Pandas для ресемплирования данных по месяцам и расчета суммарного ‘revenue’. Затем построй график временного ряда для визуализации тренда."

Промпт для аномалий: "В DataFrame df_sales есть столбец ‘revenue’. Используя метод межквартильного размаха (IQR), напиши код Pandas для выявления строк, где ‘revenue’ является выбросом (аномально высоким или низким значением)."

Промпт для интерпретации: "Вот данные о месячных продажах за последний год: [список значений]. Есть ли видимый тренд или сезонность? Какие месяцы показывают пиковые значения?"

Анализ отзывов клиентов: использование ChatGPT для классификации и анализа тональности

Предположим, df_reviews содержит колонку review_text.

Промпт для тональности: "Оцени тональность следующего отзыва клиента (позитивная, негативная, нейтральная): ‘[текст отзыва]’. Ответ дай одним словом."

Промпт для классификации (Zero-shot): "Классифицируй следующий отзыв по основной теме (например, ‘цена’, ‘качество товара’, ‘доставка’, ‘обслуживание’): ‘[текст отзыва]’. Выбери одну наиболее подходящую тему."

Промпт для генерации кода (с использованием внешних библиотек): "Напиши код Python, который использует библиотеку, например, nltk.sentiment.SentimentIntensityAnalyzer, для добавления столбца ‘sentiment_score’ к DataFrame df_reviews, анализируя текст в колонке ‘review_text’."

Оптимизация маркетинговых кампаний: промпты для анализа эффективности и ROI

Используем df_campaigns (campaign_id, date, clicks, cost, conversions, impressions).

Промпт для расчета метрик: "В DataFrame df_campaigns есть данные по кампаниям. Напиши код Pandas для расчета следующих метрик для каждой ‘campaign_id’: CPA (Cost Per Acquisition = cost / conversions), ROI (предположим, доход = conversions * 100; ROI = (доход — cost) / cost * 100), CTR (Click-Through Rate = clicks / impressions * 100). Обработай деление на ноль."

Промпт для сравнения: "Сравни эффективность кампаний ‘cmp1’ и ‘cmp2’ на основе их CPA и CTR. Какая кампания выглядит более эффективной по этим метрикам? Предоставь краткое текстовое резюме."

Промпт для генерации рекомендаций: "На основе данных о CPA и ROI для разных кампаний, предложи 2-3 рекомендации по оптимизации бюджета маркетинговых кампаний. Например, стоит ли перераспределить бюджет с менее эффективных кампаний на более эффективные?"

Инженерия промптов открывает новые горизонты для аналитиков данных, позволяя эффективно использовать мощь LLM для решения широкого круга задач в Python и Pandas. Ключ к успеху лежит в умении формулировать четкие, контекстно-богатые и целенаправленные запросы.


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