From 85487df0c511d3b52d5b169231b5d5fa51c51f76 Mon Sep 17 00:00:00 2001 From: Lex Lim Date: Wed, 24 Sep 2025 04:41:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8E=BB=E9=99=A4=E6=AF=8F?= =?UTF-8?q?=E5=A4=A9=E7=AC=AC=E4=B8=80=E4=B8=AA=E7=9B=B2=E7=9B=92=EF=BC=8C?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=A2=9E=E5=8A=A0=E6=A8=A1=E6=8B=9F=E6=8A=95?= =?UTF-8?q?=E7=9B=B2=E7=9B=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- blindbox_analysis.py | 92 +++++++++++++++++++++++++++++++++++++++++- blindbox_simulation.py | 69 +++++++++++++++++++++++++++++++ requirements.txt | 3 +- requirements[asr].txt | 4 ++ subtitle_generator.py | 0 6 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 blindbox_simulation.py create mode 100644 requirements[asr].txt create mode 100644 subtitle_generator.py diff --git a/.gitignore b/.gitignore index 6f3562d..398ee83 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ __pycache__/ # Ignore environment files .env .venv/ -venv/ \ No newline at end of file +venv/ + +data/ \ No newline at end of file diff --git a/blindbox_analysis.py b/blindbox_analysis.py index 0425f40..a6e9907 100644 --- a/blindbox_analysis.py +++ b/blindbox_analysis.py @@ -2,7 +2,7 @@ import argparse from datetime import timedelta import os import traceback -from typing import Any, TypedDict +from typing import Any, Optional, TypedDict import pandas as pd from danmaku_reader import DanmakuReader @@ -12,9 +12,15 @@ class BlindboxItemData(TypedDict): price: int probability: float +class PityItemData(TypedDict): + threshold: int + item_name: str + price: int + class BlindboxInfo(TypedDict): price: int items: dict[str, BlindboxItemData] + pity: Optional[PityItemData] blindbox_config: dict[str, BlindboxInfo] = { "星月盲盒": { @@ -50,6 +56,66 @@ blindbox_config: dict[str, BlindboxInfo] = { } } }, + "幸运盲盒": { + "price": 50, + "items": { + "幸运泡泡": { + "price": 15, + "probability": 49.6 + }, + "星光铃铛": { + "price": 52, + "probability": 42.2 + }, + "梦雾纸签": { + "price": 100, + "probability": 5 + }, + "福灵小兽": { + "price": 200, + "probability": 2.4 + }, + "星愿花园": { + "price": 600, + "probability": 0.8 + } + }, + "pity": { + "threshold": 66, + "item_name": "糖梦福狸", + "price": 200 + } + }, + "幸运盲盒S": { + "price": 500, + "items": { + "初兆光符": { + "price": 160, + "probability": 54.04 + }, + "福引转轮": { + "price": 520, + "probability": 40 + }, + "光羽预言": { + "price": 1000, + "probability": 4.8 + }, + "幽镜之门": { + "price": 5000, + "probability": 1 + }, + "命契幻境": { + "price": 30000, + "probability": 0.16 + } + }, + "pity": { + "threshold": 100, + "item_name": "幻梦晶球", + "price": 3000 + } + }, "心动盲盒": { "price": 150, # 请根据实际盲盒价格填写 "items": { @@ -250,13 +316,33 @@ def profit_statistic(df: pd.DataFrame) -> dict[str, dict[str, Any]]: def run_statistics(df: pd.DataFrame) -> dict[str, dict[str, Any]]: """运行统计分析""" stats = {} + # 统计整体数据 total_stats = profit_statistic(df) stats["整体"] = total_stats + + # 统计去掉每个用户每天第一次开盲盒的数据 + def remove_first_record_per_group(group): + """去掉每组的第一条记录""" + return group.iloc[1:] # 从第二条开始返回 + + # 确保时间列是datetime格式 + if 'time' in df.columns: + df['time'] = pd.to_datetime(df['time']) + # 提取日期部分(去掉时间) + df['date'] = df['time'].dt.date + # 按日期、用户ID、盲盒名称分组 + grouped = df.groupby(['date', 'username', 'blindbox_name']) + # 去掉每组的第一条数据 + df_filtered = grouped.apply(remove_first_record_per_group).reset_index(drop=True) + filtered_stats = profit_statistic(df_filtered) + stats["去除保底"] = filtered_stats + # 统计周五以外的数据 non_friday_df = df[pd.to_datetime(df["time"]).dt.weekday != 4] non_friday_stats = profit_statistic(non_friday_df) stats["非周五"] = non_friday_stats + # 统计周五的数据 friday_df = df[pd.to_datetime(df["time"]).dt.weekday == 4] friday_stats = profit_statistic(friday_df) @@ -336,4 +422,6 @@ if __name__ == "__main__": # 运行统计分析 stats = run_statistics(result_df) print("\n统计结果:") - print_tree(stats) \ No newline at end of file + print_tree(stats) + else: + print("未找到任何盲盒数据") \ No newline at end of file diff --git a/blindbox_simulation.py b/blindbox_simulation.py new file mode 100644 index 0000000..3645cdc --- /dev/null +++ b/blindbox_simulation.py @@ -0,0 +1,69 @@ +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) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 1411a4a..69d2f27 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -pandas \ No newline at end of file +pandas +numpy \ No newline at end of file diff --git a/requirements[asr].txt b/requirements[asr].txt new file mode 100644 index 0000000..063a38b --- /dev/null +++ b/requirements[asr].txt @@ -0,0 +1,4 @@ +torch +torchaudio +--index-url https://download.pytorch.org/whl/cu126 +funasr \ No newline at end of file diff --git a/subtitle_generator.py b/subtitle_generator.py new file mode 100644 index 0000000..e69de29