This file uses The Prediction Tracker data to create custom offensive and defensive power ratings. Subscribe to my Substack newsletter, Monte Carlo Football Picks, to learn more about the logic behind these calculations.
Load Packages
library(tidyverse)
Against the spread and over/under predictions are downloaded from The Prediction Tracker into csv files for loading into R.
lines <- read_csv("Week 07/inputs/line_pred.csv")
totals <- read_csv("Week 07/inputs/total_pred.csv")
names <- read_csv("Week 07/inputs/names2.csv")
Format data and remove incomplete data
lines2 <- lines %>%
select(road:lineburd) %>%
pivot_longer(cols = linekasulis:lineburd, names_to = "system", values_to = "line") %>%
drop_na()
head(lines2, 10)
Create list of systems and randomly select 10 to be used in the calculations of power ratings
set.seed(12)
systems <- lines2 %>%
select(system) %>%
distinct() %>%
slice_sample(n = 10) %>%
mutate(include = 1)
systems
Filter lines2 data on randomly selected systems
lines3 <- lines2 %>%
left_join(systems, by = "system") %>%
drop_na() %>%
group_by(road, home) %>%
summarise(ave_line = mean(line))
`summarise()` has grouped output by 'road'. You can override using the `.groups` argument.
head(lines3, 5)
Repeat process with Totals data
totals2 <- totals %>%
select(road, home, totmass:totkerns) %>%
pivot_longer(cols = totmass:totkerns, names_to = "system", values_to = "total") %>%
drop_na()
set.seed(13)
systems2 <- totals2 %>%
select(system) %>%
distinct() %>%
slice_sample(n = 10) %>%
mutate(include = 1)
totals3 <- totals2 %>%
left_join(systems2, by = "system") %>%
drop_na() %>%
group_by(road, home) %>%
summarise(ave_tot = mean(total))
`summarise()` has grouped output by 'road'. You can override using the `.groups` argument.
head(totals3, 5)
Combine lines3 and totals3 data, calculate score (ratings)
summary <- lines3 %>%
select(road, ave_line) %>%
left_join(totals3, by = "road") %>%
mutate(road_pf = (ave_tot/2) - (ave_line/2),
home_pf = (ave_tot/2) + (ave_line/2)) %>%
ungroup()
road <- summary %>%
mutate(Team = road, off_rating = road_pf, def_rating = home_pf) %>%
select(Team, off_rating, def_rating)
home <- summary %>%
mutate(Team = home, off_rating = home_pf, def_rating = road_pf) %>%
select(Team, off_rating, def_rating)
randexp_ratings <- road %>%
bind_rows(home) %>%
left_join(names, by = "Team") %>%
select(Name, off_rating, def_rating) %>%
rename("Team" = Name)
write.csv(randexp_ratings, "Week 07/randexp_ratings.csv")
randexp_ratings
LS0tDQp0aXRsZTogIlJhbmRvbSBFeHBlcnQgUmF0aW5nczogMjAyMSBORkwgV2VlayAwNyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KVGhpcyBmaWxlIHVzZXMgW1RoZSBQcmVkaWN0aW9uIFRyYWNrZXJdKGh0dHBzOi8vd3d3LnRoZXByZWRpY3Rpb250cmFja2VyLmNvbS8pIGRhdGEgdG8gY3JlYXRlIGN1c3RvbSBvZmZlbnNpdmUgYW5kIGRlZmVuc2l2ZSBwb3dlciByYXRpbmdzLiBTdWJzY3JpYmUgdG8gbXkgU3Vic3RhY2sgbmV3c2xldHRlciwgW01vbnRlIENhcmxvIEZvb3RiYWxsIFBpY2tzXShodHRwczovL21jZnAuc3Vic3RhY2suY29tLyksIHRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGxvZ2ljIGJlaGluZCB0aGVzZSBjYWxjdWxhdGlvbnMuDQoNCg0KDQpMb2FkIFBhY2thZ2VzDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCg0KDQpBZ2FpbnN0IHRoZSBzcHJlYWQgYW5kIG92ZXIvdW5kZXIgcHJlZGljdGlvbnMgYXJlIGRvd25sb2FkZWQgZnJvbSBUaGUgUHJlZGljdGlvbiBUcmFja2VyIGludG8gY3N2IGZpbGVzIGZvciBsb2FkaW5nIGludG8gUi4NCmBgYHtyfQ0KbGluZXMgPC0gcmVhZF9jc3YoIldlZWsgMDcvaW5wdXRzL2xpbmVfcHJlZC5jc3YiKQ0KdG90YWxzIDwtIHJlYWRfY3N2KCJXZWVrIDA3L2lucHV0cy90b3RhbF9wcmVkLmNzdiIpDQpuYW1lcyA8LSByZWFkX2NzdigiV2VlayAwNy9pbnB1dHMvbmFtZXMyLmNzdiIpDQoNCmBgYA0KDQoNCg0KDQpGb3JtYXQgZGF0YSBhbmQgcmVtb3ZlIGluY29tcGxldGUgZGF0YQ0KYGBge3J9DQpsaW5lczIgPC0gbGluZXMgJT4lDQogIHNlbGVjdChyb2FkOmxpbmVidXJkKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBsaW5la2FzdWxpczpsaW5lYnVyZCwgbmFtZXNfdG8gPSAic3lzdGVtIiwgdmFsdWVzX3RvID0gImxpbmUiKSAlPiUNCiAgZHJvcF9uYSgpDQoNCmhlYWQobGluZXMyLCAxMCkNCmBgYA0KDQoNCg0KQ3JlYXRlIGxpc3Qgb2Ygc3lzdGVtcyBhbmQgcmFuZG9tbHkgc2VsZWN0IDEwIHRvIGJlIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9ucyBvZiBwb3dlciByYXRpbmdzDQpgYGB7cn0NCnNldC5zZWVkKDEyKQ0KDQpzeXN0ZW1zIDwtIGxpbmVzMiAlPiUNCiAgc2VsZWN0KHN5c3RlbSkgJT4lDQogIGRpc3RpbmN0KCkgJT4lDQogIHNsaWNlX3NhbXBsZShuID0gMTApICU+JQ0KICBtdXRhdGUoaW5jbHVkZSA9IDEpDQoNCnN5c3RlbXMNCmBgYA0KDQoNCg0KRmlsdGVyIGxpbmVzMiBkYXRhIG9uIHJhbmRvbWx5IHNlbGVjdGVkIHN5c3RlbXMNCmBgYHtyfQ0KbGluZXMzIDwtIGxpbmVzMiAlPiUNCiAgbGVmdF9qb2luKHN5c3RlbXMsIGJ5ID0gInN5c3RlbSIpICU+JQ0KICBkcm9wX25hKCkgJT4lDQogIGdyb3VwX2J5KHJvYWQsIGhvbWUpICU+JQ0KICBzdW1tYXJpc2UoYXZlX2xpbmUgPSBtZWFuKGxpbmUpKQ0KDQpoZWFkKGxpbmVzMywgNSkNCmBgYA0KDQoNCg0KUmVwZWF0IHByb2Nlc3Mgd2l0aCBUb3RhbHMgZGF0YQ0KYGBge3J9DQp0b3RhbHMyIDwtIHRvdGFscyAlPiUNCiAgc2VsZWN0KHJvYWQsIGhvbWUsIHRvdG1hc3M6dG90a2VybnMpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IHRvdG1hc3M6dG90a2VybnMsIG5hbWVzX3RvID0gInN5c3RlbSIsIHZhbHVlc190byA9ICJ0b3RhbCIpICU+JQ0KICBkcm9wX25hKCkNCg0Kc2V0LnNlZWQoMTMpDQoNCnN5c3RlbXMyIDwtIHRvdGFsczIgJT4lDQogIHNlbGVjdChzeXN0ZW0pICU+JQ0KICBkaXN0aW5jdCgpICU+JQ0KICBzbGljZV9zYW1wbGUobiA9IDEwKSAlPiUNCiAgbXV0YXRlKGluY2x1ZGUgPSAxKQ0KDQp0b3RhbHMzIDwtIHRvdGFsczIgJT4lDQogIGxlZnRfam9pbihzeXN0ZW1zMiwgYnkgPSAic3lzdGVtIikgJT4lDQogIGRyb3BfbmEoKSAlPiUNCiAgZ3JvdXBfYnkocm9hZCwgaG9tZSkgJT4lDQogIHN1bW1hcmlzZShhdmVfdG90ID0gbWVhbih0b3RhbCkpDQoNCmhlYWQodG90YWxzMywgNSkNCmBgYA0KDQoNCg0KQ29tYmluZSBsaW5lczMgYW5kIHRvdGFsczMgZGF0YSwgY2FsY3VsYXRlIHNjb3JlIChyYXRpbmdzKQ0KDQpgYGB7cn0NCnN1bW1hcnkgPC0gbGluZXMzICU+JQ0KICBzZWxlY3Qocm9hZCwgYXZlX2xpbmUpICU+JQ0KICBsZWZ0X2pvaW4odG90YWxzMywgYnkgPSAicm9hZCIpICU+JQ0KICBtdXRhdGUocm9hZF9wZiA9IChhdmVfdG90LzIpIC0gKGF2ZV9saW5lLzIpLCANCiAgICAgICAgIGhvbWVfcGYgPSAoYXZlX3RvdC8yKSArIChhdmVfbGluZS8yKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpyb2FkIDwtIHN1bW1hcnkgJT4lDQogIG11dGF0ZShUZWFtID0gcm9hZCwgb2ZmX3JhdGluZyA9IHJvYWRfcGYsIGRlZl9yYXRpbmcgPSBob21lX3BmKSAlPiUNCiAgc2VsZWN0KFRlYW0sIG9mZl9yYXRpbmcsIGRlZl9yYXRpbmcpDQoNCmhvbWUgPC0gc3VtbWFyeSAlPiUNCiAgbXV0YXRlKFRlYW0gPSBob21lLCBvZmZfcmF0aW5nID0gaG9tZV9wZiwgZGVmX3JhdGluZyA9IHJvYWRfcGYpICU+JQ0KICBzZWxlY3QoVGVhbSwgb2ZmX3JhdGluZywgZGVmX3JhdGluZykNCg0KcmFuZGV4cF9yYXRpbmdzIDwtIHJvYWQgJT4lDQogIGJpbmRfcm93cyhob21lKSAlPiUNCiAgbGVmdF9qb2luKG5hbWVzLCBieSA9ICJUZWFtIikgJT4lDQogIHNlbGVjdChOYW1lLCBvZmZfcmF0aW5nLCBkZWZfcmF0aW5nKSAlPiUNCiAgcmVuYW1lKCJUZWFtIiA9IE5hbWUpDQoNCndyaXRlLmNzdihyYW5kZXhwX3JhdGluZ3MsICJXZWVrIDA3L3JhbmRleHBfcmF0aW5ncy5jc3YiKQ0KDQpyYW5kZXhwX3JhdGluZ3MNCmBgYA0KDQo=