Привет, меня зовут Виталий.Автор телеграмм канала «Детектив данных» про смену профессии и мой вкат в «аналитику» после 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)Результат выше, в первом скриншоте.
А как вы готовите промты для анализа данных? Делитесь вашими лайфхаками в комментариях. Если идея с функцией полезна — ставьте плюсы, и приходите в гости.