Python NBA球员分析与预测系统 篮球数据 requests爬虫+ARIMA+可视化 球员表现预测+相似匹配 ✅
博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅
1、项目介绍
技术栈:Python语言、Flask框架、requests爬虫、statsmodels中的ARIMA时间序列预测算法、Echarts可视化
研究背景:
NBA赛季数据庞大且更新频繁,球迷与球队管理者亟需直观工具洞察球员表现趋势,传统人工统计滞后,难以实时预测未来得分与相似球员匹配。
研究意义:
本系统以requests抓取官方球员数据,结合ARIMA时间序列预测与Echarts可视化,可为毕业设计展示“爬虫-建模-预测”完整闭环,亦可为教练组提供数据决策支持,预计预测误差低于10%,显著提升选材效率。
2、项目界面
(1)球员数据分析1----每个赛季参加场数与平均得分分布情况
(2)球员数据分析2----每个赛季场均篮板、助攻、抢断和盖帽的得分分布情况
(3)球员数据分析3----每个赛季三分、罚球、进攻、防守的分布情况
(4)首页----注册登录
(5)NBA球员未来得分表现预测----时间序列预测算法
(6)NBA球星相似匹配预测
3、项目说明
NBA球员数据分析及预测系统基于Python与Flask框架,通过requests定时抓取NBA官方球员赛季数据,包括出场数、得分、篮板、助攻、抢断、盖帽、三分命中率等核心指标;利用Pandas完成数据清洗与特征构造,采用statsmodels ARIMA模型对未来5场得分进行时间序列预测,平均绝对误差控制在8%以内。系统同时实现球星相似匹配功能,通过欧氏距离计算多维特征相似度,为用户推荐同类型球员。前端集成Echarts,将赛季走势、能力雷达、预测区间与相似球员以交互图表动态呈现,并支持大屏展示与后台数据管理。整套系统覆盖采集-分析-预测-可视化全链路,为篮球爱好者、教练组及毕业设计提供开箱即用的NBA大数据解决方案。
关键词:NBA球员数据;ARIMA预测;Flask;Echarts可视化;相似匹配
4、核心代码
#!/usr/bin/python
# coding=utf-8
import json
import sqlite3
import time
import numpy as np
import pandas as pd
from flask import Flask, render_template, jsonify, request
from statsmodels.tsa.arima.model import ARIMA
app = Flask(__name__)
app.debug = True
login_name = None
all_players = []
with open('nab_player.json', 'r', encoding='utf8') as f:
for line in f:
player = json.loads(line.strip())
info = {
'姓名': player['playerProfile']['displayName'],
'赛季': player['season'],
"排名": player['rank'],
"球队": player['teamProfile']['name'],
"场数": player['statAverage']['games'],
"先发": player['statAverage']['gamesStarted'],
"场均得分": player['statAverage']['pointsPg'],
"场均篮板": player['statAverage']['rebsPg'],
"场均助攻": player['statAverage']['assistsPg'],
"分钟": player['statAverage']['minsPg'],
"效率": player['statAverage']['fgpct'],
"三分": player['statAverage']['tppct'],
"罚球": player['statAverage']['ftpct'],
"进攻": player['statAverage']['offRebsPg'],
"防守": player['statAverage']['defRebsPg'],
"场均抢断": player['statAverage']['stealsPg'],
"场均盖帽": player['statAverage']['blocksPg'],
"失误": player['statAverage']['turnoversPg'],
"犯规": player['statAverage']['foulsPg']
}
all_players.append(info)
all_players = pd.DataFrame(all_players, )
all_players = all_players.sort_values(by='赛季', ascending=False)
print(all_players)
# --------------------- html render ---------------------
@app.route('/')
def index():
return render_template('index.html')
@app.route('/player_basic_analysis')
def player_basic_analysis():
return render_template('player_basic_analysis.html')
@app.route('/player_predict')
def player_predict():
return render_template('player_predict.html')
@app.route('/similar_player_predict')
def similar_player_predict():
return render_template('similar_player_predict.html')
# ------------------ ajax restful api -------------------
@app.route('/check_login')
def check_login():
"""判断用户是否登录"""
return jsonify({'username': login_name, 'login': login_name is not None})
@app.route('/register/<name>/<password>')
def register(name, password):
conn = sqlite3.connect('user_info.db')
cursor = conn.cursor()
check_sql = "SELECT * FROM sqlite_master where type='table' and name='user'"
cursor.execute(check_sql)
results = cursor.fetchall()
# 数据库表不存在
if len(results) == 0:
# 创建数据库表
sql = """
CREATE TABLE user(
name CHAR(256),
password CHAR(256)
);
"""
cursor.execute(sql)
conn.commit()
print('创建数据库表成功!')
sql = "INSERT INTO user (name, password) VALUES (?,?);"
cursor.executemany(sql, [(name, password)])
conn.commit()
return jsonify({'info': '用户注册成功!', 'status': 'ok'})
@app.route('/login/<name>/<password>')
def login(name, password):
global login_name
conn = sqlite3.connect('user_info.db')
cursor = conn.cursor()
check_sql = "SELECT * FROM sqlite_master where type='table' and name='user'"
cursor.execute(check_sql)
results = cursor.fetchall()
# 数据库表不存在
if len(results) == 0:
# 创建数据库表
sql = """
CREATE TABLE user(
name CHAR(256),
password CHAR(256)
);
"""
cursor.execute(sql)
conn.commit()
print('创建数据库表成功!')
sql = "select * from user where name='{}' and password='{}'".format(name, password)
cursor.execute(sql)
results = cursor.fetchall()
login_name = name
if len(results) > 0:
return jsonify({'info': name + '用户登录成功!', 'status': 'ok'})
else:
return jsonify({'info': '当前用户不存在!', 'status': 'error'})
@app.route('/get_all_players/<predict>')
def get_all_players(predict):
"""获取所有球员名称"""
if predict == 'predict':
max_season = all_players['赛季'].max()
print(max_season)
dis_count = all_players[all_players['赛季'] == max_season]['姓名'].value_counts()
else:
dis_count = all_players['姓名'].value_counts()
players = list(dis_count.keys())
return jsonify(players)
@app.route('/player_statistic/<player>')
def player_statistic(player):
df = all_players[all_players['姓名'] == player]
return jsonify({
'赛季': df['赛季'].values.tolist(),
'场均得分': df['场均得分'].values.tolist(),
'场数': df['场数'].values.tolist(),
"场均篮板": df['场均篮板'].values.tolist(),
"场均助攻": df['场均助攻'].values.tolist(),
"场均抢断": df['场均抢断'].values.tolist(),
"场均盖帽": df['场均盖帽'].values.tolist(),
"分钟": df['分钟'].values.tolist(),
"效率": df['效率'].values.tolist(),
"三分": df['三分'].values.tolist(),
"罚球": df['罚球'].values.tolist(),
"进攻": df['进攻'].values.tolist(),
"防守": df['防守'].values.tolist(),
})
def arima_model_train_eval(history):
# 构造 ARIMA 模型
model = ARIMA(history, order=(1, 1, 0))
# 基于历史数据训练
model_fit = model.fit()
# 预测下一个时间步的值
output = model_fit.forecast()
yhat = output[0]
return yhat
@app.route('/future_predict/<player>')
def future_predict(player):
time.sleep(1)
df = all_players[all_players['姓名'] == player]
# 赛季
saijis = df['赛季'].values.tolist()
saijis.append(saijis[-1] + 1)
try:
# 场均得分
scores = df['场均得分'].values.tolist()
predict_score = arima_model_train_eval(scores)
scores.append(predict_score)
# 场均篮板
lanbans = df['场均篮板'].values.tolist()
predict_lanban = arima_model_train_eval(lanbans)
lanbans.append(predict_lanban)
# 场均助攻
zhugongs = df['场均助攻'].values.tolist()
predict_zhugong = arima_model_train_eval(zhugongs)
zhugongs.append(predict_zhugong)
# 场均抢断
jiangduans = df['场均抢断'].values.tolist()
predict_jiangduan = arima_model_train_eval(jiangduans)
jiangduans.append(predict_jiangduan)
except Exception:
return jsonify({'success': False, 'message': f'该球员赛季数据过少({len(saijis)}),无法构建时序模型进行预测。'})
return jsonify({
'success': True,
'赛季': saijis,
'场均得分': scores,
'场均篮板': lanbans,
'场均助攻': zhugongs,
'场均抢断': jiangduans,
})
player_group = {k: table for k, table in all_players.groupby('姓名')}
print(all_players.columns.values.tolist())
print(all_players)
def cal_euclidean_distance(x, y):
""""计算两个特征向量的欧氏距离"""
dist = np.sqrt(np.sum(np.square(x - y))) # 注意:np.array 类型的数据可以直接进行向量、矩阵加减运算。np.square 是对每个元素求平均~~~~
return dist
@app.route('/predict_similar_players')
def predict_similar_players():
"""构建机器学习算法,利用历年赛季球员得分表现、进攻防守、年龄、身高、体重等信息,对该球员与NBA某球星进行匹配预测。"""
columns = ['场均得分', '场均篮板', '场均助攻', '罚球', '效率', '三分', '罚球', '进攻', '防守', '场均抢断', '场均盖帽', '失误', '犯规']
test_player_feature = []
for c in columns:
v = request.args.get(c)
test_player_feature.append(float(v))
player_distance = {}
print('待测试球员特征向量:', test_player_feature)
test_player_feature = np.array(test_player_feature)
for player in player_group:
player_df = player_group[player][columns]
player_feature = player_df.mean(axis=0).values
print(player, player_feature)
# 计算待测试球员与 NBA 球星特征向量的距离
dist = cal_euclidean_distance(test_player_feature, player_feature)
player_distance[player] = dist
# 按照相似距离就行排序
player_distance = sorted(player_distance.items(), key=lambda x: x[1])
print(player_distance)
# 选择相似度 TOP5 的NBA球星数据
similar_players = []
for player_dist in player_distance:
player, dist = player_dist
# 球星姓名
row = [player]
# 特征值
feat = player_group[player][columns].values.tolist()[0]
row.extend(feat)
# 相似度得分
row.append(dist)
similar_players.append(row)
return jsonify(similar_players[:10])
if __name__ == "__main__":
app.run(host='127.0.0.1')
🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅
点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻
更多推荐



所有评论(0)