# file name : generate_sales_data.py
# 商品の売上データ reidai11_8、reidai11_9 で利用

import pandas as pd
import random
from datetime import datetime,timedelta

# ====================自由に設定ここから====================
# (1) データカテゴリ
categories=[ '家庭用品','酒類','季節の商品','洋菓子','飲料','雑貨',
'和菓子','肉加工品','限定品','ファッション用品','グロッサリー',
'海産物','缶詰','麺類','フルーツ','フラワーギフト','カタログギフト' ]
# (2) データ個数
dat_count=1000
# (3) 年月日の範囲
date_s,date_e=[2025,1,1],[2027,12,31]
# (4) 価格の範囲（単位：千円）
kakaku =[3,20] 
# (5) データファイル名
csv_filename='data.csv'
# (6) 季節バイアスON/OFF
season_bias=True 
# (7) 季節バイアス：該当月×カテゴリに重み2、それ以外1
bias=lambda cate,month:2 if (
(month==1 and cate in ('和菓子','限定品','カタログギフト')) or
(month==2 and cate=='洋菓子') or
(month in (3,4) and
cate in ('フラワーギフト','ファッション用品','季節の商品')) or
(month in (6,7,8) and cate in ('飲料','フルーツ','季節の商品')) or
(month==9 and cate in ('和菓子','フラワーギフト')) or
(month==10 and cate in ('洋菓子','限定品')) or
(month==12 and cate in ('酒類','カタログギフト','季節の商品'))
) else 1 
# ====================自由に設定ここまで====================

# ---- 日付生成関数----
def random_date(date_start,date_end):
    start_dt=datetime(*date_start); end_dt=datetime(*date_end)
    return (start_dt+timedelta(days=
        random.randint(0,(end_dt-start_dt).days))).date()

# ---- データ生成----
def generate_sales_data():
    data={'ID':[],'Date0':[],'category':[],'price':[]}
    for i in range(dat_count):
        d = random_date(date_s, date_e)
        if season_bias:
            w = [bias(c, d.month) for c in categories]
            cat_name = random.choices(categories, weights=w, k=1)[0]
        else: cat_name = random.choice(categories)
        data['ID'].append(f'{i:05d}') ; data['Date0'].append(d)
        data['category'].append(cat_name)
        data['price'].append(random.randint(kakaku[0], kakaku[1])*1000)
    return pd.DataFrame(data)

# ---- データ保存----
def main():
    df = generate_sales_data()
    df.to_csv(csv_filename, index=False, encoding='utf-8-sig')
    print(f'{csv_filename} に保存しました。')

# ---- main関数----
if __name__ == '__main__':
    main()
