knitr::opts_chunk$set(echo = TRUE) library(tidyverse)
WeeklyScores <- function(Week=1){ require(rvest) require(tidyverse) url <- paste("http://www.nfl.com/schedules/2016/REG",Week,sep="") html <- read_html(url) NFL <- html %>% html_nodes(".schedules-list-date,.time,.away,.home") %>% html_text() NFL <- gsub("\r","",gsub("\n","",gsub("\t","",NFL))) Games <- length(which(NFL=="FINAL")) for (i in 1:Games){ Date <- ifelse(NFL[(8*(i-1)+1)]!="FINAL",NFL[(8*(i-1)+1)],Date) NFL <- if(i==1) {NFL} else if(NFL[(8*(i-1)+1)]==Date) {NFL} else {c(NFL[1:(8*(i-1))],Date,NFL[(8*(i-1)+1):(length(NFL))])} } tmp <- data.frame(matrix(NFL,nrow=Games,byrow=TRUE)) tmp <- tmp %>% mutate(Date=as.character(X1),AwayTeam=as.character(X3), AwayScore=as.numeric(as.character(X5)),HomeTeam=as.character(X8), HomeScore=as.numeric(as.character(X6))) %>% select(Date,AwayTeam,AwayScore,HomeTeam,HomeScore) tmp }
WeeklyScores performs a similar task, but omits the scoresWeeklyUpdate combines all weeks into one table, and places NA where scores warrantUpdateTeams gathers statistics for breaking ties using data from the WeeklyUpdate functionHeadtoHead, CommonGames, and CommonGamesPoints are functions that require their own functionsTwoTieDiv, ThreeTieDiv, FourTieDiv break ties between teams in the same divisionTwoTieConf, ThreeTieConf, FourTieConf break ties between teams in the same conferenceFinalDivRank and FinalDiv aggregate the results of the tied teams into one tableNFLSim <- function(Games=NULL,sims=100,data=WeeklyUpdate()){ require(rvest) require(tidyverse) rawscore <- data %>% gather(key="ID",value="Team",c(3,5)) %>% mutate(Score=ifelse(ID=="AwayTeam",AwayScore,HomeScore)) %>% select(Team,Score) rawagainst <- data %>% gather(key="ID",value="Team",c(3,5)) %>% mutate(Score=ifelse(ID=="AwayTeam",HomeScore,AwayScore)) %>% select(Team,Score) statsscore <- rawscore %>% group_by(Team) %>% summarise(mean=mean(Score,na.rm=TRUE),sd=sd(Score,na.rm=TRUE)) statsagainst <- rawagainst %>% group_by(Team) %>% summarise(mean=mean(Score,na.rm=TRUE),sd=sd(Score,na.rm=TRUE)) tmp <- data x <- Games
if (is.null(x)==FALSE){ y <- gregexpr("s[^a-z]*[0-9]+",x) Spot <- as.vector(y[[1]]) Lens <- attr(y[[1]],"match.length") z <- matrix(c(Spot,Lens),nrow=2,byrow=TRUE) z[2,] <- apply(z,2,function(x){x[2]=x[1]+x[2]}) z[2,ncol(z)] <- nchar(x) a <- as.vector(c(0,z)) b <- 0 for (i in 1:(length(a)-1)) { b[i] <- substr(x,a[i]+1,a[i+1]) } b[seq_along(b)[seq_along(b) %% 2 ==0]] <- gsub("[^0-9]","",b[seq_along(b) %% 2 == 0]) c <- data.frame(matrix(b,ncol=4,byrow=TRUE)) colnames(c) <- c("AwayTeam","AwayScore","HomeTeam","HomeScore")
for (j in 1:nrow(c)){ if (length(which(data$AwayTeam==c$AwayTeam[1] & data$HomeTeam==c$HomeTeam[1] & is.na(data$AwayScore))) == 0) { stop(paste( c$AwayTeam[1]," at ",c$HomeTeam[1], " is not a game still remaining to be played.",sep="")) } tmp$AwayScore[tmp$AwayTeam==c$AwayTeam[j] & tmp$HomeTeam==c$HomeTeam[j] & is.na(tmp$AwayScore)] <- c$AwayScore[j] tmp$HomeScore[tmp$AwayTeam==c$AwayTeam[j] & tmp$HomeTeam==c$HomeTeam[j] & is.na(tmp$HomeScore)] <- c$HomeScore[j] } }
for (s in 1:sims){ tmp$AwayScore <- as.numeric(apply(dat[,3:6],1,function(x){ ifelse(is.na(x[2]), ifelse(max(round(rnorm(1, mean=mean(c(statsscore$mean[statsscore$Team==x[1]],statsagainst$mean[statsagainst$Team==x[3]])), sd=sqrt((statsscore$sd[statsscore$Team==x[1]]^2+(statsagainst$sd[statsagainst$Team==x[3]])^2)/4))),0)==1, 2, max(round(rnorm(1, mean=mean(c(statsscore$mean[statsscore$Team==x[1]],statsagainst$mean[statsagainst$Team==x[3]])), sd=sqrt((statsscore$sd[statsscore$Team==x[1]]^2+(statsagainst$sd[statsagainst$Team==x[3]])^2)/4))),0)),x[2])})) tmp$HomeScore <- as.numeric(apply(dat[,3:6],1,function(x){ ifelse(is.na(x[4]), ifelse(max(round(rnorm(1, mean=mean(c(statsscore$mean[statsscore$Team==x[3]],statsagainst$mean[statsagainst$Team==x[1]])), sd=sqrt((statsscore$sd[statsscore$Team==x[3]]^2+(statsagainst$sd[statsagainst$Team==x[1]])^2)/4))),0)==1, 2, max(round(rnorm(1, mean=mean(c(statsscore$mean[statsscore$Team==x[3]],statsagainst$mean[statsagainst$Team==x[1]])), sd=sqrt((statsscore$sd[statsscore$Team==x[3]]^2+(statsagainst$sd[statsagainst$Team==x[1]])^2)/4))),0)),x[4])})) tm3 <- FinalRank(scores=tmp) y <- tm3 %>% select(Team,ConfRank) if (s==1) {x<-y} else {x<-full_join(x,y,by="Team")} tmp <- data } n <- c(1:sims) colnames(x) <- c("Team",sapply(n,function(x){paste("Sim",x,sep="")})) x }
set.seed(513) library(devtools) install_github("mstuart2097/STAT585Final") library(ProjectNFL) dat <- WeeklyUpdate(16) tmp <- NFLSim(data=dat) head(tmp[,c(1:11)])
SeedPlot <- function(TeamX="Bills",Sim=NFLSim(data=WeeklyUpdate()),Plotly=TRUE){ require(tidyverse) require(plotly) t <- Sim %>% filter(Team==TeamX) %>% select(-Team) count <- sapply(c(1:16),function(x){length(which(t==x))}) num <- data.frame(count) num$seed <- c(1:16) gg <- ggplot(num,aes(x=seed,y=count))+geom_bar(stat="identity")+ xlab("Seed")+ylab("Frequency")+ggtitle(paste("Seeding Plot of",TeamX))+ theme(plot.title = element_text(hjust = 0.5)) if(Plotly==TRUE) {ggplotly(gg)} else {gg} }
SeedPlot(TeamX="Raiders",Sim=tmp,Plotly=TRUE)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.