Python генереатор датасетов
AI Fine Tuning Qwen2.5
https://tgstat.ru/channel/@mdatasets
Python-генератор JSON примеров для дообучения локальной модели ИИ (например, Qwen2.5 7B)
Чтобы сделать генератор JSON примеров для датасета промышленного уровня, давайте напишем модульный Python-скрипт. Он будет генерировать полноценную партию данных, но теперь мы разделим генерацию на две независимые темы уровня Hard:
Медиа-планирование (со сквозной конверсией от TRP до чека).
Эффективность трейд-маркетинга и MROI (с расчетом приростных продаж Incremental Sales).
Этот скрипт автоматически рассчитывает бизнес-логику, форматирует числа с пробелами-разделителями и сохраняет результат в один сбалансированный JSON-файл.
Расширенный Python-скрипт генератора
pythonimport json
import random
def generate_media_task(brand, category, month, year):
"""Генерация задачи по медиа-планированию (Hard)"""
target_audience = random.randint(80, 150) * 100000
tv_trp = random.randint(350, 550)
tv_reach = random.randint(45, 65)
digital_impressions = random.randint(12, 25) * 1000000
digital_reach = random.randint(20, 35)
digital_vtr = random.randint(65, 85)
intersection_pct = random.randint(5, min(tv_reach, digital_reach) - 5)
ad_awareness_rate = random.randint(10, 16)
trial_rate = random.randint(4, 8)
# Расчеты
digital_trp = round((digital_impressions / target_audience) * 100)
total_trp = tv_trp + digital_trp
total_reach_pct = tv_reach + digital_reach - intersection_pct
total_reach_abs = int(target_audience * (total_reach_pct / 100))
frequency = round(total_trp / total_reach_pct, 1)
digital_effective_reach = digital_reach * (digital_vtr / 100)
digital_intersection_effective = intersection_pct * (digital_vtr / 100)
qualitative_reach_pct = round(tv_reach + digital_effective_reach - digital_intersection_effective, 1)
qualitative_reach_abs = int(target_audience * (qualitative_reach_pct / 100))
ad_awareness_abs = int(qualitative_reach_abs * (ad_awareness_rate / 100))
trial_purchases = int(ad_awareness_abs * (trial_rate / 100))
total_conversion_pct = round((trial_purchases / target_audience) * 100, 2)
vtr_rec = "сократить хронометраж ролика для подъема VTR" if digital_vtr < 75 else "сохранить текущий формат креатива"
freq_rec = f"Снизить избыточную частоту с {frequency} до 7.0 и перенаправить бюджет в промо" if frequency > 8.0 else "Медиа-вес распределен оптимально."
input_text = (
f"Параметры рекламной кампании бренда '{brand}' ({month.capitalize()} {year}, ЦА: Женщины 25-45 лет, объем ЦА — {target_audience:,} человек):\n"
f"1. ТВ-размещение: {tv_trp} TRP, охват Reach 1+ — {tv_reach}% от ЦА.\n"
f"2. Digital-видео (OLV): показов — {digital_impressions:,}, охват Reach 1+ — {digital_reach}%, VTR — {digital_vtr}%.\n"
f"Пересечение ТВ и Digital — {intersection_pct}% от ЦА.\n"
f"3. Историческая воронка: Конверсия в знание (Ad Awareness) — {ad_awareness_rate}%, из знания в пробную покупку (Trial Rate) — {trial_rate}%."
).replace(",", " ")
output_text = (
f"**1. Медийные показатели:**\n"
f"- Digital TRP: ({digital_impressions:,} / {target_audience:,}) * 100 = {digital_trp} TRP.\n"
f"- Совокупный TRP: {tv_trp} + {digital_trp} = {total_trp} TRP.\n"
f"- Совокупный охват (Reach 1+): {tv_reach}% + {digital_reach}% - {intersection_pct}% = {total_reach_pct}% ({total_reach_abs:,} человек).\n"
f"- Частота (Frequency): {total_trp} / {total_reach_pct} = {frequency}.\n\n"
f"**2. Воронка продаж:**\n"
f"- Качественный охват: {tv_reach}% + {digital_effective_reach}% - {digital_intersection_effective}% = {qualitative_reach_pct}% ({qualitative_reach_abs:,} человек).\n"
f"- Знание знака (Ad Awareness): {qualitative_reach_abs:,} * {ad_awareness_rate}% = {ad_awareness_abs:,} человек.\n"
f"- Пробные покупки: {ad_awareness_abs:,} * {trial_rate}% = {trial_purchases:,} человек.\n"
f"- Конверсия кампании: {total_conversion_pct}%.\n\n"
f"**Вывод:** При частоте {frequency} кампания обеспечит {trial_purchases:,} покупателей категории '{category}'. Рекомендации: 1) В Digital {vtr_rec}. 2) {freq_rec}"
).replace(",", " ")
return {
"instruction": f"Проанализируй медиа-план рекламной кампании '{brand}' в категории '{category}' за {month} {year} года. Рассчитай охват, TRP, частоту и конверсию в покупку. Сделай выводы.",
"input": input_text,
"output": output_text,
"category": "Медиа-планирование",
"subcategory": "4.1 Оценка эффективности рекламных кампаний",
"difficulty": "hard"
}
def generate_trade_marketing_task(brand, category, month, year):
"""Генерация задачи по трейд-маркетингу и MROI (Hard)"""
market_volume = random.randint(35, 55) * 1000000
prev_market_share = round(random.uniform(10.0, 15.0), 1)
sales_volume = random.randint(55, 75) * 100000
price_per_liter = random.randint(50, 65)
marketing_budget = random.randint(10, 15) * 1000000
margin_rate = random.randint(20, 25) # %
market_growth = random.randint(3, 6) # % market growth
# Расчеты
current_share = round((sales_volume / market_volume) * 100, 1)
share_diff = round(current_share - prev_market_share, 1)
revenue = sales_volume * price_per_liter
total_margin = int(revenue * (margin_rate / 100))
# Органические продажи (база прошлого года + рост рынка)
past_year_base = sales_volume / (1 + (current_share - prev_market_share)/100) # упрощенно
organic_sales = int(past_year_base * (1 + market_growth / 100))
incremental_volume = max(10000, sales_volume - organic_sales)
incremental_margin = int(incremental_volume * price_per_liter * (margin_rate / 100))
mroi = round(((incremental_margin - marketing_budget) / marketing_budget) * 100, 1)
status = "выполнили стратегическую задачу роста доли" if mroi < 0 else "окупились и принесли чистую прибыль"
rec = "в Q2 снизить долю глубоких скидок на 15%" if mroi < 0 else "масштабировать механику промо на другие сети"
input_text = (
f"Данные по рынку категории '{category}' за {month.capitalize()} {year} года:\n"
f"- Общий объем рынка: {market_volume:,} л (+{market_growth}% к прошлому году).\n"
f"- Доля рынка бренда '{brand}' в прошлом году: {prev_market_share}%.\n"
f"- Продажи бренда сейчас: {sales_volume:,} л по цене отгрузки {price_per_liter} руб/л.\n"
f"- Инвестиции в трейд-маркетинг: {marketing_budget:,} руб.\n"
f"- Маржинальность продукции до маркетинга: {margin_rate}%."
).replace(",", " ")
output_text = (
f"**1. Анализ доли рынка:**\n"
f"- Текущая доля рынка: ({sales_volume:,} / {market_volume:,}) * 100 = {current_share}%.\n"
f"- Изменение доли: {share_diff} п.п. относительно прошлого года.\n\n"
f"**2. Расчет финансовой эффективности (MROI):**\n"
f"- Выручка: {revenue:,} руб. Общая маржа: {total_margin:,} руб.\n"
f"- Органический объем (прогноз без промо): {organic_sales:,} л.\n"
f"- Приростный объем (Incremental): {incremental_volume:,} л.\n"
f"- Приростная маржа: {incremental_margin:,} руб.\n"
f"- MROI: ({incremental_margin:,} - {marketing_budget:,}) / {marketing_budget:,} * 100 = {mroi}%.\n\n"
f"**Вывод:** Инвестиции {status} (MROI: {mroi}%). Рекомендация: {rec}."
).replace(",", " ")
return {
"instruction": f"Проанализируй эффективность трейд-маркетинга бренда '{brand}' в категории '{category}' за {month} {year} года. Рассчитай долю рынка, приростные продажи и метрику MROI.",
"input": input_text,
"output": output_text,
"category": "Стратегический маркетинг",
"subcategory": "3.2 Оценка эффективности трейд-инвестиций",
"difficulty": "hard"
}
def generate_balanced_dataset(total_records=60):
brands = ["EcoMolk", "Молочный Родник", "ПростоКвашино", "ВкусноМилк", "Белая Корова"]
categories = ["Ультрапастеризованное молоко (UHT)", "Пастеризованное молоко", "Кефир 2.5%", "Ряженка"]
months = ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август"]
dataset = []
for i in range(total_records):
brand = random.choice(brands)
category = random.choice(categories)
month = random.choice(months)
# Чередуем типы задач для баланса классов
if i % 2 == 0:
record = generate_media_task(brand, category, month, 2026)
else:
record = generate_trade_marketing_task(brand, category, month, 2026)
dataset.append(record)
return {"datasets": dataset}
# Генерация датасета из 60 сбалансированных Hard-примеров
final_data = generate_balanced_dataset(60)
with open("dairy_marketing_hard_dataset.json", "w", encoding="utf-8") as f:
json.dump(final_data, f, ensure_ascii=False, indent=2)
print("Файл dairy_marketing_hard_dataset.json успешно создан. Сгенерировано 60 записей.")
Как запустить скрипт и что делать дальше?
Запуск: Скопируйте код в любой файл с расширением .py (например, generator.py) и выполните команду python generator.py. В этой же папке появится готовый JSON-файл.
Масштабирование: Чтобы получить бoльшую выборку (например, 1000 примеров), просто измените значение в строке generate_balanced_dataset(1000). Математические формулы внутри функций гарантируют, что ни в одном файле не будет расхождения цифр.
https://www.tumbex.com/sci-fi-screenplay.tumblr/posts
Комментарии
Отправить комментарий