使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队

作者:来自 Jessica Garson

大约一年前,我经历了一段压力很大的时期,最后参加了一场篮球比赛。 在整个过程中,我可以以一种我以前无法做到的方式断开连接并找到焦点。 我加入的第一支球队是波士顿凯尔特人队。 波士顿凯尔特人队是一支不同寻常的球队,虽然他们本赛季经常位居 NBA 实力排行榜榜首,但他们只是有时在许多核心指标上领先联盟。

使用数据可视化,我可以更深入地了解这支球队,回答一些有关它的关键问题,并更好地分析赛季。 这篇博文将向你展示如何使用 Python 在 Elastic 中加载数据,使用 Elasticsearch 编写查询,使用 Kibana 创建仪表板。 你可以查看这篇博文的完整代码。

先决条件

本教程使用 Elasticsearch 版本 8.12; 如果你是新手,请查看我们的 Elasticsearch 和 Kibana 快速入门。

如果你的计算机上尚未安装 Python,请下载最新版本。 此示例使用 Python 3.12.1。

你将使用 nba_api 包获取有关波士顿凯尔特人队、Jupyter Notebooks 和 Elasticsearch Python 客户端的最新统计数据。 在测试此代码时,除非安装了 pandas,否则我会收到错误,因为 nba_data 创建 pandas DataFrame。

要安装这些软件包,你可以运行以下命令。

pip3 install nba_api jupyter elasticsearch pandas load_dotenv

你将需要加载 Jupyter Notebook 以交互方式处理你的数据。 为此,你可以在终端中运行以下命令。

export ES_USER=elastic
export ES_PASSWORD=xnLj56lTrH98Lf_6n76yjupyter notebook

在上面,你需要根据自己的 Elasticsearch 设置替换上面的 ES_USER 及 ES_PASSWORD 值。

在右上角,你可以选择 “New” 来创建新的 Jupyter Notebook。

步骤 1:解析和清理波士顿凯尔特人队数据

第一步是连接到 NBA 数据并将该数据加载到 Elasticsearch 中。 你首先需要导入所需的库。 在此示例中,你将使用 nba_api 的静态球队数据来获取有关波士顿凯尔特人队的信息。 leaguegamefinder 端点允许你获取信息。 要连接到 Elastic,你将使用 Elasticsearch Python 客户端 elasticsearch。 

要加载这些包,你可以使用以下代码:

from dotenv import load_dotenv
from nba_api.stats.static import teams
from nba_api.stats.endpoints import leaguegamefinder
from elasticsearch import Elasticsearch, helpers
import osload_dotenv()elastic_user=os.getenv('ES_USER')
elastic_password=os.getenv('ES_PASSWORD')url = f"https://{elastic_user}:{elastic_password}@localhost:9200"
es = Elasticsearch(url, ca_certs = "./http_ca.crt", verify_certs = True)print(es.info())

你需要从 NBA 球队静态数据集中获取球队数据,其中每个球队都有一个 ID。 你可以使用列表理解来查找波士顿缩写为 BOS 的球队。 获得完整的 Celtics 对象后,你可以将其范围缩小到仅 ID,你可以使用它来查找比赛数据。

nba_teams = teams.get_teams()
celtics = [team for team in nba_teams if team['abbreviation'] == 'BOS'][0]
celtics_id = celtics['id']

现在,你可以使用凯尔特人队的 ID 获取该球队的所有可用比赛数据。 你可以查看前五个结果,以确保使用 .head() 方法正确加载数据。

celtics_games = leaguegamefinder.LeagueGameFinder(team_id_nullable=celtics_id)
games = celtics_games.get_data_frames()[0]
games.head()

在处理这些数据时,我注意到今年的数据包括季前数据。 因此,我使用赛季日期将数据范围缩小到当前赛季。 在 Jupyter Notebook 中,你可以调用 current_season 来查看完整的 DataFrame。

current_season = games.loc[(games['GAME_DATE'] >= '2023-10-24') & (games['GAME_DATE'] <= '2024-06-20')]
current_season

由于空值在将数据加载到 Elasticsearch 时可能会产生问题,因此你可以仔细检查该数据是否没有空值。 下面的行返回一个布尔值,让你知道数据是否有任何空值。 由于该数据集返回 False 值,因此它没有空值,因此我们不必进行进一步的清理。

current_season.isnull().values.any()

第 2 步:将波士顿凯尔特人队数据加载到 Elasticsearch 中

在将数据加载到 Elastic 之前,你必须创建索引。 你可以为当前季节创建一个。

INDEX_NAME = "boston_celtics_current_season"es.indices.create(index = INDEX_NAME)

你可以创建一个函数将当前季节的数据加载到 Elasticsearch 中。 每个 game 都被视为一个文档。

def doc_generator(df, timeframe):for index, document in df.iterrows():yield {"_index": INDEX_NAME, "_id": f"{document['GAME_ID']}","_source": document.to_dict(),}

Python 客户端的帮助程序功能允许你高效地将保存当前赛季比赛数据的 DataFrame 上传到 Elasticsearch。 通过调用刚刚创建的 doc_generator 函数,你可以将 DataFrame 转换为文档。

helpers.bulk(es, doc_generator(current_season, index))
es.indices.refresh(index=index)

第 3 步:使用 Elasticsearch 编写查询

现在你的数据已加载,你可以开始使用 Elasticsearch 编写查询,以了解有关波士顿凯尔特人队本赛季表现的更多信息。 首先,你可以创建一个查询来查看他们本赛季到目前为止已经取得了多少场胜利,并返回胜利的计数结果。

search_query = {"query": {"match": {"WL": "W"}}
}games_won = es.count(index="boston_celtics_current_season", body=search_query)

在处理复杂的数据集时,编写句子来帮助解释数据集有时会很有帮助。 以下是波士顿凯尔特人队本赛季赢得多少场比赛的一个例子。

print(f"The Celtics won {games_won['count']} games this season so far.")

输出应如下所示:

The Celtics won 38 games this season so far.

体育运动中的连胜是指球队或个人连续获胜或失败的一系列连续比赛或赛事。 连胜很重要,因为它们反映了一段时期的出色表现(连胜)或具有挑战性的阶段(连败)。 在分析一支球队的表现时,检查他们有多少连续得分通常是有帮助的。 你可以创建一个查询,允许你按比赛数据对输赢进行排序。

streak_query = {"size": 1000,  "sort": [{"GAME_DATE": {"order": "asc"}}],"_source": ["GAME_DATE", "WL"]
}

你可以使用 es.search() 方法根据上面的查询创建搜索。

streak_search = es.search(index="boston_celtics_current_season",body=streak_query)

以下代码创建一个比赛日期和比赛结果的 JSON 对象。

gs = [hit['_source'] for hit in streak_search['hits']['hits']]

要查看本赛季前五连胜,你可以为每个连胜创建一个字典并进行相应的排序。

streaks = []
current_streak = 1
for i in range(1, len(gs)):if gs[i]['WL'] == gs[i-1]['WL']:current_streak += 1else:streaks.append((gs[i-1]['WL'], current_streak))current_streak = 1streaks.append((gs[-1]['WL'], current_streak))
top_streaks = sorted(streaks, key=lambda x: x[1], reverse=True)[:5]
top_streaks

第 4 步:使用 Kibana 创建仪表板

虽然我们可以继续编写查询来了解有关波士顿凯尔特人队的更多信息,但创建仪表板是从数据中获取见解的更有效方法。

在制作仪表板之前,你需要创建一个数据视图,以确保 Kibana 可以访问 Elasticsearch 索引中的数据。 对于数据视图,你需要为其命名,选择表示要可视化的多个索引的索引或模式,并提供时间戳字段,以便你可以创建基于时间的可视化。

注意:在进行可视化之前,你需要为当前的索引创建一个 data view。

创建数据视图后,你可以开始创建仪表板。 在 “Analytics” 标题下,选择 “Dashboard” 所在的位置,然后单击 “Create Dashboard” 所在的位置。

一个出色的可视化首先是为仪表板创建标题可视化。 你可以选择文本可视化和 Markdown 以将图像添加到标题中。

# ![image](https://1000logos.net/wp-content/uploads/2016/10/Boston-Celtics-Logo.png) How are the Boston Celtics performing this season?

要了解凯尔特人队赢得的比赛是否多于输掉的比赛,你可以创建一个 waffle 图来说明在赛季的此时点,凯尔特人队赢得的比赛多于输掉的比赛。

你可以在此处查看此图表的配置:

保持助攻多于失误是球队有效传球的一个重要指标。 截至本博文发布之日,随附的可视化结果清楚地表明球队在这方面表现良好,展示了熟练的球分配和团队合作。

该可视化的配置如下所示:

篮球比赛中的正负值显示了波士顿凯尔特人队比其他球队多了多少分,这个统计数据经常被用来解释一支球队对比赛的影响。 高分表明球队在比赛时在得分或阻止进球/得分方面往往表现良好。 高负分表明相反的情况 —— 球队往往会被超越。 赛季初,凯尔特人队在一场比赛中比另一支球队多得分超过 50 分,但随着时间的推移,这种情况逐渐正常化。 最近一场对阵密尔沃基雄鹿队的比赛(在撰写本文时)也是一个异常值。

以下是上述可视化的配置。

要了解有关凯尔特人队投篮频率的更多信息,你可以创建一些顶线,包括:

  • 平均投篮命中率是多少?
  • 三分线外的平均投篮命中率是多少?
  • 平均罚球命中率是多少?

这些顶行的配置在 Kibana 中如下所示:

投篮命中率顶线配置:

三分线底线投篮命中率配置:

罚球命中率顶线配置:

最终的可视化检查了凯尔特人队的得分是否会随着抢断和盖帽的增加而增加。 颜色代表盖帽平均值加上抢断平均值。 随着盖帽和抢断数量的增加,绿色会变暗。 然而,数据中缺乏明显的模式表明这些防守行为与其总体得分之间没有显着相关性。

此可视化的配置应如下所示:

结论

通过以这种方式可视化数据,你可以与数据进行稳健的交互并得出进一步的见解。 请务必查看这篇博文的完整代码。 下一步,创建一个数据管道,以编程方式将数据输入仪表板或利用我们的一些机器学习功能,例如异常检测。 你还可以通过添加凯尔特人队的历史数据或将凯尔特人队与 NBA 中的其他球队进行比较来扩展此数据集。 我们希望你可以继续使用 Python、Elasticsearch 和 Kibana。 与往常一样,如果你需要这篇博文激励你构建任何东西,或者你对我们的讨论论坛和社区 Slack 频道有任何疑问,请告诉我们。

更多关于可视化的文章,请参阅文章:

  • Kibana:Kibana 入门 (一)

  • Kibana:Kibana 入门 (二)

  • Kibana:Kibana 入门 (三)

原文:Analyzing the Boston Celtics using Python, Elasticsearch, and Kibana — Elastic Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言实现memcpy、memmove库函数

目录 引言一、库函数介绍二、库函数详解三、源码实现1.memcpy源码实现2.memmove源码实现 四、测试1.memcpy函数2.memmove函数 五、源码1.memcpy源码2.memmove源码 六、参考文献 引言 关于memcpy和memmove这两个函数&#xff0c;不论是算法竞赛还是找工作面试笔试&#xff0c;对…

感悟笔记——2024年2月5日

今日阅读了一篇挺有深度的文章&#xff0c;主要阐述进入职场后的大部分人&#xff0c;是怎么逐渐沦为螺丝钉的?即使起点巨高的优等生&#xff0c;也不可避免。文章指路&#xff1a; 「优等生思维」正在将你变成「螺丝钉」和「老黄牛」从小到大&#xff0c;我一直都是那个「别…

Python类与对象

目录 面向对象 定义类 创建对象 类的成员 实例变量 构造方法 实例方法 类变量 类方法 封装性 私有变量 私有方法 使用属性 继承性 Python中的继承 多继承 方法重写 多态性 继承与多态 鸭子类型测试与多态 面向对象 类和对象都是面向对象中的重要概念。面向…

目标检测:3采用YOLOv8 API训练自己的模型

​ 目录 ​1.YOLOv8 的新特性 2.如何使用 YOLOv8? 3使用YOLOv8训练模型 4.验证训练集 5.测试训练集 6.测验其他图片 7 其他问题 参考: 1.YOLOv8 的新特性 Ultralytics 为 YOLO 模型发布了一个全新的存储库。它被构建为 用于训练对象检测、实例分割和图像分类模型的统…

【JS逆向学习】今日头条

逆向目标 目标网页&#xff1a;https://www.toutiao.com/?wid1707099375036目标接口&#xff1a;https://www.toutiao.com/api/pc/list/feed目标参数&#xff1a;_signature 逆向过程 老规矩先观察网络请求&#xff0c;过滤XHR请求观察加密参数&#xff0c;发现Payload的_s…

arm 汇编积累

C语言函数与汇编对应关系 一、MOV 系列指令 1、指令格式 MOV{条件}{S} 目的寄存器&#xff0c;源操作数 2、含义解析&#xff1a; &#xff08;1&#xff09;&#xff1a;mov 指令传送数据 案例&#xff1a; MOV R0,R1 ; R0 R1; MOV PC,R14 ;PC R14; MOV R0,R…

Kafka SASL_SSL双重认证

文章目录 1. 背景2. 环境3. 操作步骤3.1 生成SSL证书3.2 配置zookeeper认证3.3 配置kafka安全认证3.4 使用kafka客户端进行验证3.5 使用Java端代码进行认证 1. 背景 kafka提供了多种安全认证机制&#xff0c;主要分为SASL和SSL两大类。 SASL&#xff1a; 是一种身份验证机制&…

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总

【NLP概念合集&#xff1a;一】预训练 Pre-Training&#xff0c;微调 Fine-Tuning 及其方法的概念区别 前言请看此正文预训练 Pre-Training无监督学习 unsupervised learning概念&#xff1a;标签PCA 主成分分析&#xff08;Principal Component Analysis&#xff09;降维算法L…

本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目

本地部署TeamCity 本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目部署环境配置 TeamCity 服务器 URLTeamCity 上 GitLab 的相关配置GitLab 链接配置SSH 配置项目构建配置创建项目配置构建步骤构建触发器结语本地部署TeamCity打包发布GitLab管理的.NET Fra…

市场复盘总结 20240205

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率低 50% 最常用…

Leetcode刷题笔记题解(C++):257. 二叉树的所有路径

思路&#xff1a;深度优先搜索 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

[软件工具]文档页数统计工具软件pdf统计页数word统计页数ppt统计页数图文打印店快速报价工具

文档页数统计工具软件——打印方面好帮手 在信息化时代&#xff0c;文档已成为我们工作、学习、生活中不可或缺的一部分。无论是学术论文、商业报告&#xff0c;还是个人日记&#xff0c;都需要我们对其进行有效的管理。而在这个过程中&#xff0c;文档页数统计工具软件就显得…

掌握CSS网格函数fit-content()的妙用

CSS网格布局是一种强大的布局系统&#xff0c;它提供了灵活的网格化设计能力。其中&#xff0c;fit-content()函数是一项重要的功能&#xff0c;它可以帮助我们在网格容器中自动调整网格项的尺寸。本文将详细讲解fit-content()函数的使用方法及其常见应用场景&#xff0c;助你掌…

ETL是什么,有哪些ETL工具?就业前景如何?

ETL是什么 ETL&#xff08;Extract-Transform-Load&#xff09;&#xff0c;用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目标端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。它可以自动化数据处理过程&#xff0c;减少…

2023_中国零售业人工智能行业应用 发展图谱

01 零售人工智能行业应用发展背景 02 零售人工智能行业应用发展图谱及行业应用案例 案例&#xff1a;京东云、蓝色光标、京东言犀智能服务、腾讯企点、 案例&#xff1a;淘天集团、极睿科技、百度电商数字人直播 案例&#xff1a;中国联通、云拿科技AI智能商店&#xff1b; 0…

【flutter】报错 cmdline-tools component is missing

在flutterSDK目录下&#xff0c;双击flutter_console.bat&#xff0c;调出命令行。 输入flutter doctor&#xff0c;如果第三个诊断为[x]&#xff0c;报cmdline-tools component is missing错&#xff08;我这已经修改好了&#xff0c;所以是勾了&#xff09;&#xff0c;那就可…

HTTP和HTTPS区别!

http 是我们几乎天天都要打交道的东西&#xff0c;相关知识点有点多&#xff0c;所以也有不少面试必问的点&#xff0c;这里做了一些整理&#xff0c;帮且大家树立完整的 http 知识体系&#xff0c;对面试官说 so easy HTTP 的特点和缺点 特点&#xff1a;无连接、无状态、灵…

运行vue3项目出现的问题

Mac 系统运行 vue 启动项目时报错: Permission denied 的解决方式 控制台运行 chmod 777 node_modules/.bin/vue-cli-service 如果 npm run dev 还报这个错 控制台运行 node node_modules/esbuild/install.js

day44_jdbc

今日内容 0 复习昨日 1 讲作业 2 数据库连接池(druid) 3 反射 4 改造DBUtil 5 完成CRUD练习 0 复习昨日 1 sql注入 2 预处理语句 3 事务操作 4 DBUtil 1 作业【重要】 利用ORM完成,以下的几个方法非常重要,将来写项目就是这些操作 写项目步骤 搭建环境 创建项目导入依赖工具类数…

Oracle笔记-为表空间新增磁盘(ORA-01691)

如下报错&#xff1a; 原因是Oracle表空间满了&#xff0c;最好是新增一个存储盘。 #查XXX命名空间目前占用了多大的空间 select FILE_NAME,BYTES/1024/1024 from dba_data_files where tablespace_name XXXX #这里的FILE_NAME能查到DBF的存储位置#将对应的datafile设置为30g…