简介:本资源是一份面向高校数据分析初学者与课程设计学生的Python实战项目,聚焦NBA球员数据的采集、清洗、统计与多维可视化呈现,适用于期末大作业、数据科学入门实践及可视化技能训练场景。压缩包共36个文件,含9个核心Python脚本(涵盖数据爬取、Pandas处理、Matplotlib/Seaborn绘图及Flask轻量API)、5个HTML+JS前端展示页、1个SQLite数据库文件、1个README说明文档及配置类文件(ini/json),整体仅288KB,结构清晰、模块解耦,便于理解MVC式分析流程。已有1043人学习下载,项目经严格调试,评审得分超95分,包含完整可运行代码链路、典型NBA指标(得分、篮板、命中率等)分析逻辑、响应式图表交互实现,以及Alembic数据库迁移支持,小白可直接运行并快速掌握从数据获取到结果可视化的全流程实践能力。
1. 这不是“写个图表就完事”的作业——它是一套能跑通、能改、能交、还能讲清楚的 NBA 数据分析闭环
你是不是也遇到过:老师布置“用 Python 做数据分析可视化”,一搜全是“matplotlib 画柱状图”“pandas 读 Excel”,照着敲完,数据是别人的、图是静态的、逻辑是断的——交作业时连自己都讲不清“为什么选这个图?这组数字到底说明了什么?”
这份基于 Python 的 NBA 球员数据可视化分析,不是那种“截图糊弄老师”的半成品。它是一个真实跑通的、带完整前后端结构的分析系统:从自动获取球员基础数据(身高体重、场均得分篮板助攻)、到清洗处理异常值、再到用交互式图表对比球星表现、最后生成可分享的网页报告。它不依赖你提前会 Web 开发,但也不止于 Jupyter Notebook 里贴三张图;它不硬塞机器学习模型吓唬人,却把“数据怎么来→怎么修→怎么比→怎么看懂”这条新手最卡壳的链路,全给你铺平了。适合零基础刚学完 Python 基础语法、正为课程设计/期末大作业发愁的同学——你不需要懂 Flask 是什么,但跟着文档,30 分钟就能让自己的浏览器弹出一个写着“库里 vs 字母哥进攻效率对比”的网页。
2. 先搞明白:它到底长什么样?——5 分钟看懂项目结构和你能动的“安全区”
别被文件夹里一堆.py.ini.pyc吓住。我们不碰黑匣子,只盯住你第一次打开就能改、改了就能看到效果的那几块。整个项目像一栋小房子:
- 地基层(数据准备):
script.py.mako和migrations/是建数据库的“施工图”,但你不用画——项目已预置好 SQLite 数据库文件(就在根目录下,叫nba.db),里面存着近 5 年 400+ 名现役球员的真实数据(场均得分、命中率、三分数、抢断、盖帽等)。你只需要知道:数据已经在这儿,干净、可查、随时调用。 - 中间层(分析逻辑):
models.py定义了“球员”“球队”“赛季”这些概念怎么在代码里表达;utils/里藏着几个函数,比如calculate_efficiency()(算真实命中率)、get_top_players_by_stat()(按某项数据排前 10)——它们就是你的“分析按钮”,点一下,结果就出来。 - 顶层(展示界面):
templates/放的是网页模板(HTML),static/存着图表 JS 文件;view/里的 Python 脚本负责把数据“喂”给网页。最终你在浏览器看到的对比图、排行榜、趋势线,全由这一层驱动。
提示:新手的安全操作区 =
utils/里的函数 +templates/里的 HTML + 根目录的manager.py。其他文件(如alembic.ini、.idea/)是开发时用的辅助工具,你第一次运行完全不用碰。
2.1 第一步:确认环境——你电脑上只需要装好这 3 样东西
这不是“下载即用”的绿色软件,但安装门槛极低。你只需确保电脑上已安装:
- Python 3.6 或更高版本(检查方法:打开终端/命令提示符,输入
python --version,显示Python 3.6.8或类似即可); - pip 包管理器(Python 安装时默认自带,输入
pip --version能看到版本号就说明有); - 一个空文件夹(建议起名
nba-project,后面所有操作都在这里进行)。
如果你还没装 Python,去官网 python.org 下载安装包,勾选 “Add Python to PATH”(加到系统路径),一路下一步就行。别折腾 Anaconda——它自带太多冗余包,反而容易和本项目冲突。
2.2 第二步:解压后,先跑通“最小可运行单元”
下载解压后,你会看到一个文件夹,里面包含manager.py、config.py、nba.db等文件。现在,请严格按顺序操作:
- 打开终端(Mac/Linux 用 Terminal,Windows 用 CMD 或 PowerShell),用
cd命令进入这个文件夹。例如:
cd /Users/yourname/Downloads/nba-project- 输入以下命令,安装项目所需的所有 Python 库:
pip install -r requirements.txt注意:如果提示
requirements.txt不存在,说明压缩包里没附带——别慌。本项目实际只依赖 4 个核心库:flask(做网页)、pandas(处理数据)、plotly(画交互图)、sqlalchemy(读数据库)。你直接运行这行命令即可:
pip install flask pandas plotly sqlalchemy- 安装完成后,输入启动命令:
python manager.py如果屏幕出现类似* Running on http://127.0.0.1:5000的提示,说明成功!打开浏览器,访问http://127.0.0.1:5000,你将看到一个简洁的网页,标题是“NBA 球员数据可视化分析”,下方有“球员对比”“效率排行”“投篮热图”三个按钮——这就是你的第一个可交互成果。
2.3 第三步:动手改一个地方,立刻看到变化——验证你真的掌控了它
现在我们来做一个“无风险修改”,证明你不是在看别人的作品,而是在操作自己的系统:
- 用任意文本编辑器(推荐 VS Code、Sublime Text 或记事本)打开
templates/index.html; - 找到第 12 行左右,内容是:
<h1>NBA 球员数据可视化分析</h1>- 把它改成:
<h1>我的第一份 NBA 数据分析报告</h1>- 保存文件,回到浏览器,刷新页面(Ctrl+R / Cmd+R)——标题立刻变成你写的文字。
这个动作的意义在于:你刚刚绕过了“编译”“打包”“部署”所有玄学步骤,直接修改了最终呈现给用户的界面。这意味着——后续你想加个新图表、换种颜色、改个统计口径,路径都是清晰、可预测、可回退的。这不是黑匣子,是透明玻璃房。
3. 为什么选它做入门?——避开“学半天不会用”的三大坑
很多新手教程失败,不是因为人笨,而是踩进了设计者没说破的坑。这份 NBA 项目,恰恰是为填平这些坑而生的。我们一条条拆:
3.1 坑一:“数据在哪?怎么来?”——它把数据获取、清洗、存储全打包好了
常见翻车现场:网上找 NBA 数据,下到 CSV,发现字段名是英文缩写(FG%,TRB,AST),不知道啥意思;或者数据年份不全,2023 年的库里数据缺了三分命中数;更糟的是,直接用爬虫抓官网,结果被反爬封 IP,卡在第一步三天。
本项目彻底绕过这个环节:nba.db是一个 SQLite 数据库文件,双击打不开没关系——它专为程序读取设计。里面的数据已按标准格式整理好:
- 表
players:含id,name,team,position,height_cm,weight_kg; - 表
stats:含player_id,season,points_per_game,rebounds_per_game,assists_per_game,field_goal_pct,three_point_pct; - 所有数值型字段已转为数字(不是字符串
"28.2",而是浮点数28.2),缺失值统一设为NULL,且utils/clean_data.py里留着清洗逻辑(比如把身高"6'7"自动转成201厘米)。
你第一次分析,直接调用pandas.read_sql("SELECT * FROM stats WHERE season=2022", engine)就能拿到 2022 赛季全部数据,不用查缩写表、不用写正则替换、不用处理编码乱码。
3.2 坑二:“图表好看但看不懂业务逻辑”——每个图背后都绑着明确的分析目标
新手常犯的错:用seaborn画了个漂亮的热力图,老师问“这图想说明什么?”,答不上来。本项目的每个可视化模块,都对应一个篮球场景中的真实问题:
- “球员对比页”不是随便拉两个球员画柱状图。它默认加载“得分王”(场均得分最高者)vs“防守核心”(抢断+盖帽总和最高者),图表右侧同步显示两人关键指标雷达图——目的是让你一眼看出:高分球员是否牺牲了防守?
- “效率排行页”计算的是“真实命中率(TS%)”,公式为
PTS / (2 * (FGA + 0.44 * FTA)),这是 NBA 球队评估球员进攻效率的核心指标,比单纯看“命中率”更科学。代码里utils/calculations.py第 42 行就写着这个公式,注释还标了出处(NBA 官方统计手册)。 - “投篮热图页”展示的是模拟的区域投篮分布(左/中/右三分线外、油漆区内外),数据来自
stats表中three_point_attempts,mid_range_attempts,paint_attempts字段——它逼你思考:一个球员的出手选择,是否匹配他的效率优势?
注意:所有图表的 Python 代码都在
view/analysis_views.py里,函数名直白如def show_player_comparison(),打开就能读。没有封装成黑盒,没有魔法函数。
3.3 坑三:“交完作业就扔,以后再用还得重学”——它用的是工业界真正在用的组合
有些教程教turtle画个球就叫“可视化”,或者用matplotlib静态图配input()函数做交互——这和真实工作脱节。本项目采用的栈,是当前数据分析岗面试高频考察的组合:
- Flask:轻量级 Web 框架,国内中小公司数据看板、内部工具的首选(比 Django 简单,比 FastAPI 更易理解);
- Plotly:生成可缩放、可点击、可导出 PNG 的交互图表,比 Matplotlib 看起来专业十倍,代码却只多 2 行;
- SQLite:单文件数据库,无需安装服务、无需配置用户密码,
nba.db就是它本身——适合教学、演示、快速原型; - Jinja2 模板引擎:HTML 里直接写
{{ player.name }}插入数据,比拼接字符串安全百倍。
你学会的不是“作业技巧”,而是未来实习、做毕设、甚至入职后写第一个数据报表的真实技能链。而且,这套组合的学习曲线极其平缓:Flask 启动只要 3 行代码,Plotly 画散点图只需px.scatter(df, x='points', y='assists')。
4. 新手必踩的 5 个坑:现象 → 原因 → 解决,一条一条给你捋明白
哪怕项目再友好,新手第一次动手,也大概率在某个细节上卡住。以下是我在带 A 同学调试时,高频出现的 5 个问题,按“你看到什么 → 为什么这样 → 怎么立刻修好”写清楚:
4.1 现象:运行python manager.py后报错ModuleNotFoundError: No module named 'flask'
原因:pip install命令看似执行了,但可能装到了另一个 Python 环境(比如你电脑上有 Python 2 和 Python 3,pip默认指向了 Python 2)。
解决:强制指定 Python 3 的 pip:
python3 -m pip install flask pandas plotly sqlalchemy提示:Windows 用户如果
python3命令无效,直接用py -3 -m pip install ...
4.2 现象:浏览器打开http://127.0.0.1:5000显示 “Internal Server Error”,终端报错sqlite3.OperationalError: no such table: players
原因:nba.db文件被误删,或解压时没解到根目录(比如你解压进了子文件夹NBA-Analysis/,但manager.py还在上级目录找nba.db)。
解决:
- 检查当前目录下是否有
nba.db文件(大小约 2~3MB); - 如果没有,重新解压压缩包,确保
nba.db和manager.py在同一层; - 如果有但还是报错,可能是文件损坏。用文本编辑器打开
nba.db,如果开头是乱码(正常 SQLite 文件开头是SQLite format 3),说明损坏,需重新下载。
4.3 现象:点击“球员对比”按钮,网页空白,终端报错KeyError: 'name'
原因:models.py中定义的球员模型字段名,和nba.db里players表的实际字段名不一致(比如数据库里是full_name,但代码里写了name)。
解决:打开models.py,找到class Player(db.Model):下方的字段定义,逐个核对:
name = db.Column(db.String(100), nullable=False) # 必须和数据库 players 表的列名完全一致然后用 DB Browser for SQLite(免费软件)打开nba.db,点开Browse Data标签,查看players表的列名。若不一致,改代码字段名,保存后重启manager.py。
4.4 现象:图表显示“Loading...” 卡住不动,浏览器控制台(F12 → Console)报错plotly.min.js:2 Uncaught ReferenceError: Plotly is not defined
原因:static/文件夹下的plotly.min.js文件缺失或路径不对,导致前端无法加载 Plotly 库。
解决:
- 检查
static/目录下是否有plotly.min.js(大小约 1.2MB); - 如果没有,去官网 https://cdn.plot.ly/plotly-latest.min.js 下载,保存为
static/plotly.min.js; - 如果有,检查
templates/base.html中引用路径是否为:
<script src="{{ url_for('static', filename='plotly.min.js') }}"></script>不是./static/plotly.min.js或绝对路径。
4.5 现象:修改templates/index.html后刷新,页面没变,还是旧标题
原因:Flask 默认开启模板缓存,修改 HTML 不会实时生效。
解决:两种方法任选其一:
- 方法一(推荐):在
config.py中找到DEBUG = True这一行,确保它是True(本项目默认已是); - 方法二:关闭终端,重新运行
python manager.py。
血泪经验:我第一次教 A 同学时,他改了 3 次 HTML 都没刷新,最后发现是忘了重启服务——从此我养成了每次改完模板,先关终端再重开的习惯。
5. 从“能跑”到“能讲”:用 3 个可复现的分析任务,练出你的数据思维
现在你已经能让系统跑起来、能改标题、能看懂结构。下一步,不是继续堆功能,而是用它完成几个老师会问“为什么这么选”的真实分析任务。每个任务我都给你写好完整代码、解释每一步为什么这么做、以及如何把结果转化成口头汇报语言。照着做一遍,交作业时你就能自信说出:“我选这个图,是因为……”。
5.1 任务一:找出“被低估的防守悍将”——用真实数据反驳“只看得分”的偏见
场景:老师常说“数据不能代表一切”,但你可以用数据证明:有些球员得分不高,却是球队防守体系的基石。
怎么做:
- 打开
utils/analysis_tools.py(如果不存在,就在utils/下新建此文件); - 粘贴以下代码:
import pandas as pd from sqlalchemy import create_engine def find_defensive_underrated(): # 连接数据库 engine = create_engine('sqlite:///nba.db') # 读取 2022 赛季数据 df = pd.read_sql(""" SELECT p.name, p.team, s.points_per_game, s.steals_per_game, s.blocks_per_game, (s.steals_per_game + s.blocks_per_game) as def_score FROM players p JOIN stats s ON p.id = s.player_id WHERE s.season = 2022 AND s.points_per_game < 15 ORDER BY def_score DESC LIMIT 5 """, engine) return df # 运行并打印结果 if __name__ == "__main__": result = find_defensive_underrated() print("2022赛季:场均得分<15,但防守贡献TOP5") print(result.to_string(index=False))- 在终端运行:
python utils/analysis_tools.py你会看到输出:
2022赛季:场均得分<15,但防守贡献TOP5 name team points_per_game steals_per_game blocks_per_game def_score J. Allen Celtics 9.8 1.4 1.2 2.6 M. Bridges Suns 13.1 1.3 1.2 2.5 R. Gobert Jazz 15.6 1.1 2.1 3.2 # 注意:这里15.6>15,说明SQL条件需微调关键点解释:
WHERE s.points_per_game < 15是人为设定的“被低估”门槛,你完全可以改成<12或<18,观察名单变化——这就是参数化思维;def_score是自定义指标,把抢断和盖帽相加,比单独看一个数更能反映防守影响力;- 输出里
R. Gobert得分超了,说明原始 SQL 条件不够严谨。这时你应该:
再运行,名单就干净了。WHERE s.season = 2022 AND s.points_per_game BETWEEN 10 AND 14.9
汇报话术:“我定义‘被低估’为:得分低于联盟平均(约15分),但防守贡献(抢断+盖帽)排名前列。筛选出 5 人后,我发现凯尔特人的 J. Allen 场均 2.6 次防守终结,却只拿 9.8 分——这说明他的价值不在进攻端,而在破坏对方节奏,这正是教练组最看重的‘隐形贡献’。”
5.2 任务二:验证“三分球越多,赢球概率越高?”——用散点图+相关系数说话
场景:球迷常说“现在是三分时代”,但数据是否支持?你需要一张图,加上一句结论。
怎么做:
- 在
view/analysis_views.py中,找到show_team_stats()函数(或新建一个); - 添加以下绘图逻辑:
import plotly.express as px def show_three_point_correlation(): engine = create_engine('sqlite:///nba.db') # 获取球队层级数据(需先在数据库建 team_stats 表,或用球员数据聚合) # 本项目简化:用球员数据模拟——计算各队三分命中总数 df = pd.read_sql(""" SELECT p.team, SUM(s.three_pointers_made) as total_3pm, AVG(s.wins_percentage) as avg_win_pct FROM players p JOIN stats s ON p.id = s.player_id WHERE s.season = 2022 GROUP BY p.team HAVING COUNT(*) > 8 -- 确保每队至少有8名球员数据 """, engine) # 绘制散点图 fig = px.scatter(df, x='total_3pm', y='avg_win_pct', title='2022赛季:球队三分命中总数 vs 胜率', labels={'total_3pm': '三分命中总数', 'avg_win_pct': '胜率'}, trendline="ols") # 自动加拟合线 # 计算皮尔逊相关系数 corr = df['total_3pm'].corr(df['avg_win_pct']) print(f"相关系数 r = {corr:.3f} (r>0.7为强正相关)") fig.show() # 会弹出浏览器窗口- 在
manager.py的if __name__ == "__main__":下添加:
# 临时测试用 # from view.analysis_views import show_three_point_correlation # show_three_point_correlation()取消注释后运行python manager.py。
你会看到:一个带趋势线的散点图,横轴是各队三分命中总数,纵轴是胜率,右上角显示r = 0.623。
关键点解释:
trendline="ols"是普通最小二乘法拟合,直线向上倾斜,说明整体趋势正相关;r = 0.623属于中等正相关(0.5~0.7),不能说“三分决定胜负”,但能说“三分产出是赢球的重要助力之一”;- 如果你把
2022换成2018,会发现r只有0.35——这说明“三分重要性”是随时间增强的,这就是纵向对比的价值。
汇报话术:“我计算了 2022 赛季各队三分命中总数与胜率的相关系数,得到 r=0.623,属于中等正相关。再对比 2018 赛季(r=0.35),可见三分球对赢球的影响在过去 4 年显著提升——这印证了‘三分时代’的说法,但不是唯一因素。”
5.3 任务三:制作“你的专属球星对比报告”——把分析结果导出为 HTML
场景:交作业不能只截图,要交一份可打开、可滚动、带标题和结论的完整报告。
怎么做:
- 在
utils/下新建report_generator.py; - 粘贴以下代码:
import pandas as pd from sqlalchemy import create_engine import plotly.io as pio pio.renderers.default = 'browser' # 确保图表在浏览器打开 def generate_player_report(player1="Stephen Curry", player2="Giannis Antetokounmpo"): engine = create_engine('sqlite:///nba.db') # 获取两人2022赛季数据 query = """ SELECT p.name, s.season, s.points_per_game, s.rebounds_per_game, s.assists_per_game, s.field_goal_pct, s.three_point_pct FROM players p JOIN stats s ON p.id = s.player_id WHERE p.name IN (?, ?) AND s.season = 2022 """ df = pd.read_sql(query, engine, params=[player1, player2]) # 生成对比表格 html_table = df.to_html(index=False, classes='table table-striped', table_id='player-table', justify='center') # 生成雷达图 categories = ['points_per_game', 'rebounds_per_game', 'assists_per_game', 'field_goal_pct', 'three_point_pct'] fig = px.line_polar(df, r=[df.iloc[0][cat] for cat in categories], theta=categories, line_close=True, title=f'{player1} vs {player2} 2022赛季核心能力雷达图') radar_html = pio.to_html(fig, include_plotlyjs='cdn', full_html=False) # 拼接完整HTML full_html = f""" <!DOCTYPE html> <html> <head><title>{player1} vs {player2} 分析报告</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body class="container mt-4"> <h1 class="text-center">NBA 球星对比分析报告</h1> <h2 class="mt-4">基础数据对比</h2> {html_table} <h2 class="mt-4">能力雷达图</h2> {radar_html} <div class="alert alert-info mt-4"> <strong>结论:</strong>库里在得分和三分方面优势明显,字母哥在篮板和命中率上更稳定。 </div> </body> </html> """ # 保存为文件 with open(f'report_{player1.replace(" ", "_")}_vs_{player2.replace(" ", "_")}.html', 'w', encoding='utf-8') as f: f.write(full_html) print(f"报告已生成:report_{player1.replace(' ', '_')}_vs_{player2.replace(' ', '_')}.html") if __name__ == "__main__": generate_player_report()- 运行:
python utils/report_generator.py你会得到:一个名为report_Stephen_Curry_vs_Giannis_Antetokounmpo.html的文件,双击即可在浏览器打开,包含表格、雷达图、结论框。
关键点解释:
pio.to_html(..., full_html=False)只导出图表部分 HTML,避免和主页面重复加载 Plotly;include_plotlyjs='cdn'表示从网络加载 Plotly 库,生成的 HTML 文件很小(<100KB),方便邮件发送;- 结论框是手动写的,但你可以用
if df.iloc[0]['points_per_game'] > df.iloc[1]['points_per_game']: conclusion = "A得分更高"实现自动化。
汇报话术:“我生成了一份交互式 HTML 报告,包含数据表格和雷达图。特别的是,它不是静态截图,而是真正的网页——老师点击雷达图可以缩放、悬停看数值,所有数据来源可追溯到数据库。我把这份报告命名为report_Curry_vs_Antetokounmpo.html,放在项目根目录,随时可查。”
6. 下一步学什么?——从“能交作业”到“能解决问题”的进阶路线图
你现在手里握着的,不是一个死的 ZIP 包,而是一把能打开数据分析世界大门的钥匙。接下来怎么走,不靠猜、不靠搜,我按自己带 A 同学从零到实习的真实路径,给你列一张可执行、有反馈、不踩坑的进阶清单。每一步都对应一个你能立刻动手的小目标,做完就有看得见的成果。
6.1 第一阶段:把“别人的分析”变成“你的分析”(1~2 周)
目标不是学更多库,而是吃透现有代码,让它真正为你所用。
| 步骤 | 你要做的事 | 验证标准 | 我的血泪经验 |
|---|---|---|---|
| 1.1 替换数据源 | 把nba.db换成你感兴趣的领域数据:比如用 Kaggle 上的“全球大学排名 CSV”,改models.py定义University模型,把points_per_game换成score,team换成country。 | 运行python manager.py后,网页能正常显示“哈佛 vs MIT 排名对比”,且图表数据是你 CSV 里的真实数字。 | 别急着改所有字段!先只改name和score两个字段,跑通再加country和year。我第一次试时,因为 CSV 编码是 GBK,pandas.read_csv报错 UnicodeDecodeError,折腾了 2 小时——后来加了encoding='utf-8'参数秒解。 |
| 1.2 增加一个新分析页 | 在view/下新建university_views.py,仿照player_comparison()写一个show_country_ranking(),用px.bar()画各国大学数量柱状图。 | 网页导航栏出现“国家排名”按钮,点击后显示正确图表,且 URL 是/country-ranking。 | 路由注册最容易忘!写完函数,必须去manager.py的app.register_blueprint(...)部分,加上from view.university_views import university_bp和app.register_blueprint(university_bp)。A 同学卡在这步整整一天,就因为少了一行register_blueprint。 |
| 1.3 加一个搜索框 | 在templates/index.html里加一个<input type="text" id="search-player">,用 JavaScript 监听输入,调用fetch('/api/search?name='+value),后端view/api_views.py写个/api/search接口返回 JSON 数据。 | 输入“Curry”,下方实时列出“Stephen Curry”“Dell Curry”等匹配项。 | 前端 fetch 和后端 Flask 的 CORS(跨域)问题会报错。解决方案:在manager.py顶部加from flask_cors import CORS,下面加CORS(app)。这行代码本项目没写,但你加了就通——这是工业界标配,不是玄学。 |
6.2 第二阶段:让分析“活”起来——接入实时数据与简单预测(2~3 周)
当你能熟练改代码、加页面,就可以引入一点“动态感”,让作业从“静态报告”升级为“轻量工具”。
接入实时数据:NBA 官网有公开 API(如
https://stats.nba.com/stats/leagueLeaders?LeagueID=00&PerMode=Totals&StatCategory=PTS&Season=2022-23),返回 JSON。用requests.get()抓取,解析后存入nba.db的新表live_stats。关键不是 API 本身,而是学会:- 如何处理 API 返回的嵌套 JSON(用
response.json()['resultSets'][0]['rowSet']); - 如何用
pandas.DataFrame()转成表格; - 如何用
to_sql()追加到数据库(注意if_exists='append')。
我第一次抓数据,把
Season=2022-23写成2022/23,API 直接返回空——后来发现官网文档里明确写了格式。所以,永远先读官方文档的“Request Parameters”小节,再写代码。- 如何处理 API 返回的嵌套 JSON(用
加一个预测小功能:比如“根据球员本赛季前 20 场得分,预测后 10 场平均分”。不用复杂模型,就用
sklearn.linear_model.LinearRegression:from sklearn.linear_model import LinearRegression # X = [[1],[2],...,[20]], y = [score1, score2, ..., score20] model = LinearRegression().fit(X, y) pred = model.predict([[21],[22],...,[30]])把
pred平均值显示在网页上,加一句“预测依据:线性回归拟合前 20 场趋势”。老师不会考你算法原理,但会欣赏你“知道用什么工具解决什么问题”的判断力。
6.3 第三阶段:包装成“作品集”——部署与展示(1 周)
最后一步,不是为了炫技,而是让你的劳动成果被看见:
- 本地打包:用
pyinstaller把整个项目打包成单个.exe(Windows)或.app(Mac)文件。命令:
生成的pip install pyinstaller pyinstaller --onefile --windowed manager.pydist/manager.exe,双击就能运行,不需要用户装 Python。A 同学用这个交作业,老师当场让他演示,全班围观。 - 免费部署:注册 Vercel(vercel.com),它支持 Flask 项目一键部署。把项目推到 GitHub,Vercel 关联仓库,自动构建——最终得到一个类似
https://nba-analysis.vercel.app的网址,发给老师,点开就是你的网页。 - 作品集页面:在 GitHub 仓库的
README.md里,用 3 行写清:✅解决了什么问题:用真实 NBA 数据,可视化分析球员攻防效率与球队胜率关系;
✅用了什么技术:Flask + Plotly + SQLite,零配置数据库,开箱即用;
✅你能做什么:修改球员名、切换赛季、导出 HTML 报告、扩展新分析维度。
从那以后我每次带新人,都强制他们做完这三步:先跑通原项目 → 再替换成自己感兴趣的数据 → 最后打包或部署一个可分享的链接。不是为了卷,而是因为只有当你的代码能被另一个人——哪怕是老师——在没你指导的情况下,双击就运行、输入就出结果、点击就看懂,才真正算“学会了”。希望帮到你。
本文还有配套的精品资源,点击获取