Привет, меня зовут Виталий.Автор телеграмм канала «Детектив данных» про смену профессии и мой вкат в «аналитику» после 30 лет. И да, я уже наверное года полтора использую помощь нейросети при написании кода на Питоне.

Следстви�� установило, что для получения качественного ответа часто приходится потратить довольно много времени на описание таблицы, где какой тип данных, примеры, формат, количество nan значений, диапазон дат и прочие нюансы.

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

В качестве жертвы у нас рабочее время, которое можно потратить на описание задачи.

В какой то момент я подумал, а почему бы не сделать универсальную функцию которая будет собирать эту информацию за меня, и сразу писать какой нибудь универсальный промт, потому что, до кучи мне и его лень писать.

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

Простой пример на основе календаря, но в промте учитываются и числа с точкой.

Всё что нам нужно вставить имя датафрейма в функцию и получить готовый промт
Всё что нам нужно вставить имя датафрейма в функцию и получить готовый промт

Итак сама фунция

import pandas as pd
import numpy as np

def generate_df_prompt(df, table_name):
    prompt_parts = []
    prompt_parts.append(
        "Ты — аналитик данных.\n"
        "Твоя задача получать корректные, детализированные и воспроизводимые выводы на основе предоставлённой таблицы, "
        "не выдумывая фактов и не делая предположений без явной пометки «гипотеза». "
        "Все шаги и решения должны быть объяснены и подкреплены кодом или описанием проверки. "
        "Создай пример таблицы при необходимости\n"
        "Правила выдачи ответов:"
        "\n- Отвечай кратко, фактами и с указанием кода/проверок."
        "\n- Не придумывай новых данных — если данных не хватает для вывода, попроси дополнительную информацию."
        "\n Сейчас я опишу тебе таблицу,  в формате: 'Тип, имя столбца, примеры значений, кол-во nan значений', и затем дам задание:"
        f"\n\nЕсть таблица {table_name} со столбцами:"
    )
    
    for column in df.columns:
        dtype = df[column].dtype
        non_null_count = df[column].count()
        total_count = len(df[column])
        nan_count = df[column].isna().sum()
        nan_info = f"Без nan" if nan_count == 0 else f"Есть nan ({nan_count} пропусков)"
        
        # Получаем примеры значений в исходном формате
        sample_values = df[column].dropna().sample(min(3, non_null_count)).tolist()
        
        # Форматируем примеры в зависимости от типа данных
        if pd.api.types.is_string_dtype(dtype):
            formatted_samples = [f'"{v}"' for v in sample_values]
            prompt_parts.append(f'Текст:        "{column}" (Значения "{", ".join(formatted_samples)}", {nan_info})')
        
        elif pd.api.types.is_integer_dtype(dtype):
            formatted_samples = [f'{v}' for v in sample_values]
            # Добавляем информацию о мин/макс значениях
            min_val = df[column].min()
            max_val = df[column].max()
            prompt_parts.append(f'Число, int:   "{column}" (Значения "{", ".join(formatted_samples)}", {nan_info}, Диапазон: [{min_val} - {max_val}])')
        
        elif pd.api.types.is_float_dtype(dtype):
            formatted_samples = [f'{v}' for v in sample_values]
            # Добавляем информацию о мин/макс значениях
            min_val = df[column].min()
            max_val = df[column].max()
            prompt_parts.append(f'Число, float: "{column}" (Значения "{", ".join(formatted_samples)}", {nan_info}, Диапазон: [{min_val:.2f} - {max_val:.2f}])')
        
        elif pd.api.types.is_datetime64_any_dtype(dtype):
            formatted_samples = [f'"{v.strftime("%d.%m.%Y")}"' for v in sample_values]
            prompt_parts.append(f'Дата, date:   "{column}" (Значения "{", ".join(formatted_samples)}", {nan_info})')
        
        else:
            formatted_samples = [f'"{v}"' for v in sample_values]
            prompt_parts.append(f'Другой тип: "{column}" (Значения "{", ".join(formatted_samples)}", {nan_info})')
    
    # Добавляем дополнительную информацию
    prompt_parts.append("\nДополнительная информация:")
    n = len(df)
    formatted = f"{n:,}".replace(",", " ")
    prompt_parts.append(f"- Всего строк: {formatted}")
    prompt_parts.append(f"- Всего столбцов: {len(df.columns)}")
    
    # Проверяем наличие дубликатов
    duplicates = df.duplicated().sum()
    if duplicates > 0:
        prompt_parts.append(f"- Количество полных дубликатов строк: {duplicates}")
    
    # Анализ временных диапазонов для date-колонок
    date_columns = df.select_dtypes(include=['datetime64']).columns
    for col in date_columns:
        min_date = df[col].min().strftime("%d.%m.%Y")
        max_date = df[col].max().strftime("%d.%m.%Y")
        prompt_parts.append(f"- Для столбца '{col}': временной диапазон с {min_date} по {max_date}")
    
    return "\n".join(prompt_parts)

Ну и вызов функции где мы передаём имя нашего датафрейма

prompt = generate_df_prompt(calend, "calend")  # Второй аргумент имя таблицы
print(prompt)

Результат выше, в первом скриншоте.

А как вы готовите промты для анализа данных? Делитесь вашими лайфхаками в комментариях. Если идея с функцией полезна — ставьте плюсы, и приходите в гости.

Only registered users can participate in poll. Log in, please.
Используем ИИ
77.78%Постоянно21
7.41%Из принципа нет2
14.81%ИИ?4
27 users voted. 4 users abstained.