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