Man Law Recapitulation: Week 9, 2017

Photo of me every Thursday night, Sunday, and Monday night during NFL season…

I Have a Problem

Look at that guy above. That guy is me. Ever since graduating college, I have had way more time on my hands. That extra time is pretty well spent throughout the year — except for during football season.

About three weeks ago, I found myself sitting on the beige, microfiber couch in my living room watching NFL football. I was watching intently. I had fantasy football teammates to cheer on and others to scout! Of course I was watching intently!! But I was also entering the 8th consecutive hour of watching NFL football that fateful Sunday…

During college, I was watching probably less than five NFL football games per year. Most of those were on Thanksgiving and Winter breaks. I spent my time grinding at school or working on dope projects. Since graduating, I have spent plenty of time working, but not much time on personal endeavors. A list of long-term projects amassed in my phone.

Back on that fateful microfiber couch, I knew I needed to watch less NFL football. So, I asked myself why? Why was I spending so much time watching the NFL? What was I getting out of that? What could I do to minimize that time commitment? The answer was essentially that I wanted to capture the story of the fantasy match-up(s).

Back in college, I would check my FFB (Fantasy Football) lineup Monday night before bed. I would see the final scores, feel a positive or negative emotion and go to bed. I also had the final scores for every player on all teams, but I was missing crucial details. Did someone score super late in the game? Was I on track to win but lost at the last minute? Did a player start their game hot but get injured for the last three quarters and never score again? Nobody has time to sift through game recaps and play-logs to capture that information — especially not my collegiate self.

So three weeks ago, I decided to look for a solution to tell the story of our match-ups. I found nothing.

But then that list of long-term projects came to mind. Among the trivial(?) options like “Learn Kanye’s Homecoming on Piano” and “Make drink coasters that look like iPhones (to confuse people?),” there was also “Learn how to program in Python” (Python is a computer language named after Monty Python comedy sketches) AND “Automatically collect old Man Law data into a dataset.” It hit me. I could kill three birds with one stone. I started down a path to 1) Learn Python, 2) Use Python to capture the dynamics/story of an FFB match-up, and 3) Create a historical database of everything Man Law!

Flux-overloaded screenshot I sent to Kristian at 10:29pm, Halloween. I may have claimed that I was the BASED-demi-GOD… I really really wasn’t

For my solution, I was not ready

My basic plan was 1) Download Python, 2) Find and download packages that can easily isolate specified content and webpages, 3) Setup those packages to record content from all match-ups of the week, 4) Force Python to repeatedly record and log the content every few minutes during games, 5) Plot all of the content after the games. But I have a habit of biting off more than I can comfortably chew.

Step 1, Downloading Python, was fine.

Step 1.5 (just made this up, wasn’t listed above) entailed picking what data to collect. I was feeling great. I decided to collect ALL THE DATA! In my research lab, I was working with 100s of gigabytes of data. I wasn’t going to settle now! I chose the table below to record for all teams and every five minutes. Seemed hard, but there was going to be a lot of repetition. Things would be fine.

Gather ALL THE DATA, every 5 minutes, for every team, in every ESPN public league! (JK about all leagues. For now…)

Step 2 was not fine. I tried a few packages that were designed to isolate the content I wanted. I couldn’t get them to work. I threw that method out the window. Instead I knew that I could brute-force my way to the content using the HTML code. Have you ever seen the HTML code that’s use to construct a website? If you’re on a computer browser, press F12. If you’re on mobile, check this out later. Now in the “Elements” tab, start clicking the dark triangles that point to the right. They should rotate, point down, and show more layers of the code. Try clicking the triangles until they’re all pointing down. No seriously, try it. Okay not seriously, that crap would take like 15 minutes. Basically, the HTML code for the webpage with the above table filled ~100 single-space pages when I pasted it into google docs. And there were no indentations! Literally wall to wall text for ~100 pages. And I was going to go fishing through this text to find my content.

After like 40 hours I could consistently rip the data in each row of that table.

Step 3 was moot: I didn’t have packages, so I couldn’t set them up to record the content I wanted. But my brute force from Step 2 was working! And then it stopped. It wasn’t working. I got like 2 nondescript lines of error messages. Turns out one of you weirdos decided to have two kickers on your bench. WHY!? Were you planning to get a THIRD kicker? [The answer is actually “Yes, let’s add a third kicker!”] (@DefinitelyNotNathanGuggenberger)… Whatever the reason, my code did not think this was possible and threw up more error messages. After like 3 hours, I cleaned up that aisle.

Step 4 was easy. I didn’t want to log the entire table every five minutes. So I pulled a hard-core Pied-Piper (Silicon Valley TV reference y’all!) and made my own differencing algorithm. My code only logged the rows of code that had updated since the last table was pulled (five minutes ago). That madness works and it’s saving me 100s of kilobytes! Oh but also, it doesn’t always work. The algorithm probably isn’t the problem. There’s something wrong with recreating the table form the HTML code sometimes. I taught my code to soldier-on past any errors and just try again in 5 minutes. I had errors like 20% of the time. Good news(!): You would honestly never know. Seriously. Later try and figure out where the breaks were.

But then Thursday came

I intended to have everything done by Thursday night. I tried collecting stuff and that double-kicker error prevented any collection. I’ll recap that narrative for those who missed it: Matt Forte went off for 20 points. Tyrod had like 26 points, but was benched. Matt Forte is now out this week. The Jets are worried about the longevity of his knees. Seems like he went out with a Bang!

Step 5 will be later…

Sunday Morning: Last Updates!

Last Sunday I woke at 8:30am and didn’t leave my desk until 11:57am. I sat my butt down to make sure everything was running smoothly. Once again, that gibberish was not running well. I had mocked up plots on paper for what I wanted to show. I literally was missing all of the information in the main plot. I crammed the “Projected Points” numbers into recorded table somehow. I was also missing the “Actually Kinda Important, How Winners Are Determined, What The Heck Am I Doing If I Don’t Collect Current Cumulative Fantasy Score.” I crammed that into my code too :)

Also pretty cool, I created a safety-net feature! My code can run and periodically save data. Then if my code breaks, I can start it and load in prior code (before the code broke) to work off of! That amazingly works. And yes, I’ve used it a lot recently.

With three minutes to spare, I whispered a little prayer and deployed the code. I quickly made it impossible for my laptop to fall asleep while plugged in, and walked into the living room to watch Jared Goff go (G)OFF.

Hot hot datafiles

Tuesday Evening: Reap the Spoils

I opened Python and wrote some lines and loaded in the latest periodically-saved data file, which held everything that was ripped form the websites.

I had used the same loading method Sunday AM. It worked flawlessly…Sunday. It didn’t work for me Tuesday. I tried another file. No luck. I tried different naming conventions. No luck. I restarted my computer. Nothing! I nearly slammed my laptop shut and went to bed. But then I knew I’d have to write a recap regardless. Oh! But I thought that I could maybe at least try again another week and get someone to take this recap. You have probably already scrolled down. If you haven’t, would I be crazy enough to write this and show no outputs? Nah. I made this thing work by trying different configurations for a few hours. Remember I just learned this language. I was floating on like 5 hours of learning and 50 hours or banging my head against a wall.

So I finally loaded up that code and immediately played it safe by saving the match-up data to 12 text files. I also copped out a bit and loaded those text files into my well-oiled programming language: MATLAB (Matrix Laboratory, bro).

Step 5: Making Charts

This post is already getting long. So I eventually got to these sexy things below. And I can do it automagically now! However, once again I had bigger aspirations. You’ll have to settle for this “main plot” which is now just the “only plot.”

PS: You all have team numbers, and our league number is 133480. Also, every player is designated a number, which allows people to change their name without losing their association in prior datasets (like Terrelle Pryor being Terrelle Pryor Sr now).

Team 1 (Nihal) Scores 94 to beat Team 14 (Eshaan) with 74

Dashed = Projection. Solid with fill = Actual Score. Blue = Winner. Red = Loser. Legends are also for losers.


  • Nihal played Bills D on Thursday night and started Sunday with -3 points (off the chart, lol)
  • Eshaan gets 7 from Bilal Thursday night and gets 10 points initially from Bronco’s D. He starts Sunday 12pm slot with a solid 17 points.
  • Eshaan’s projection continues to slip throughout the noon games until the fourth quarter. In the 4th, something crazy happens. Eshaan’s points jump from ~30 to ~65. His projections move from ~55 to ~75. In the future, I’d be able to tell you what that something was. But that’s for a future week! :D
  • Nihal mirrors this projection and score bump in the second slate of games, around the end of the second quarter. Nihal’s private browser was also VERY active around 5pm Sunday. Correlation or causation???
  • As Sunday night neared to a close, both teams were projected to tie! Actually, that might not be true. My computer was on my neighbor’s WiFi network this whole time. That network get’s notoriously busy around bed time. No comment as to why. But! My code broke and stopped collecting for ~1/4 of the SNF game.
  • Nihal breaks this tie early in the MNF game and doesn’t look back!

Team 16 (Joe) Scores 77 to beat Team 2 (John) with 74

Dashed = Projection. Solid with fill = Actual Score. Blue = Winner. Red = Loser. Legends are also for losers.


  • My team launched out of the gates on the back of Jared Goff! Kristian called me Bill Belichick again. It almost covered up the underperforming of Michael Thomas and the rest of my team!!!
  • Joe and I stay neck and neck throughout the noon games. Our scores seems to move up in step with one another. Same for our projections, but those are actually tied more of the time.
  • Joe’s projection started to take a consistent edge during the afternoon games.
  • Meanwhile, Joe’s score plot has this weirdo “V” shape where it dipped a bunch and then shot up to compensate. I’m guessing that was Joe’s Cowboy’s D/ST blundering and then coming back to life. In the future, I can actually diagnose that perfectly
  • Coming into SNF, Joe only had Amari Cooper left and I was done. Amari was projected for like 5 more points than necessary for Joe to beat me. Amari needed like 2 points. Look at Joe’s projection after the SNF game starts. Every dozen minutes, the projection drops another point. Then another point. Then another. Then Amari catches ~20 yards. Joe already had the win, but Amari tacked on a few more points for safe measure :(

Team 4 (Patrick) Scores 85 to beat Team 9 (Tim) with 83

Dashed = Projection. Solid with fill = Actual Score. Blue = Winner. Red = Loser. Legends are also for losers.


  • Patrick started this week on a TEAR. He scores >80 points during the noon games. Patrick scoffs at his ~67 point initial projection and ratchets it up to nearly one hunnid’
  • Tim loads up ~15 points in the first half of the noon games. Projected for a loss at that point, his players rallied behind the “GURLEY GUYS” team name to triple that total (to 45–50 points) at the end of their games
  • Patrick and Tim as projected for neck and neck coming into the afternoon games.
  • Patrick comes out of the afternoon gates by dropping like 8 points and then like 4 more. Maybe a TD was overturned. Maybe the 49ers D was scored on. Maybe it was both.
  • Throughout the afternoon games, Tim’s score creeps up slightly (to ~60). Tim’s projection stays safely ~10 points above Patrick’s projection.
  • Tim open’s up the SNF game with a dud. He score like 2 points in the first quarter.
  • At the end of the first quarter (or so), Tim’s projected lead is GONE. Patrick and Tim are projected to TIE! The Gurley Guys hear about this, and rally again. Someone catches/throws/rushes/finds a touchdown for a large spike.
  • The SNF game close with Patrick ~7 above Tim, but projected to lose by ~3.
  • Entering MNF, Tim’s Ameer Abdullah faces off against Patrick’s Theo Riddick. Has Man Law ever had a contentious MNF face-off with RBs (or WRs) from the same NFL team trying to out-perform each other for the Man Law decision? Maybe! But it happened here.
  • Tim’s Ameer scored to start the 2nd quarter and brought Tim the Promised Land! Except not. Ameer fumbles the football — causing Tim a TWO POINT DROP.
  • Detroit’s OC, Jim Bob “Cooties” Cooter, decides to maintain ball security and rest Ameer. Instead he funnel the ball to Patrick’s Theo Riddick. Lions needed to just kill time against the hopeless Packers. Makes sense.
  • Thoe rushes for 11 yards! Yikes. But he catches 63 yards and bring’s Patrick TWO POINTS ABOVE Tim.
  • If Ameer Abdullah hadn’t fumbled, Tim and Patrick would have tied. Tim’s bench points were far superior (44 > 2) and would have earned him the W. Will Tim every draft Ameer again??

Team 5 (Nathan) Scores 105 to beat Team 8 (Rob) with 82

Dashed = Projection. Solid with fill = Actual Score. Blue = Winner. Red = Loser. Legends are also for losers.


  • Rob starts Sunday with 20 magical points from Matt Forte (mentioned above) AND a 20 point projected lead.
  • Gugg’s team wants NONE of that noise. Gugg’s was initially projected for 80 points. His noon players exceed 80 points before they walk into the locker room.
  • Meanwhile, Rob’s team has a hot first quarter in the noon games. But then those noon players get injured/benched/ignored/ineffective/suspended-for-the-16th-time or whatever that caused them to collectively put up five more points and then take those five points away before walking into their locker room…
  • At the end of the noon game, Guggs was projected for ~110 and Rob was not projected for 80. Oh the turn tables
  • Starting at the beginning of the afternoon games, Rob and Guggs both start slow and then accelerate to each put up ~25 points. This actually drops Rob’s projection slightly and increases Guggs’ slightly.
  • Rob puts up another ~10 points in the MNF game, but just can’t catch up
  • Guggs’ Aaron Jones plays MNF and underperforms significantly. He posts 1 point. It doesn’t matter. Guggs wins!

Team 7 (Clerry) Scores 83 to beat Team 6 (Kristian) with 53

Dashed = Projection. Solid with fill = Actual Score. Blue = Winner. Red = Loser. Legends are also for losers.


  • Clay and Perry needed a single name. I made up “Clerry.” It seems pretty fair for both parties. Deal with it.
  • Coming into the Sunday game, Kristian and Clerry were both projected near 70 points. Kristian had the slight edge.
  • Kristian’s team scored less than 20 points during the noon games
  • Clerry scored ~55 points during the noon slot, including a phantasmagorical (not sure what that word means, but it seemed like a wicked way to say “fantastic”) third quarter.
  • Kristian and Clerry’s projections diverged significantly during the noon games.
  • At the end of the noon games, Clerry already had enough points to essentially beat Kristian’s projections.
  • Kristian’s projections continued to drop in the first 1/4 of the afternoon games due to scoring ~2 points in that period.
  • BUT Kristian’s squad rallied to eclipse 40 points just before halftime.
  • Clerry’s players were still stacking it up and entered the locker room for a pizza party at the end of the afternoon games. No SNF or MNF needed!
  • Kristian hoped to have a big game from Detroit D/ST during MNF. The 10 point bump to start MNF looked nice, but they couldn’t even keep all 10 points :(

Team 16 (Evan) Scores 76 to beat Team 11 (Chris) with 60

Dashed = Projection. Solid with fill = Actual Score. Blue = Winner. Red = Loser. Legends are also for losers.


  • Have you noticed that all of these plots have the maximum Fantasy Points set to 120 (highest mark on the Y-axis). That was not on purpose. But like all good programmers, their bugs are suddenly features! Since Guggs was projected for just under 120 points at one point, all plots decided to scale to this value. Literally I couldn’t fix that after 10 minutes of trying. So feature it is!
  • That “feature” nicely contextualizes this meager match-up. Not until MNF did either team reach 60 points. And honestly, this match-up isn’t that meager.
  • Coming into Sunday, Chris was supposed to win (~80 to ~70).
  • Both teams under-performed in the first half of the noon games. Chris’ projection actually jumped up to nearly 90 but then back down below 80. Evan’s projection actually dipped to ~55 points. Yikes folks.
  • During the second half of the noon games, Chris continued to put up decent points, but his projection flew through the floor. Bet you didn’t think flying through the floor was possible. Think again!
  • Evan’s projection actually rebounded back to ~70 at the same point.
  • Oddly, neither Evan nor Chris had players in the the afternoon games. The suspense was building!
  • Both teams were quiet during the first 30 minutes of the SNF game. But then Evan’s Jarvis Landry catches a TD and spikes up both score and projection lines.
  • During MNF, Evan slightly outperforms Chris on the back of Matthew Stafford and wins the week!

How I Feel with This New Ability

The Aliens from Arrival can communicate many concepts simulataneously
I control the ink that tells many stories in one simple graphic now!


PS, I’ll kill that third bird (a dataset of old MAN LAW data eventually…)




Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

Applying Design and Agile Thinking to your Data Science project — Part 1

A Gentle Introduction into the Application of Principal Component Analysis (PCA) in Genomics

Alienation and Authenticity in an Information Economy

Coronavirus: The Swiss Cheese Strategy CV19

Data, Data Everywhere… but none I can use?

An Introduction to Data Analysis — Part 1

Download In *!PDF Machine Learning For Dummies Read ^book $ePub

creating an onion chart using tableau in case you’re wondering why it’s called an onion chart it…

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
John Mundahl

John Mundahl

More from Medium

Life as a chart

Chapter 1 (Explored)

Finding the Index of Fibonacci Numbers

David can Slay Goliath on the Basketball Court. Why not on the football field?