[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-georgedouzas--sports-betting":3,"tool-georgedouzas--sports-betting":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",144730,2,"2026-04-07T23:26:32",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":76,"owner_twitter":76,"owner_website":78,"owner_url":79,"languages":80,"stars":89,"forks":90,"last_commit_at":91,"license":92,"difficulty_score":32,"env_os":93,"env_gpu":94,"env_ram":93,"env_deps":95,"category_tags":102,"github_topics":103,"view_count":32,"oss_zip_url":76,"oss_zip_packed_at":76,"status":17,"created_at":107,"updated_at":108,"faqs":109,"releases":145},5462,"georgedouzas\u002Fsports-betting","sports-betting","Collection of sports betting AI tools.","sports-betting 是一套专为体育博彩建模打造的开源工具集，旨在帮助用户轻松构建、测试并应用预测模型。它有效解决了从数据获取到策略验证的全流程痛点：内置的数据加载器能自动下载并清洗历史赛事与赛程数据，而投注器对象则支持对博彩策略进行回测，精准识别未来赛事中的价值注单。\n\n这套工具特别适合数据科学家、量化分析师以及希望尝试体育数据建模的开发者使用。其独特亮点在于提供了“三合一”的交互体验：既包含供程序员调用的 Python API，也配备了命令行工具，更难得的是还内置了基于 Reflex 框架开发的图形界面（GUI）。这意味着即使不编写代码，用户也能通过直观的界面上传数据、训练模型并查看预测结果。此外，项目遵循严格的工程标准，集成了 black、ruff 等现代化工具确保代码质量，并配有详细的文档与社区支持，让体育数据分析变得更加简单高效。","[scikit-learn]: \u003Chttp:\u002F\u002Fscikit-learn.org\u002Fstable\u002F>\n[black badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%20style-black-000000.svg>\n[black]: \u003Chttps:\u002F\u002Fgithub.com\u002Fpsf\u002Fblack>\n[docformatter badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%20formatter-docformatter-fedcba.svg>\n[docformatter]: \u003Chttps:\u002F\u002Fgithub.com\u002FPyCQA\u002Fdocformatter>\n[ruff badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https:\u002F\u002Fraw.githubusercontent.com\u002Fcharliermarsh\u002Fruff\u002Fmain\u002Fassets\u002Fbadge\u002Fv1.json>\n[ruff]: \u003Chttps:\u002F\u002Fgithub.com\u002Fcharliermarsh\u002Fruff>\n[mypy badge]: \u003Chttp:\u002F\u002Fwww.mypy-lang.org\u002Fstatic\u002Fmypy_badge.svg>\n[mypy]: \u003Chttp:\u002F\u002Fmypy-lang.org>\n[mkdocs badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-mkdocs%20material-blue.svg?style=flat>\n[mkdocs]: \u003Chttps:\u002F\u002Fsquidfunk.github.io\u002Fmkdocs-material>\n[version badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fsports-betting.svg>\n[pythonversion badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fpyversions\u002Fsports-betting.svg>\n[downloads badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fdd\u002Fsports-betting>\n[gitter]: \u003Chttps:\u002F\u002Fgitter.im\u002Fsports-betting\u002Fcommunity>\n[gitter badge]: \u003Chttps:\u002F\u002Fbadges.gitter.im\u002Fjoin%20chat.svg>\n[discussions]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fdiscussions>\n[discussions badge]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdiscussions\u002Fgeorgedouzas\u002Fsports-betting>\n[ci]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions?query=workflow>\n[ci badge]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg?branch=main>\n[doc]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions?query=workflow>\n[doc badge]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions\u002Fworkflows\u002Fdoc.yml\u002Fbadge.svg?branch=main>\n\n# sports-betting\n\n[![ci][ci badge]][ci] [![doc][doc badge]][doc]\n\n| Category          | Tools    |\n| ------------------| -------- |\n| **Development**   | [![black][black badge]][black] [![ruff][ruff badge]][ruff] [![mypy][mypy badge]][mypy] [![docformatter][docformatter badge]][docformatter] |\n| **Package**       | ![version][version badge] ![pythonversion][pythonversion badge] ![downloads][downloads badge] |\n| **Documentation** | [![mkdocs][mkdocs badge]][mkdocs]|\n| **Communication** | [![gitter][gitter badge]][gitter] [![discussions][discussions badge]][discussions] |\n\n## Introduction\n\nThe `sports-betting package` is a handy set of tools for creating, testing, and using sports betting models. It comes\nwith a Python API, a CLI, and even a GUI built with [Reflex](https:\u002F\u002Freflex.dev\u002F) to keep things simple:\n\n![](screenshots\u002Fpredictions.png)\n![](docs\u002Fscreenshots\u002Fpredictions.png)\n\nThe main components of `sports-betting` are dataloaders and bettors objects:\n\n- Dataloaders download and prepare data suitable for predictive modelling.\n- Bettors provide an easy way to backtest betting strategies and predict the value bets of future events.\n\n## Quick start\n\n### GUI\n\n`sports-betting` comes with a GUI that provides a intuitive way to interact with the library. It supports the following\nfunctionalitites:\n\n- Easily upload, create, or update dataloaders to handle historical and fixtures data.\n- Develop and test betting models with tools for backtesting and identifying value bets.\n\nTo launch the GUI, simply run the command `sportsbet-gui`. Once started, you’ll see the initial screen:\n\n![](screenshots\u002Finitial.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_70a4d7e1eeff.png)\n\nExplore the functionality with guidance from the built-in bot, which streams helpful messages along the way.\n\n### API\n\nThe `sports-betting` package makes it easy to download sports betting data:\n\n```python\nfrom sportsbet.datasets import SoccerDataLoader\ndataloader = SoccerDataLoader(param_grid={'league': ['Italy'], 'year': [2020]})\nX_train, Y_train, O_train = dataloader.extract_train_data(odds_type='market_maximum')\nX_fix, Y_fix, O_fix = dataloader.extract_fixtures_data()\n```\n\n`X_train` are the historical\u002Ftraining data and `X_fix` are the test\u002Ffixtures data. The historical data can be used to backtest the\nperformance of a bettor model:\n\n```python\nfrom sportsbet.evaluation import ClassifierBettor, backtest\nfrom sklearn.dummy import DummyClassifier\nbettor = ClassifierBettor(DummyClassifier())\nbacktest(bettor, X_train, Y_train, O_train)\n```\n\nWe can use the trained bettor model to predict the value bets using the fixtures data:\n\n```python\nbettor.fit(X_train, Y_train)\nbettor.bet(X_fix, O_fix)\n```\n\n## Sports betting in practice\n\nYou can think of any sports betting event as a random experiment with unknown probabilities for the various outcomes. Even for the\nmost unlikely outcome, for example scoring more than 10 goals in a soccer match, a small probability is still assigned. The\nbookmaker estimates this probability P and offers the corresponding odds O. In theory, if the bookmaker offers the so-called fair\nodds O = 1 \u002F P in the long run, neither the bettor nor the bookmaker would make any money.\n\nThe bookmaker's strategy is to adjust the odds in their favor using the over-round of probabilities. In practice, it offers odds\nless than the estimated fair odds. The important point here is that the bookmaker still has to estimate the probabilities of\noutcomes and provide odds that guarantee them long-term profit.\n\nOn the other hand, the bettor can also estimate the probabilities and compare them to the odds the bookmaker offers. If the\nestimated probability of an outcome is higher than the implied probability from the provided odds, then the bet is called a value\nbet.\n\nThe only long-term betting strategy that makes sense is to select value bets. However, you have to remember that neither the\nbettor nor the bookmaker can access the actual probabilities of outcomes. Therefore, identifying a value bet from the side of the\nbettor is still an estimation. The bettor or the bookmaker might be wrong, or both of them.\n\nAnother essential point is that bookmakers can access resources that the typical bettor is rare to access. For instance, they have\nmore data, computational power, and teams of experts working on predictive models. You may assume that trying to beat them is\npointless, but this is not necessarily correct. The bookmakers have multiple factors to consider when they offer their adjusted\nodds. This is the reason there is a considerable variation among the offered odds. The bettor should aim to systematically\nestimate the value bets, backtest their performance, and not create arbitrarily accurate predictive models. This is a realistic\ngoal, and `sports-betting` can help by providing appropriate tools.\n\n## Installation\n\nFor user installation, `sports-betting` is currently available on the PyPi's repository, and you can install it via `pip`:\n\n```bash\npip install sports_betting\n```\n\nIf you have Node.js version v22.0.0 or higher, you can optionally install the GUI:\n\n```bash\npip install sports_betting[gui]\n```\n\nDevelopment installation requires to clone the repository and then use [PDM](https:\u002F\u002Fgithub.com\u002Fpdm-project\u002Fpdm) to install the\nproject as well as the main and development dependencies:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting.git\ncd sports-betting\npdm install\n```\n\n## Usage\n\nYou can access `sports-betting` through the GUI application, the Python API, or the CLI. However, it’s a good idea to\nget familiar with the Python API since you’ll need it to create configuration files for the CLI or load custom betting\nmodels into the GUI. `sports-betting` supports all common sports betting needs i.e. fetching historical and fixtures\ndata as well as backtesting of betting strategies and prediction of value bets. \n\n## GUI\n\nLaunch the GUI app with the command `sportsbet-gui`.\n\nHere are a few things you can do with the GUI:\n\n- Configure the dataloader:\n\n![](screenshots\u002Fparameters.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_2b5c5392a2d5.png)\n\n- Create a new betting model:\n\n![](screenshots\u002Fbetting_model.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_86065a850edf.png)\n\n- Run the model to get either backtesting results or value bets:\n\n![](screenshots\u002Fbacktesting.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_fc24cdc50431.png)\n\n### API\n\nAssume we would like to backtest the following scenario and use the bettor object\nto predict value bets:\n\n- Selection of data\n  - First and second division of German, Italian and French leagues for the years 2021-2024\n  - Maximum odds of the market in order to backtest our betting strategy\n- Configuration of betting strategy\n  - 5-fold time ordered cross-validation\n  - Initial cash of 10000 euros\n  - Stake of 50 euros for each bet\n  - Use match odds (home win, away win and draw) as betting markets\n  - Logistic regression classifier to predict probabilities and value bets\n\n```python\n# Selection of data\nfrom sportsbet.datasets import SoccerDataLoader\n\nleagues = ['Germany', 'Italy', 'France']\ndivisions = [1, 2]\nyears = [2021, 2022, 2023, 2024]\nodds_type = 'market_maximum'\ndataloader = SoccerDataLoader({'league': leagues, 'year': years, 'division': divisions})\nX_train, Y_train, O_train = dataloader.extract_train_data(odds_type=odds_type)\nX_fix, _, O_fix = dataloader.extract_fixtures_data()\n\n# Configuration of betting strategy\nfrom sklearn.model_selection import TimeSeriesSplit\nfrom sklearn.compose import make_column_transformer\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.multioutput import MultiOutputClassifier\nfrom sportsbet.evaluation import ClassifierBettor, backtest\n\ntscv = TimeSeriesSplit(5)\ninit_cash = 10000.0\nstake = 50.0\nbetting_markets = ['home_win__full_time_goals', 'draw__full_time_goals', 'away_win__full_time_goals']\nclassifier = make_pipeline(\n  make_column_transformer(\n    (OneHotEncoder(handle_unknown='ignore'), ['league', 'home_team', 'away_team']), remainder='passthrough'\n  ),\n  SimpleImputer(),\n  MultiOutputClassifier(LogisticRegression(solver='liblinear', random_state=7, class_weight='balanced', C=50)),\n)\nbettor = ClassifierBettor(classifier, betting_markets=betting_markets, stake=stake, init_cash=init_cash)\n\n# Apply backtesting and get results\nbacktesting_results = backtest(bettor, X_train, Y_train, O_train, cv=tscv)\n\n# Get value bets for upcoming betting events\nbettor.fit(X_train, Y_train)\nbettor.bet(X_fix, O_fix)\n```\n\n### CLI\n\nThe command `sportsbet` provides various sub-commands to download data and predict the value bets. For any sub-command you may\nadd the `--help` flag to get more information about its usage.\n\n#### Configuration\n\nIn order to use the commands, a configuration file is required. You can find examples of such configuration files in\n`sports-betting\u002Fconfigs\u002F`. The configuration file should have a Python file extension and contain a few variables. The variables \n`DATALOADER_CLASS` and `PARAM_GRID` are mandatory while the rest are optional.\n\nThe following variables configure the data extraction:\n\n- `DATALOADER_CLASS`: The dataloader class to use.\n\n- `PARAM_GRID`: The parameters grid to select the type of information that the data includes.\n\n- `DROP_NA_THRES`: The parameter `drop_na_thres` of the dataloader's `extract_train_data`.\n\n- `ODDS_TYPE`: The parameter `odds_type` of the dataloader's `extract_train_data`.\n\nThe following variables configure the betting process:\n\n- `BETTOR`: A bettor object.\n\n- `CV`: The parameter `cv` of the function `backtest`.\n\n- `N_JOBS`: The parameter `n_jobs` of the function `backtest`.\n\n- `VERBOSE`: The parameter `verbose` of the function `backtest`.\n\n#### Commands\n\nOnce these variables are provided, we can select the appropriate commands to select any of the `sports-betting`'s functionalities.\n\n##### Dataloader\n\nShow available parameters for dataloaders:\n\n```bash\nsportsbet dataloader params -c config.py\n```\n\nShow available odds types:\n\n```bash\nsportsbet dataloader odds-types -c config.py\n```\n\nExtract training data and save them as CSV files:\n\n```bash\nsportsbet dataloader training -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```\n\nExtract fixtures data and save them as CSV files:\n\n```bash\nsportsbet dataloader fixtures -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```\n\n##### Bettor\n\nBacktest the bettor and save the results as CSV file:\n\n```bash\nsportsbet bettor backtest -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```\n\nGet the value bets and save them as CSV file:\n\n```bash\nsportsbet bettor bet -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```\n","[scikit-learn]: \u003Chttp:\u002F\u002Fscikit-learn.org\u002Fstable\u002F>\n[black徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%20style-black-000000.svg>\n[black]: \u003Chttps:\u002F\u002Fgithub.com\u002Fpsf\u002Fblack>\n[docformatter徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%20formatter-docformatter-fedcba.svg>\n[docformatter]: \u003Chttps:\u002F\u002Fgithub.com\u002FPyCQA\u002Fdocformatter>\n[ruff徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https:\u002F\u002Fraw.githubusercontent.com\u002Fcharliermarsh\u002Fruff\u002Fmain\u002Fassets\u002Fbadge\u002Fv1.json>\n[ruff]: \u003Chttps:\u002F\u002Fgithub.com\u002Fcharliermarsh\u002Fruff>\n[mypy徽章]: \u003Chttp:\u002F\u002Fwww.mypy-lang.org\u002Fstatic\u002Fmypy_badge.svg>\n[mypy]: \u003Chttp:\u002F\u002Fmypy-lang.org>\n[mkdocs徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-mkdocs%20material-blue.svg?style=flat>\n[mkdocs]: \u003Chttps:\u002F\u002Fsquidfunk.github.io\u002Fmkdocs-material>\n[版本徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fsports-betting.svg>\n[Python版本徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fpyversions\u002Fsports-betting.svg>\n[下载量徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fdd\u002Fsports-betting>\n[gitter]: \u003Chttps:\u002F\u002Fgitter.im\u002Fsports-betting\u002Fcommunity>\n[gitter徽章]: \u003Chttps:\u002F\u002Fbadges.gitter.im\u002Fjoin%20chat.svg>\n[讨论区]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fdiscussions>\n[讨论区徽章]: \u003Chttps:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdiscussions\u002Fgeorgedouzas\u002Fsports-betting>\n[CI]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions?query=workflow>\n[CI徽章]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg?branch=main>\n[文档]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions?query=workflow>\n[文档徽章]: \u003Chttps:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Factions\u002Fworkflows\u002Fdoc.yml\u002Fbadge.svg?branch=main>\n\n# sports-betting\n\n[![CI][CI徽章]][CI] [![文档][文档徽章]][文档]\n\n| 类别          | 工具    |\n| ------------------| -------- |\n| **开发**   | [![black][black徽章]][black] [![ruff][ruff徽章]][ruff] [![mypy][mypy徽章]][mypy] [![docformatter][docformatter徽章]][docformatter] |\n| **打包**       | ![版本][版本徽章] ![Python版本][Python版本徽章] ![下载量][下载量徽章] |\n| **文档** | [![mkdocs][mkdocs徽章]][mkdocs]|\n| **沟通** | [![gitter][gitter徽章]][gitter] [![讨论区][讨论区徽章]][讨论区] |\n\n## 简介\n\n`sports-betting 包` 是一套用于创建、测试和使用体育博彩模型的实用工具。它配备了 Python API、CLI，甚至还内置了一个基于 [Reflex](https:\u002F\u002Freflex.dev\u002F) 构建的 GUI，让操作更加简单：\n\n![](screenshots\u002Fpredictions.png)\n![](docs\u002Fscreenshots\u002Fpredictions.png)\n\n`sports-betting` 的核心组件是数据加载器和投注器对象：\n\n- 数据加载器负责下载并准备适合预测建模的数据。\n- 投注器则提供了一种便捷的方式，用于回测投注策略并预测未来赛事中的价值投注。\n\n## 快速入门\n\n### GUI\n\n`sports-betting` 自带一个 GUI，为用户提供了直观的交互方式。它支持以下功能：\n\n- 轻松上传、创建或更新数据加载器，以处理历史数据和赛程数据。\n- 使用回测工具和价值投注识别功能，开发并测试投注模型。\n\n要启动 GUI，只需运行命令 `sportsbet-gui`。启动后，您将看到初始界面：\n\n![](screenshots\u002Finitial.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_70a4d7e1eeff.png)\n\n您可以跟随内置机器人提供的指导信息，逐步探索各项功能。\n\n### API\n\n`sports-betting` 包使下载体育博彩数据变得非常容易：\n\n```python\nfrom sportsbet.datasets import SoccerDataLoader\ndataloader = SoccerDataLoader(param_grid={'league': ['Italy'], 'year': [2020]})\nX_train, Y_train, O_train = dataloader.extract_train_data(odds_type='market_maximum')\nX_fix, Y_fix, O_fix = dataloader.extract_fixtures_data()\n```\n\n`X_train` 是历史\u002F训练数据，而 `X_fix` 则是测试\u002F赛程数据。利用历史数据，可以对投注器模型的性能进行回测：\n\n```python\nfrom sportsbet.evaluation import ClassifierBettor, backtest\nfrom sklearn.dummy import DummyClassifier\nbettor = ClassifierBettor(DummyClassifier())\nbacktest(bettor, X_train, Y_train, O_train)\n```\n\n训练好的投注器模型还可以用来根据赛程数据预测价值投注：\n\n```python\nbettor.fit(X_train, Y_train)\nbettor.bet(X_fix, O_fix)\n```\n\n## 体育博彩的实际应用\n\n我们可以把任何体育博彩事件看作一个随机实验，其中各个结果的概率都是未知的。即使是最不可能发生的事件，比如足球比赛中进超过 10 个球，也会被赋予一定的概率。庄家会估算这个概率 P，并据此给出相应的赔率 O。理论上，如果庄家长期提供所谓的公平赔率 O = 1 \u002F P，那么无论是投注者还是庄家都不会获利。\n\n然而，庄家的策略是通过提高总概率来调整赔率，使其对自己有利。在实践中，他们通常会提供低于公平赔率的赔率。关键在于，庄家仍然需要估算各种结果的概率，并设置能够确保其长期盈利的赔率。\n\n另一方面，投注者也可以估算这些概率，并将其与庄家提供的赔率进行比较。如果某个结果的估算概率高于其对应赔率所隐含的概率，那么这种投注就被称作“价值投注”。\n\n从长远来看，唯一有意义的投注策略就是选择价值投注。但需要注意的是，无论是投注者还是庄家，都无法获得结果的真实概率。因此，投注者所识别的价值投注本质上仍是一种估计。投注者或庄家都可能判断失误，甚至双方都可能出错。\n\n另一个重要点是，庄家通常拥有普通投注者难以企及的资源，例如更丰富的数据、更强的计算能力以及专门从事预测建模的专家团队。你可能会认为试图击败庄家毫无意义，但事实并非如此。庄家在设定赔率时需要考虑多种因素，这也导致不同庄家提供的赔率存在较大差异。投注者应致力于系统性地评估价值投注、回测其表现，而不是盲目追求过于精确的预测模型。这实际上是一个切实可行的目标，而 `sports-betting` 正好提供了相应的工具来帮助实现这一目标。\n\n## 安装\n\n对于普通用户安装，`sports-betting` 当前已在 PyPI 仓库中发布，您可以通过 `pip` 进行安装：\n\n```bash\npip install sports_betting\n```\n\n如果您使用的是 Node.js v22.0.0 或更高版本，还可以选择安装 GUI 界面：\n\n```bash\npip install sports_betting[gui]\n```\n\n开发环境的安装需要先克隆仓库，然后使用 [PDM](https:\u002F\u002Fgithub.com\u002Fpdm-project\u002Fpdm) 来安装项目及其主要依赖和开发依赖：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting.git\ncd sports-betting\npdm install\n```\n\n## 使用\n\n您可以使用 GUI 应用程序、Python API 或命令行界面来访问 `sports-betting`。不过，建议先熟悉 Python API，因为您将需要它来创建命令行配置文件或将自定义投注模型加载到 GUI 中。`sports-betting` 支持常见的体育博彩需求，例如获取历史数据和赛事信息，以及对投注策略进行回测和预测价值投注。\n\n## GUI\n\n通过命令 `sportsbet-gui` 启动 GUI 应用程序。\n\n以下是您可以在 GUI 中执行的一些操作：\n\n- 配置数据加载器：\n\n![](screenshots\u002Fparameters.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_2b5c5392a2d5.png)\n\n- 创建新的投注模型：\n\n![](screenshots\u002Fbetting_model.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_86065a850edf.png)\n\n- 运行模型以获取回测结果或价值投注：\n\n![](screenshots\u002Fbacktesting.png)\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_readme_fc24cdc50431.png)\n\n### API\n\n假设我们想要回测以下场景，并使用 bettor 对象来预测价值投注：\n\n- 数据选择：\n  - 2021 年至 2024 年德国、意大利和法国联赛的一级和二级联赛\n  - 市场最高赔率，用于回测我们的投注策略\n- 投注策略配置：\n  - 5 折时间序列交叉验证\n  - 初始资金 10000 欧元\n  - 每次投注金额 50 欧元\n  - 使用比赛赔率（主队胜、客队胜和平局）作为投注市场\n  - 使用逻辑回归分类器来预测概率和价值投注\n\n```python\n# 数据选择\nfrom sportsbet.datasets import SoccerDataLoader\n\nleagues = ['Germany', 'Italy', 'France']\ndivisions = [1, 2]\nyears = [2021, 2022, 2023, 2024]\nodds_type = 'market_maximum'\ndataloader = SoccerDataLoader({'league': leagues, 'year': years, 'division': divisions})\nX_train, Y_train, O_train = dataloader.extract_train_data(odds_type=odds_type)\nX_fix, _, O_fix = dataloader.extract_fixtures_data()\n\n# 投注策略配置\nfrom sklearn.model_selection import TimeSeriesSplit\nfrom sklearn.compose import make_column_transformer\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.multioutput import MultiOutputClassifier\nfrom sportsbet.evaluation import ClassifierBettor, backtest\n\ntscv = TimeSeriesSplit(5)\ninit_cash = 10000.0\nstake = 50.0\nbetting_markets = ['home_win__full_time_goals', 'draw__full_time_goals', 'away_win__full_time_goals']\nclassifier = make_pipeline(\n  make_column_transformer(\n    (OneHotEncoder(handle_unknown='ignore'), ['league', 'home_team', 'away_team']), remainder='passthrough'\n  ),\n  SimpleImputer(),\n  MultiOutputClassifier(LogisticRegression(solver='liblinear', random_state=7, class_weight='balanced', C=50)),\n)\nbettor = ClassifierBettor(classifier, betting_markets=betting_markets, stake=stake, init_cash=init_cash)\n\n# 执行回测并获取结果\nbacktesting_results = backtest(bettor, X_train, Y_train, O_train, cv=tscv)\n\n# 获取即将到来的赛事的价值投注\nbettor.fit(X_train, Y_train)\nbettor.bet(X_fix, O_fix)\n```\n\n### CLI\n\n命令 `sportsbet` 提供了多种子命令，用于下载数据和预测价值投注。对于任何子命令，您可以添加 `--help` 标志以获取更多使用信息。\n\n#### 配置\n\n要使用这些命令，需要一个配置文件。您可以在 `sports-betting\u002Fconfigs\u002F` 目录中找到此类配置文件的示例。配置文件应具有 `.py` 文件扩展名，并包含若干变量。其中 `DATALOADER_CLASS` 和 `PARAM_GRID` 是必填项，其余为可选项。\n\n以下变量用于配置数据提取：\n\n- `DATALOADER_CLASS`：要使用的数据加载器类。\n- `PARAM_GRID`：用于选择数据包含的信息类型的参数网格。\n- `DROP_NA_THRES`：数据加载器 `extract_train_data` 方法中的 `drop_na_thres` 参数。\n- `ODDS_TYPE`：数据加载器 `extract_train_data` 方法中的 `odds_type` 参数。\n\n以下变量用于配置投注过程：\n\n- `BETTOR`：bettor 对象。\n- `CV`：`backtest` 函数中的 `cv` 参数。\n- `N_JOBS`：`backtest` 函数中的 `n_jobs` 参数。\n- `VERBOSE`：`backtest` 函数中的 `verbose` 参数。\n\n#### 命令\n\n在提供这些变量后，我们可以选择适当的命令来使用 `sports-betting` 的各项功能。\n\n##### 数据加载器\n\n显示可用的数据加载器参数：\n\n```bash\nsportsbet dataloader params -c config.py\n```\n\n显示可用的赔率类型：\n\n```bash\nsportsbet dataloader odds-types -c config.py\n```\n\n提取训练数据并将其保存为 CSV 文件：\n\n```bash\nsportsbet dataloader training -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```\n\n提取赛事数据并将其保存为 CSV 文件：\n\n```bash\nsportsbet dataloader fixtures -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```\n\n##### 贝特者\n\n对 bettor 进行回测并将结果保存为 CSV 文件：\n\n```bash\nsportsbet bettor backtest -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```\n\n获取价值投注并将其保存为 CSV 文件：\n\n```bash\nsportsbet bettor bet -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n```","# sports-betting 快速上手指南\n\n`sports-betting` 是一个用于创建、测试和使用体育博彩模型的 Python 工具包。它提供了数据加载器（Dataloaders）来获取历史数据和赛程数据，以及投注者对象（Bettors）来回测策略和预测价值注单。该工具支持 Python API、命令行界面（CLI）以及基于 Reflex 构建的图形用户界面（GUI）。\n\n## 环境准备\n\n在开始之前，请确保您的系统满足以下要求：\n\n*   **操作系统**：Linux, macOS 或 Windows\n*   **Python 版本**：3.9 及以上\n*   **可选依赖（仅用于 GUI）**：如果您计划使用图形界面，需要安装 **Node.js v22.0.0** 或更高版本。\n\n## 安装步骤\n\n### 1. 基础安装\n通过 pip 安装核心功能包：\n\n```bash\npip install sports_betting\n```\n\n> **提示**：国内用户若下载缓慢，可使用清华源加速：\n> `pip install sports_betting -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple`\n\n### 2. 安装图形界面 (可选)\n如果您已安装 Node.js v22.0.0+，可以安装包含 GUI 支持的版本：\n\n```bash\npip install sports_betting[gui]\n```\n\n### 3. 开发环境安装 (可选)\n如需贡献代码或进行开发，请使用 PDM 进行安装：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting.git\ncd sports-betting\npdm install\n```\n\n## 基本使用\n\n`sports-betting` 主要通过三个方式使用：GUI、Python API 和 CLI。推荐先熟悉 Python API，因为它是配置 CLI 和在 GUI 中加载自定义模型的基础。\n\n### 方式一：使用图形界面 (GUI)\n\n这是最直观的交互方式，适合快速上手和数据探索。\n\n1.  **启动应用**：\n    在终端运行以下命令：\n    ```bash\n    sportsbet-gui\n    ```\n2.  **主要功能**：\n    *   **数据管理**：上传、创建或更新数据加载器，处理历史数据和固定赛程数据。\n    *   **模型开发**：构建并测试投注模型，执行回测以识别“价值注单”（Value Bets）。\n    *   **引导助手**：内置机器人会提供操作指引。\n\n### 方式二：使用 Python API\n\n以下是两个最核心的使用场景示例。\n\n#### 场景 A：快速获取数据并简单回测\n\n```python\nfrom sportsbet.datasets import SoccerDataLoader\nfrom sportsbet.evaluation import ClassifierBettor, backtest\nfrom sklearn.dummy import DummyClassifier\n\n# 1. 初始化数据加载器 (例如意大利联赛 2020 年数据)\ndataloader = SoccerDataLoader(param_grid={'league': ['Italy'], 'year': [2020]})\n\n# 2. 提取训练数据 (历史数据) 和赛程数据 (待预测数据)\nX_train, Y_train, O_train = dataloader.extract_train_data(odds_type='market_maximum')\nX_fix, Y_fix, O_fix = dataloader.extract_fixtures_data()\n\n# 3. 创建简单的投注者模型并进行回测\nbettor = ClassifierBettor(DummyClassifier())\nbacktest(bettor, X_train, Y_train, O_train)\n\n# 4. 训练模型并预测未来的价值注单\nbettor.fit(X_train, Y_train)\nvalue_bets = bettor.bet(X_fix, O_fix)\n```\n\n#### 场景 B：配置完整的投注策略\n\n此示例展示了如何配置特定的联赛、交叉验证策略以及逻辑回归分类器。\n\n```python\n# 数据选择\nfrom sportsbet.datasets import SoccerDataLoader\n\nleagues = ['Germany', 'Italy', 'France']\ndivisions = [1, 2]\nyears = [2021, 2022, 2023, 2024]\nodds_type = 'market_maximum'\n\ndataloader = SoccerDataLoader({'league': leagues, 'year': years, 'division': divisions})\nX_train, Y_train, O_train = dataloader.extract_train_data(odds_type=odds_type)\nX_fix, _, O_fix = dataloader.extract_fixtures_data()\n\n# 策略配置\nfrom sklearn.model_selection import TimeSeriesSplit\nfrom sklearn.compose import make_column_transformer\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.multioutput import MultiOutputClassifier\nfrom sportsbet.evaluation import ClassifierBettor, backtest\n\n# 设置时间序列交叉验证\ntscv = TimeSeriesSplit(5)\n\n# 构建机器学习管道\nclassifier = make_pipeline(\n  make_column_transformer(\n    (OneHotEncoder(handle_unknown='ignore'), ['league', 'home_team', 'away_team']), remainder='passthrough'\n  ),\n  SimpleImputer(),\n  MultiOutputClassifier(LogisticRegression(solver='liblinear', random_state=7, class_weight='balanced', C=50)),\n)\n\n# 初始化投注者：设定初始资金、单笔注额及投注市场\nbettor = ClassifierBettor(\n    classifier, \n    betting_markets=['home_win__full_time_goals', 'draw__full_time_goals', 'away_win__full_time_goals'], \n    stake=50.0, \n    init_cash=10000.0\n)\n\n# 执行回测\nbacktesting_results = backtest(bettor, X_train, Y_train, O_train, cv=tscv)\n\n# 获取未来赛事的价值注单\nbettor.fit(X_train, Y_train)\nbettor.bet(X_fix, O_fix)\n```\n\n### 方式三：使用命令行 (CLI)\n\nCLI 适合自动化任务。使用前需创建一个 Python 配置文件（例如 `config.py`），定义 `DATALOADER_CLASS` 和 `PARAM_GRID` 等变量。\n\n常用命令示例：\n\n1.  **查看可用参数**：\n    ```bash\n    sportsbet dataloader params -c config.py\n    ```\n\n2.  **查看可用赔率类型**：\n    ```bash\n    sportsbet dataloader odds-types -c config.py\n    ```\n\n3.  **提取训练数据并保存为 CSV**：\n    ```bash\n    sportsbet dataloader training -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n    ```\n\n4.  **提取赛程数据并保存为 CSV**：\n    ```bash\n    sportsbet dataloader fixtures -c config.py -d \u002Fpath\u002Fto\u002Fdirectory\n    ```\n\n对于任何子命令，均可添加 `--help` 标志查看详细用法说明。","一位量化分析师正试图构建一个针对意甲联赛的自动化足球投注模型，以从历史数据中挖掘高价值下注机会。\n\n### 没有 sports-betting 时\n- **数据清洗繁琐**：需要手动编写大量爬虫代码抓取不同来源的比赛结果和赔率，并花费数天时间统一格式、处理缺失值。\n- **回测逻辑复杂**：自行构建回测框架极易出错，难以准确模拟真实市场下的最大赔率（market_maximum）变化及资金曲线。\n- **策略验证困难**：缺乏标准化的评估工具，无法快速对比不同机器学习算法在特定联赛或年份的表现差异。\n- **交互体验割裂**：开发过程完全依赖代码脚本，非技术背景的团队成员无法直观查看预测结果或调整参数。\n\n### 使用 sports-betting 后\n- **一键获取数据**：通过 `SoccerDataLoader` 直接下载整理好的意甲 2020 年历史数据与Fixture数据，自动完成特征工程预处理。\n- **标准化回测流程**：利用内置的 `ClassifierBettor` 和 `backtest` 函数，几行代码即可基于最大赔率完成策略性能验证。\n- **高效模型迭代**：支持灵活定义参数网格（如限定联赛和年份），快速测试多种分类器组合并识别价值注单（value bets）。\n- **可视化 GUI 协作**：启动 `sportsbet-gui` 即可通过图形界面上传数据、训练模型并查看预测图表，内置机器人还能提供操作指引。\n\nsports-betting 将原本需要数周的数据准备与框架搭建工作缩短至几小时，让开发者能专注于核心策略的优化而非重复造轮子。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fgeorgedouzas_sports-betting_70a4d7e1.png","georgedouzas","George Douzas","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fgeorgedouzas_c134355f.png","Physicist",null,"Athens","https:\u002F\u002Fgeorgedouzas.github.io\u002F","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas",[81,85],{"name":82,"color":83,"percentage":84},"Python","#3572A5",99.5,{"name":86,"color":87,"percentage":88},"JavaScript","#f1e05a",0.5,684,130,"2026-04-07T15:26:50","MIT","未说明","不需要",{"notes":96,"python":97,"dependencies":98},"该工具主要用于体育博彩数据的加载、回测和预测，基于 scikit-learn 构建。若需使用图形界面 (GUI)，必须安装 Node.js v22.0.0 或更高版本，并通过 `pip install sports_betting[gui]` 安装额外依赖。开发环境建议使用 PDM 进行依赖管理。","3.8+",[99,100,101],"scikit-learn","pandas","reflex (可选，用于 GUI)",[14],[64,104,99,105,106],"machine-learning","python","sports-analytics","2026-03-27T02:49:30.150509","2026-04-08T17:29:55.828429",[110,115,120,125,130,135,140],{"id":111,"question_zh":112,"answer_zh":113,"source_url":114},24794,"运行 sportsbet-gui 时出现 FileNotFoundError 或无法找到文件错误怎么办？","这通常是因为未创建 Python 虚拟环境或缺少 Node.js 依赖。首先确保已创建虚拟环境并安装项目。如果问题依旧，可能是系统无法自动找到 'reflex' 可执行文件。解决方法是手动修改源码：打开 `sportsbet\u002Fgui\u002Fmain.py` 文件，找到 `reflex_path = shutil.which(\"reflex\")` 这一行，将其替换为你电脑上 reflex.exe 的绝对路径（例如：`reflex_path = r\"C:\\Users\\你的用户名\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\reflex.exe\"`）。此外，请确保已安装 Node.js。","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fissues\u002F86",{"id":116,"question_zh":117,"answer_zh":118,"source_url":119},24795,"启动 GUI 时遇到 TypeError: parameter 1 is not of type 'Element' 错误如何解决？","这是由于依赖版本不兼容导致的。维护者已通过将 `reflex` 依赖降级至 0.7.0 版本修复了此问题。请尝试安装最新的 sports-betting 发布版（如 0.11.2 或更高），该版本已包含修复后的依赖配置。命令示例：`pip install --upgrade sports-betting`。","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fissues\u002F80",{"id":121,"question_zh":122,"answer_zh":123,"source_url":124},24796,"使用 DataLoader 获取赔率类型时返回空数组（Empty Odd Types）怎么办？","某些联赛（如墨西哥甲级联赛）可能主要只有收盘赔率（closing odds），而默认设置可能未包含这些数据。维护者已更新数据处理脚本，当缺少主要赔率时会自动包含收盘赔率。如果你遇到此问题，请确保拉取最新的数据文件或重新运行数据更新流程。对于特定联赛，检查是否处于休赛期也可能导致数据为空。","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fissues\u002F93",{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},24797,"运行 fixtures 命令时提示 \"Fixtures data were empty\" 是怎么回事？","这通常是因为后端的 Prefect 数据流未及时更新数据。解决方法是重新部署（redeploy）Prefect 数据流以触发数据更新。如果问题持续，请检查你的参数配置（如联赛、年份）是否正确，并确保网络连接正常以便抓取最新数据。","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fissues\u002F67",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},24798,"安装或设置时出现 \"FileNotFoundError: ... _version.py\" 错误怎么办？","这表明你正在使用的代码包可能处于开发中断状态或版本过旧。请直接使用最新的正式发行版（latest release），不要直接从主分支克隆代码进行安装，除非你知道如何构建版本文件。运行 `pip install --upgrade sports-betting` 获取稳定版本。","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fissues\u002F1",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},24799,"在 Windows 上安装后无法启动 GUI 且报错找不到节点或文件，需要做什么前置检查？","在 Windows 上运行前，请务必先创建 Python 虚拟环境（virtual environment）并在其中安装依赖。此外，该工具依赖 Node.js 运行前端部分，请确保系统已安装 Node.js 并且其路径已添加到环境变量中，以便子进程能调用 `node --version`。如果未安装虚拟环境或直接在全局环境中运行，极易引发路径查找错误。","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fissues\u002F89",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},24800,"提取训练数据时返回空结果（empty array），即使代码看似正确？","如果代码逻辑无误但返回空数据，可能是因为所选联赛在指定年份没有比赛数据，或者数据源暂时不可用。首先检查 `SoccerDataLoader.get_all_params()` 确认你选择的联赛和年份是否有可用参数。其次，确保使用的是最新版本的库，因为旧版本可能存在数据加载逻辑的缺陷。如果问题集中在特定联赛，可能是该联赛数据尚未被处理或收录。","https:\u002F\u002Fgithub.com\u002Fgeorgedouzas\u002Fsports-betting\u002Fissues\u002F79",[]]