问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于大数据的NBA球员数据分析及预测系统

创作时间:
作者:
@小白创作中心

基于大数据的NBA球员数据分析及预测系统

引用
CSDN
1.
https://blog.csdn.net/qq_80213251/article/details/146383167

NBA球员数据分析及预测系统是一个基于Python语言和Flask框架构建的综合性平台,旨在帮助篮球爱好者、教练和球队管理者深入分析和预测NBA球员的表现。该系统结合了requests爬虫、statsmodels中的ARIMA时间序列预测算法以及Echarts可视化技术,为用户提供了丰富的数据分析和预测功能。

项目界面

  1. 球员数据分析1:每个赛季参加场数与平均得分分布情况

  2. 球员数据分析2:每个赛季场均篮板、助攻、抢断和盖帽的得分分布情况

  3. 球员数据分析3:每个赛季三分、罚球、进攻、防守的分布情况

  4. 首页:注册登录

  5. NBA球员未来得分表现预测:时间序列预测算法

  6. NBA球星相似匹配预测

核心代码

以下是系统中关键的数据处理和预测代码:

数据加载和预处理

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)

ARIMA模型预测

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,
    })

欧氏距离计算

def cal_euclidean_distance(x, y):
    dist = np.sqrt(np.sum(np.square(x - y)))
    return dist

@app.route('/predict_similar_players')
def predict_similar_players():
    columns = ['场均得分', '场均篮板', '场均助攻', '罚球', '效率', '三分', '罚球', '进攻', '防守', '场均抢断', '场均盖帽', '失误', '犯规']
    test_player_feature = []
    for c in columns:
        v = request.args.get(c)
        test_player_feature.append(float(v))
    player_distance = {}
    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
        dist = cal_euclidean_distance(test_player_feature, player_feature)
        player_distance[player] = dist
    player_distance = sorted(player_distance.items(), key=lambda x: x[1])
    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])

总结

NBA球员数据分析及预测系统是一个功能强大、易于使用的综合性平台。它不仅能够帮助用户深入了解NBA球员的表现和潜力,还能提供准确的预测和个性化的推荐。无论是篮球爱好者还是球队管理者,都能在这个系统中找到有价值的信息和支持。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号