You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.4 KiB
Python

import numpy as np
import pandas as pd
from blindbox_analysis import blindbox_config, print_tree, profit_statistic
def generate_random_data(blindbox_name: str, num_records: int):
"""
生成随机盲盒数据
"""
np.random.seed(42) # 固定随机种子,确保结果可复现
dataset = []
for i in range(num_records):
# 随机生成用户ID和用户名
uid = np.random.randint(1000, 2000)
username = f'user_{uid}'
blindbox_info = blindbox_config[blindbox_name]
pity_info = blindbox_info.get('pity', None)
# 抽选盲盒物品
rand_num = np.random.rand()
sum_prob = 0
selected_item = None
for item, item_info in blindbox_info['items'].items():
prob = item_info['probability'] / 100
if rand_num > sum_prob and rand_num <= sum_prob + prob:
selected_item = (item, item_info)
break
sum_prob += prob
if selected_item is None:
raise ValueError("未能选中任何物品")
# 构建随机数据记录
dataset.append({
'uid': uid,
'username': username,
'blindbox_name': blindbox_name,
'blindbox_price': blindbox_info['price'],
'item_name': selected_item[0],
'item_price': selected_item[1]['price'],
'profit': selected_item[1]['price'] - blindbox_info['price'],
'time': pd.Timestamp.now()
})
if pity_info:
# 模拟保底机制
if (i + 1) % pity_info['threshold'] == 0:
dataset.append({
'uid': uid,
'username': username,
'blindbox_name': blindbox_name,
'blindbox_price': blindbox_info['price'],
'item_name': pity_info['item_name'],
'item_price': pity_info['price'],
'profit': pity_info['price'] - blindbox_info['price'],
'time': pd.Timestamp.now()
})
return pd.DataFrame(dataset)
if __name__ == "__main__":
# 生成随机数据
stats = {}
for box_name in blindbox_config.keys():
df = generate_random_data(box_name, 10000)
stats[box_name] = profit_statistic(df)
print_tree(stats)