Project-Patrick

A Collection of Data Science Projects by Patrick DeAngelis

Neural style transfer, Impressionist sand lot field

Men’s Baseball League Heroics!

This first project is taking a swing at bringing the wonders of ‘advanced analytics’ to my summer baseball team. I used fangraphs formulas and modified them where I had to. The biggest problem I ran into was data collection, its hard to get guys to keep a pitching chart for a Sunday morning men’s league. Finally, to do the calculations I used python and a jupyter notebook.

In [ ]:

import pandas as pd
import numpy as np 

In [ ]: Gathering all of the sperate league stats into individual data frames

df1 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=973090&teamid=6819796')[0]
df1['Team'] = str('Hurricanes')
df1['division'] = str('west')

df2 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=973090&teamid=6834815')[0]
df2['Team'] = str('Four Seam Falcons')
df2['division'] = str('west')

df3 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=973090&teamid=6839726')[0]
df3['Team'] = str('Kings')
df3['division'] = str('west')

df4 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=973090&teamid=6819004')[0]
df4['Team'] = str('Royals')
df4['division'] = str('west')

df5 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=973090&teamid=6818906')[0]
df5['Team'] = str('Huskies')
df5['division'] = str('west')

df6 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=962033&teamid=6809038')[0]
df6['Team'] = str('SUFFOLK YANKEES')
df6['division'] = str('east')

df7 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=962033&teamid=6825321')[0]
df7['Team'] = str("EASTERN A's")
df7['division'] = str('east')

df8 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=962033&teamid=6837495')[0]
df8['Team'] = str('HUNTINGTON SAINTS')
df8['division'] = str('east')

df9 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=962033&teamid=6834814')[0]
df9['Team'] = str('LI COBRAS')
df9['division'] = str('east')

df10 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=962033&teamid=6830526')[0]
df10['Team'] = str('LI CRUSH')
df10['division'] = str('east')

df11 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=962033&teamid=6845760')[0]
df11['Team'] = str('ORDER 66')
df11['division'] = str('east')

df12 = pd.read_html('https://www.leaguelineup.com/teams_baseball.asp?url=lism21&divisionid=962033&teamid=6862702')[0]
df12['Team'] = str('TRASH PANDAS')
df12['division'] = str('east')

In [ ]:

combining them into one big data frame
stats = [df1, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12]
df = pd.concat(stats)

In [ ]: creating variables for use in formulas

#batting variables
tb = df.loc[:,'TB']
sh = df.loc[:,'SH']
cs = df.loc[:,'CS']
sb = df.loc[:,'SB']
k = df.loc[:,'K']
bb = df.loc[:,'BB']
hbp = df.loc[:,'HBP']
h = df.loc[:,'H']
dub = df.loc[:,'2B']
trip = df.loc[:,'3B']
hr = df.loc[:,'HR']
rbi = df.loc[:,'RBI']
ab = df.loc[:,'AB']
ibb = df.loc[:,'IBB']
sf = df.loc[:,'SF']
pa = df.loc[:, 'PA']

In [ ]:

#calculating weighted on base average
wo = ((0.693 * bb) + (0.723 * hbp) + (0.877 * h) + (1.232 * dub) + (1.552 * trip) + (1.980 * hr))
ba = (ab + bb - ibb + sf + hbp)
woba = round(wo/ba, 3)
df['wOBA'] = woba

In [ ]:

#calculating weighted runs above average
Weighted Runs Above Average (wRAA) measures the number of offensive runs a player contributes to their team compared to the average player. 
A wRAA of zero is league-average, so a positive wRAA value denotes above-average performance and a negative wRAA denotes below-average performance. 
This is also a counting statistic (like RBIs), so players accrue more (or fewer) runs as they play.

wOBA_scale = 1.2
lgwOBA = df['wOBA'].mean()
wRAA = ((woba - lgwOBA)/wOBA_scale) * pa
wRAA = round(wRAA, 3)
df['wRAA'] = wRAA

In [ ]:

#SecA = Secondary average  *accounts for power dicipline and speed
seca = (bb + (tb - h) + (sb - cs))/ab
seca = round(seca, 3)
df['SecA'] = seca

In [ ]:

#rc = runs created
rc = ((h + bb - cs + hbp) * (tb + (.26*(bb - ibb + hbp)) + (.52 * (sh + sf + sb))))/(ab + bb + hbp + sh + sf)
rc = round(rc, 3)
df['RC'] = rc

In [ ]:

df = df.sort_values(by='wOBA', ascending=False)

In [ ]:

#Batting leaders
leaders = df[['Name','AVG', 'OPS', 'wOBA', 'SecA', 'RC', 'wRAA', 'Team', 'division']]
leaders = leaders.loc[leaders['RC'] > 5]
leaders.head(15)

Out[ ]: Here are our league leaders from about 15 teams across Nassau county. Vinny is my shortstop and as you can see he had a pretty good season. That .850 wOBA is really something.

NameAVGOPSwOBASecARCwRAATeamdivision
14Vinny Grassano0.5591.4610.8500.44118.42215.965Hurricaneswest
17Brett Maier0.4371.4640.7720.6258.3056.747HUNTINGTON SAINTSeast
13Nick Isernia0.5111.3990.7640.42222.39618.120HUNTINGTON SAINTSeast
1Chris Burns0.4881.3000.6930.34118.68514.754LI CRUSHeast
0Alberto Argotte0.4351.2430.6700.41925.54720.259LI COBRASeast
11Connor McHale0.4671.2140.6610.82222.71713.919Kingswest
13Mike Grassano0.4761.2490.6610.33316.24311.818Hurricaneswest
2Corey Elowsky0.4441.2130.6250.72232.11619.308Four Seam Falconswest
1Ken Danielsen0.4261.1990.6120.40417.30012.420Royalswest
7JT Cullen0.4441.1350.6110.25012.3419.280HUNTINGTON SAINTSeast
22Liam Shannon0.4471.2010.6070.52615.62110.011Four Seam Falconswest
18Zach Hood0.4351.1470.6070.4788.0225.658EASTERN A’seast
20Chris Olberding0.4751.1330.5760.36123.07113.425HUNTINGTON SAINTSeast
18Jesse Matos0.4391.1340.5740.36614.8899.696HUNTINGTON SAINTSeast
14Jose Lebron0.4191.1680.5730.90315.7548.707Four Seam Falconswest

In [ ]:

# Pat stats
pat_df = df.loc[df['Name'] == 'Pat DeAngelis']
pat_df

Out[ ]: These are my batting stats from last season. not really so good, this performance prompted a visit to the eye doctor for an updated prescription

#NameAVGGPGSPAABRH2B3BHRRBIBBKHBPIBBSBCSSHSFDPROEFCLOBTBOBPSLGOPSTeamdivisionwOBAwRAASecARC
754.0Pat DeAngelis0.18519.019.059.054.05.010.03.00.00.09.04.018.00.00.00.00.00.01.00.00.00.00.013.00.2370.2410.478Hurricaneswest0.258-4.320.133.455

In [ ]:

df.loc[df['Team'] == 'Hurricanes']

Out[ ]: Here are the stats for my entire team.

#NameAVGGPGSPAABRH2B3BHRRBIBBKHBPIBBSBCSSHSFDPROEFCLOBTBOBPSLGOPSTeamdivisionwOBAwRAASecARC
032.0Mike Aniano0.2869.09.023.021.05.06.01.00.00.02.02.08.00.00.00.00.00.00.00.00.00.00.07.00.3480.3330.681Hurricaneswest0.343-0.0550.1432.616
113.0Joe Bitetto0.000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN0.0000.0000.000HurricaneswestNaNNaNNaNNaN
277.0Sebastian Buttafuoco0.2004.04.06.05.00.01.00.00.00.01.01.01.00.00.00.00.00.00.00.00.00.00.01.00.3330.2000.533Hurricaneswest0.262-0.4190.2000.420
39.0Scott Clark0.29610.09.027.027.05.08.03.00.00.01.00.05.00.00.00.00.00.00.00.00.00.00.011.00.2960.4070.704Hurricaneswest0.3971.1510.1113.259
433.0Steve Corea0.000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN0.0000.0000.000HurricaneswestNaNNaNNaNNaN
524.0Thad Cosentino0.19417.017.045.031.010.06.01.00.00.03.010.010.03.00.01.00.00.01.00.00.00.00.07.00.4220.2260.648Hurricaneswest0.3470.0430.3874.822
60.0Niko Davanzo0.0001.00.01.01.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.00.00.0000.0000.000Hurricaneswest0.000-0.2880.0000.000
754.0Pat DeAngelis0.18519.019.059.054.05.010.03.00.00.09.04.018.00.00.00.00.00.01.00.00.00.00.013.00.2370.2410.478Hurricaneswest0.258-4.3200.1303.455
857.0Andrew Deckel0.04012.012.027.025.00.01.00.00.00.00.02.010.00.00.00.00.00.00.00.00.00.00.01.00.1110.0400.151Hurricaneswest0.084-5.8920.0800.169
925.0Rob Deckel0.25012.012.028.024.05.06.00.00.00.05.02.012.00.00.00.00.01.01.00.00.00.00.06.00.2960.2500.546Hurricaneswest0.246-2.3300.0832.160
1017.0Sam Dipetro0.23421.021.056.047.05.011.04.00.00.03.07.016.02.00.00.00.00.00.00.00.00.00.015.00.3570.3190.676Hurricaneswest0.3731.2670.2346.193
1144.0Rocco DiPietro0.000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN0.0000.0000.000HurricaneswestNaNNaNNaNNaN
125.0Kenny Grassano0.000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN0.0000.0000.000HurricaneswestNaNNaNNaNNaN
1327.0Mike Grassano0.47613.013.045.042.06.020.05.00.02.018.03.07.00.00.00.00.00.00.00.00.00.00.031.00.5110.7381.249Hurricaneswest0.66111.8180.33316.243
1429.0Vinny Grassano0.55911.011.038.034.06.019.011.00.00.017.03.02.00.00.01.00.00.01.00.00.00.00.030.00.5790.8821.461Hurricaneswest0.85015.9650.44118.422
1522.0James Hall0.30821.019.063.052.09.016.00.02.01.013.010.09.01.00.04.00.00.00.00.00.00.00.023.00.4290.4420.871Hurricaneswest0.4254.1550.40411.974
162.0Chris Kornfeld0.2502.02.04.04.00.01.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.00.01.00.2500.2500.500Hurricaneswest0.219-0.4230.0000.250
1746.0Vinny Mavaro0.34512.011.030.029.03.010.00.00.00.02.01.07.00.00.02.00.00.00.00.00.00.00.010.00.3670.3450.711Hurricaneswest0.315-0.7710.1034.143
184.0Chris McGrane0.1877.06.018.016.01.03.01.00.00.00.02.08.00.00.01.00.00.00.00.00.00.00.04.00.2780.2500.528Hurricaneswest0.292-0.8080.2501.400
197.0Tom Moffatt0.2504.04.010.08.02.02.00.00.00.00.02.02.00.00.01.00.00.00.00.00.00.00.02.00.4000.2500.650Hurricaneswest0.314-0.2650.3751.216
2096.0Anthony Neal0.5001.01.03.02.00.01.00.00.00.00.01.01.00.00.00.00.00.00.00.00.00.00.01.00.6670.5001.167Hurricaneswest0.5230.4430.5000.840
2112.0Bobby Negron0.000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN0.0000.0000.000HurricaneswestNaNNaNNaNNaN
2299.0Frankie Petrocelli0.3006.06.015.010.04.03.00.00.00.03.04.00.01.00.00.00.00.00.00.00.00.00.03.00.5330.3000.833Hurricaneswest0.4080.7770.4002.293
2314.0Anthony Pranzo0.19517.017.050.041.08.08.02.00.00.02.09.05.00.00.03.00.00.00.00.00.00.00.010.00.3400.2440.584Hurricaneswest0.314-1.3270.3414.726
243.0Steve Quiroz0.000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN0.0000.0000.000HurricaneswestNaNNaNNaNNaN
256.0Jordan Rorher0.21917.017.045.032.05.07.02.00.00.01.011.07.02.00.03.00.00.00.00.00.00.00.09.00.4440.2810.726Hurricaneswest0.3931.7680.5006.196
261.0Ben Sherman0.24212.012.036.033.06.08.00.00.00.04.02.02.00.00.06.00.00.01.00.00.00.00.08.00.2780.2420.520Hurricaneswest0.233-3.3860.2423.378
2715.0Mike Silva Jr0.000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN0.0000.0000.000HurricaneswestNaNNaNNaNNaN
2818.0Ben Theiss0.26715.015.036.030.05.08.03.00.00.09.05.05.01.00.01.00.00.00.00.00.00.00.011.00.3890.3670.756Hurricaneswest0.4142.0440.3005.087