数据隐私中nfl_格式化NFL数据以使用Python进行数据科学

2024-03-20 10:30

本文主要是介绍数据隐私中nfl_格式化NFL数据以使用Python进行数据科学,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据隐私中nfl

无论您最近使用哪种媒体内容(播客,文章,推文等),都可能会遇到一些对数据的引用。 无论是备份谈话要点还是对数据无处不在进行元视图,对数据及其分析的需求都很高。

作为程序员,我发现数据科学比巫术更能比巫术更精确。 我渴望获得原始数据并从中收集有用和具体的东西的能力。 多么有用的人才!

这让我开始思考数据科学家和程序员之间的区别。 数据科学家不只是可以编码的统计学家吗? 环顾四周,您会看到许多旨在帮助开发人员成为数据科学家的工具。 AWS拥​​有一整套的机器学习课程 ,专门针对将开发人员转变为专家。 Visual Studio具有内置的Python项目,只需单击一个按钮,即可创建用于分类问题的完整模板。 数十名程序员正在编写旨在使任何人都容易上手的数据科学的工具。

我以为我会清楚地吸引到数据(或黑暗)方面来招聘程序员,并通过一个有趣的项目给它一个机会:训练一个机器学习模型,以使用国家橄榄球联盟(NFL)数据集预测比赛情况。

搭建环境

虚拟环境 。 这很重要,因为如果没有环境,我将无处工作。 幸运的是,Opensource.com拥有一些很棒的资源来安装和配置安装程序。

您在这里看到的任何代码,我都可以查阅现有文档。 如果程序员熟悉一件事,那就是在浏览国外(有时非常稀疏)的文档。

获取数据

与任何现代问题一样,第一步是确保您拥有质量数据。 幸运的是,我遇到了2017年用于NFL大数据碗的一组NFL跟踪数据 。 甚至NFL也在尽力吸引数据领域中最耀眼的星星。

我需要了解的所有架构都在README中。 该练习将训练一个机器学习模型,以使用plays.csv 数据文件预测跑步(持球人保持足球状态并向低处奔跑)和传球(将球传给接收球员)。 在本练习中,我不会使用玩家跟踪数据,但是以后进行探索可能会很有趣。

首先,我需要通过将数据导入数据框来访问我的数据。 Pandas库是一个开放源代码的Python库,它提供用于轻松分析数据结构的算法。 样本NFL数据中的结构碰巧是一个二维数组(或更简单的说就是一个表),数据科学家通常将其称为数据框。 处理数据框的Pandas函数是pandas.DataFrame 。 我还将导入其他一些库,供以后使用。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib. pyplot as plt
import xgboost as xgb

from sklearn import metrics

df = pd. read_csv ( 'data/plays.csv' )

print ( len ( df ) )
print ( df. head ( ) )

格式化数据

NFL数据转储未明确指示哪些播放是奔跑(也称为急速)和哪些是传球。 因此,我必须通过一些精明的足球和推理来对进攻性比赛类型进行分类。

现在,我可以在isSTPLAY列中摆脱特殊团队的比赛。 特种球队既不是进攻也不是防守,因此与我的目标无关。

#drop st plays
df = df [ ~ df [ 'isSTPlay' ] ]
print ( len ( df ) )

略过playDescription列,我看到四分卫跪下的一些比赛,这实际上结束了一场比赛。 这通常被称为“胜利阵型”,因为这样做的目的是耗尽时间。 这些与正常的跑步比赛有很大的不同,所以我也可以放下它们。

#drop kneels
df = df [ ~ df [ 'playDescription' ] . str . contains ( "kneels" ) ]
print ( len ( df ) )

数据以正常进行游戏的季度为单位报告时间(以及每个季度的游戏时钟时间)。 就尝试预测序列而言,这是否最直观? 解决这个问题的一种方法是考虑时间间隔之间游戏玩法的差异。

当一支球队在第一节还剩一分钟的球时,是否会像在第二节还剩一分钟的球一样? 可能不是。 在两半结束时,只要花一分钟,它的作用是否相同? 所有其他条件保持不变,在大多数情况下答案可能是肯定的。

我将四分之一GameClock列从四分之一转换为一半,以秒而不是分钟表示。 我还将根据四分之一数值创建一个列。 有一些第五季度值,我认为这是加班费。 由于加班规则与正常游戏规则不同,因此我可以删除它们。

#drop overtime
df = df [ ~ ( df [ 'quarter' ] == 5 ) ]
print ( len ( df ) )

#convert time/quarters
def translate_game_clock ( row ) :
raw_game_clock = row [ 'GameClock' ]
quarter = row [ 'quarter' ]
minutes , seconds_raw = raw_game_clock. partition ( ':' ) [ :: 2 ]

seconds = seconds_raw. partition ( ':' ) [ 0 ]

total_seconds_left_in_quarter = int ( seconds ) + ( int ( minutes ) * 60 )

if quarter == 3 or quarter == 1 :
return total_seconds_left_in_quarter + 900
elif quarter == 4 or quarter == 2 :
return total_seconds_left_in_quarter

if 'GameClock' in list ( df. columns ) :
df [ 'secondsLeftInHalf' ] = df. apply ( translate_game_clock , axis = 1 )

if 'quarter' in list ( df. columns ) :
df [ 'half' ] = df [ 'quarter' ] . map ( lambda q: 2 if q > 2 else 1 )

yardlineNumber列也需要转换。 当前数据将码列列出为从1到50的值。同样,这也无济于事,因为团队不会在自己的20码列和其对手的20码列上采取相同的行动。 我将其转换为代表从1到99的值,其中,一码线最接近控球区的终点区域,而99码线最接近对手的终点区。

def yards_to_endzone ( row ) :
if row [ 'possessionTeam' ] == row [ 'yardlineSide' ] :
return 100 - row [ 'yardlineNumber' ]
else :
return row [ 'yardlineNumber' ]

df [ 'yardsToEndzone' ] = df. apply ( yards_to_endzone , axis = 1 )

如果我可以将人员数据转换成某种格式以供机器学习算法使用,则人员数据将非常有用。人员可以在给定的时间识别不同类型的技能职位。 目前在persons.offense中显示的字符串值不利于输入,因此我将把每个人员的位置转换为自己的列,以指示比赛中场上出现的数字。 国防人员稍后可能会感兴趣,以查看它是否对预测有任何结果。 现在,我只会坚持进攻。

def transform_off_personnel ( row ) :

rb_count = 0
te_count = 0
wr_count = 0
ol_count = 0
dl_count = 0
db_count = 0

if not pd. isna ( row [ 'personnel.offense' ] ) :
personnel = row [ 'personnel.offense' ] . split ( ', ' )
for p in personnel:
if p [ 2 : 4 ] == 'RB' :
rb_count = int ( p [ 0 ] )
elif p [ 2 : 4 ] == 'TE' :
te_count = int ( p [ 0 ] )
elif p [ 2 : 4 ] == 'WR' :
wr_count = int ( p [ 0 ] )
elif p [ 2 : 4 ] == 'OL' :
ol_count = int ( p [ 0 ] )
elif p [ 2 : 4 ] == 'DL' :
dl_count = int ( p [ 0 ] )
elif p [ 2 : 4 ] == 'DB' :
db_count = int ( p [ 0 ] )

return pd. Series ( [ rb_count , te_count , wr_count , ol_count , dl_count , db_count ] )

df [ [ 'rb_count' , 'te_count' , 'wr_count' , 'ol_count' , 'dl_count' , 'db_count' ] ] = df. apply ( transform_off_personnel , axis = 1 )

现在,进攻人员值由单独的列表示。

Result of reformatting offense personnel

编队描述了球员在球场上的位置,这在预测比赛结果方面似乎也具有价值。 再一次,我将字符串值转换为整数。

df [ 'offenseFormation' ] = df [ 'offenseFormation' ] . map ( lambda f : 'EMPTY' if pd. isna ( f ) else f )

def formation ( row ) :
form = row [ 'offenseFormation' ] . strip ( )
if form == 'SHOTGUN' :
return 0
elif form == 'SINGLEBACK' :
return 1
elif form == 'EMPTY' :
return 2
elif form == 'I_FORM' :
return 3
elif form == 'PISTOL' :
return 4
elif form == 'JUMBO' :
return 5
elif form == 'WILDCAT' :
return 6
elif form == 'ACE' :
return 7
else :
return - 1

df [ 'numericFormation' ] = df. apply ( formation , axis = 1 )

print ( df. yardlineNumber . unique ( ) )

最后,是时候对播放类型进行分类了。 PassResult列具有四个不同的值:I,C,S和null,分别表示不完整的传球,完整的传球,麻袋(分类为传球)和空值。 由于我已经淘汰了所有特殊的团队比赛,因此我可以假设空值是连续比赛。 因此,我将播放结果转换为一个名为play_type的列,该列由0表示运行或1表示通过。 这将是我希望算法预测的列(或标签 ,如数据科学家所说)。

def play_type ( row ) :
if row [ 'PassResult' ] == 'I' or row [ 'PassResult' ] == 'C' or row [ 'PassResult' ] == 'S' :
return 'Passing'
else :
return 'Rushing'

df [ 'play_type' ] = df. apply ( play_type , axis = 1 )
df [ 'numericPlayType' ] = df [ 'play_type' ] . map ( lambda p: 1 if p == 'Passing' else 0 )

休息一下

现在该开始预测事情了吗? 到目前为止,我的大部分工作一直在试图理解数据及其需要采用的格式,甚至在我开始进行任何预测之前。 其他人需要一分钟吗?

在第二部分中,我将对数据进行一些分析和可视化,然后将其输入到机器学习算法中,然后对模型的结果进行评分,以查看它们的准确性。 敬请关注!

翻译自: https://opensource.com/article/19/10/formatting-nfl-data-python

数据隐私中nfl

这篇关于数据隐私中nfl_格式化NFL数据以使用Python进行数据科学的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829172

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand