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


AI Fine Tuning Qwen2.5





Комментарии

Популярные сообщения из этого блога

Рекомендуемый размер датасета

JSON Data 23

JSON Data 24