У меня накопился Excel с данными о трафике блога за квартал. Нужно было понять: какие статьи работают лучше, где просадки CTR, что коррелирует с позицией. Раньше это занимало полчаса в Excel. Теперь — 5 минут с Python и Claude API.
Статья для тех, кто работает с табличными данными и хочет задавать вопросы на человеческом языке. Нужен базовый Python — установить пакеты и запустить скрипт.
Идея: натуральный язык как интерфейс к данным
Обычный путь к ответу на вопрос «почему упали продажи в марте?»: открыть Excel → написать формулы → построить сводную таблицу → 30 минут ушло.
С Claude API другой подход: описываете структуру данных и задаёте вопрос на русском. Claude анализирует и отвечает напрямую — с цифрами, выводами, рекомендациями.
Разберём два варианта: прямой анализ данных и генерация pandas-кода.
Установка
pip install anthropic pandas openpyxl python-dotenv# .env
ANTHROPIC_API_KEY=sk-ant-...
Подход 1: Claude анализирует данные напрямую
Самый простой способ. Отдаём данные в виде CSV-текста, спрашиваем — получаем ответ.
import anthropic
import pandas as pd
from dotenv import load_dotenv
load_dotenv()
client = anthropic.Anthropic()
def ask_about_data(df: pd.DataFrame, question: str) -> str:
"""Отправляет данные и вопрос в Claude, получает ответ."""
# Конвертируем в CSV-строку
csv_data = df.to_csv(index=False)
prompt = f"""Вот данные в CSV-формате:
{csv_data}
Вопрос: {question}
Ответь конкретно, приведи цифры из данных, объясни вывод."""
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
# Загружаем данные
df = pd.read_csv("data.csv") # или pd.read_excel("data.xlsx")
# Задаём вопросы
print(ask_about_data(df, "Какой месяц показал наибольшую выручку?"))
print(ask_about_data(df, "Топ-5 товаров по количеству продаж?"))
print(ask_about_data(df, "Есть ли аномалии в данных?"))Ограничение этого подхода: объём данных. Claude может обработать до ~100-200 тысяч токенов контекста, что примерно соответствует 1000-2000 строкам CSV. Для больших таблиц нужен другой подход.
Совет
Если данных много — передайте не всё, а только агрегированную статистику: df.describe(), топ-10 строк, итоги по группам. Claude поймёт структуру и ответит точнее.
Подход 2: Claude пишет pandas-код, вы запускаете
Для больших датасетов лучше работает другой сценарий: Claude описывает, какой код нужно написать, а вы его копируете и запускаете вручную.
def get_analysis_code(df: pd.DataFrame, question: str) -> str:
"""Просит Claude написать pandas-код для ответа на вопрос."""
# Описываем структуру датафрейма без самих данных
schema = f"""Датафрейм `df`:
- Строк: {len(df)}
- Столбцы: {df.dtypes.to_string()}
- Пример (3 строки): {df.head(3).to_string()}"""
prompt = f"""У тебя есть pandas датафрейм `df`.
{schema}
Напиши код Python/pandas для ответа на вопрос: {question}
Правила:
- Только Python-код
- Используй только pandas, никаких лишних импортов
- Результат выводи через print()
- Добавь комментарии к ключевым шагам"""
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
# Claude вернёт готовый код
code = get_analysis_code(df, "Какой канал продаж показывает лучший средний чек?")
print(code)
# Копируете код и запускаете в своём ноутбуке или скриптеТакой подход безопаснее: вы видите код перед запуском и контролируете, что именно выполняется.
Реальный пример: анализ трафика блога
Я анализировал данные из Google Search Console: 57 статей, столбцы — url, clicks, impressions, ctr, position.
import anthropic
import pandas as pd
client = anthropic.Anthropic()
df = pd.read_csv("gsc_data.csv")
questions = [
"Какие 10 статей получили больше всего кликов?",
"Есть ли статьи с высоким CTR (>5%) но низкими позициями (>10)? Это рост",
"Какая средняя позиция у статей с CTR выше 3%?",
"Статьи с каким типом заголовков (содержащие 'vs' или 'как') работают лучше?"
]
for question in questions:
print(f"\n📊 {question}")
print("-" * 50)
# Для анализа отдаём агрегированную статистику
summary = f"""
Всего статей: {len(df)}
Столбцы: {', '.join(df.columns)}
Статистика:
{df.describe().to_string()}
Топ-20 по кликам:
{df.nlargest(20, 'clicks')[['url', 'clicks', 'ctr', 'position']].to_string()}
"""
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"{summary}\n\nВопрос: {question}\n\nОтвечай конкретно с цифрами."
}]
)
print(message.content[0].text)Пример вывода:
📊 Есть ли статьи с высоким CTR но низкими позициями? Это рост
Да, вижу 4 статьи с потенциалом:
1. chatgpt-vs-claude — CTR 6.2%, позиция 12.3
Высокий CTR говорит о релевантном заголовке, но позиция 12 =
вторая страница. Небольшое улучшение ранжирования даст +40% кликов.
2. kak-napisat-prompt — CTR 5.8%, позиция 11.7
Аналогичная ситуация. Рекомендую добавить внутренние ссылки на эту статью.
...
За 5 минут получил инсайты, на которые раньше тратил час.
Добавляем контекстный диалог
Если хочется задавать уточняющие вопросы — несложно сделать сессию с памятью:
def data_session(df: pd.DataFrame):
"""Сессия вопросов к данным с сохранением контекста."""
# Системный контекст с описанием данных
system_context = f"""Ты аналитик данных. У тебя есть датафрейм:
Строк: {len(df)}, Столбцы: {', '.join(df.columns)}
Статистика: {df.describe().to_string()}
Первые 10 строк: {df.head(10).to_string()}
Отвечай конкретно, с цифрами. Если нужно — предлагай следующие шаги."""
messages = [{"role": "user", "content": system_context},
{"role": "assistant", "content": "Данные загружены. Задавайте вопросы."}]
print("Сессия анализа данных. Ctrl+C для выхода.\n")
while True:
question = input("Вопрос: ").strip()
if not question:
continue
messages.append({"role": "user", "content": question})
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=messages
)
answer = response.content[0].text
messages.append({"role": "assistant", "content": answer})
print(f"\n{answer}\n")
data_session(df)Claude помнит предыдущие вопросы и ответы в рамках сессии. Можно уточнять: «покажи только первые 5», «а если исключить аномалии?».
Инфо
Каждый вопрос с полной историей тратит токены. Для длинных сессий периодически обрезайте историю: оставляйте только последние 5-10 обменов.
Что это меняет
Три месяца назад я тратил полчаса на каждый «быстрый анализ». Теперь большинство вопросов к данным закрываются за 2-3 минуты.
Важно понимать границы: это не замена dbt, Tableau или дата-сайентиста. Для EDA, регрессий, ML-моделей нужны специализированные инструменты. Но для ситуативных вопросов к небольшим данным — отлично работает.
Следующий уровень — настроить автоматическую отправку такого анализа по расписанию. Вот гайд по Make.com — там можно подключить Python-скрипт к триггеру и получать ежедневный дайджест без ручного запуска.



