Joe Conley Tagged golf Random thoughts on technology, books, golf, and everything else that interests me http://www.josephpconley.com/name/golf Atomic Events and PGAStream <p>Cal Newport, in his book <a href="https://www.goodreads.com/book/show/13525945-so-good-they-can-t-ignore-you?from_search=true&amp;search_version=service">So Good They Can’t Ignore You</a>, uses narratives from successful careers to argue, among other things, that “to maximize your chances of success, you should deploy small, concrete experiments that return concrete feedback”. Iterating quickly on these small bets can lead to inspiration, increase your chances for success and open up new possibilities. One recent wager of mine, <a href="http://www.twitter.com/birdie_bot">BirdieBot</a>, tweets every birdie (or better) for the current PGATour event. I built this with no specific purpose in mind, just wanted to exercise some interesting frameworks and tools (like my own <a href="http://www.datacombinator.com">DataCombinator</a>). One concrete set of feedback I noticed right away is the audience it soon found: Daily Fantasy Sports (DFS) players. However, I noticed the follower count would tend to fluctuate wildly, spiking up and then going almost immediately back down. The reason became quite obvious: the bot, like Twitter, is a firehose of information (I don’t even follow the bot). So, the logical next step (<a href="http://www.josephpconley.com/2016/02/10/monkey-island-innovation.html">adjacent possible</a> time) would be, how could I <strong>filter</strong> BirdieBot to only show the players and scores I cared about?</p> <p>This leads us to bet #2, <a href="http://pga.jpc2.com">PGAStream</a>. This looks very similar to Twitter, yet its stream is a record of every hole completed from every player in the current PGATour event (alongside the leaderboard). The novelty here is that you can filter the stream by player and by score type. Now the DFS players can create a stream with their stable of golfers. Or fans who want to see the best and worst holes can filter scores to only show the extreme outliers. Or maybe there’s other applications I haven’t thought of, especially as I add more filter criteria and track more events of interest like hot/cold streaks or if a golfer is on 59 watch.</p> <p><img src="/assets/PGAStream.png" class="img-responsive img-rounded" alt="PGAStream" /> <br /></p> <p>The bigger point here is that users should be able to customize their data consumption down to an atomic level. The approach should be similar to Excel, which has a few simple concepts yet can act as a <a href="http://www.joelonsoftware.com/items/2012/01/06.html">horizontal platform</a> solving an entire universe of present and future problems. As consumers of information, however, we get little to no control over how we digest data. It’s a very passive experience, we’re constrained by software’s functions which usually only benefit the software itself (think sharing or retweeting on a social network). I want to build and use software that empowers users to have complete control over their data at a very granular level. PGAStream is a small start, I’m hoping to extend this idea to other realms (economic indicators, stock quotes/alerts) such that all of our media consumption can be customized.</p> <p>Tech side note: I figured I’d expand my horizons a bit and learn some new tech in the process, so I built it using Python/Django. Having spent a lot of time in the Play/Scala world, I do appreciate the “batteries included” approach in Python and Django. I certainly get a better sense of the pros and cons of a different language by actually using it rather than reading someone’s blog post, so I’d encourage developers to constantly experiment with other languages. Learning a new language/framework can help revisit your assumptions, understand design decisions better, and maybe spark interest in a new way of thinking.</p> <p>You’re welcome DFS folks, let me know if you have any feedback!</p> Fri, 08 Apr 2016 00:00:00 +0000 http://www.josephpconley.com/2016/04/08/atomic-events-pgastream.html http://www.josephpconley.com/2016/04/08/atomic-events-pgastream.html 2014 PGA Championship Preview <p>The <a href="http://www.pga.com/pgachampionship/">2014 PGA Championship at Valhalla Golf Club</a> starts tomorrow amid several interesting storylines. Will Tiger be healthy enough to play (and if so, will he tell us before our fantasy draft starts)? Will Rory continue his dominance and retain his World Number 1 status, or will Adam Scott parlay his strong majors performance and regain the top spot? Or will a past champion like Padraig Harrington or Y.E. Yang reclaim Glory’s Last Shot?</p> <p>As an administrator (and participant) of a Golf Majors pool, I like to know the <a href="http://www.swingstats.com/majors/draft">world rankings and betting odds for the field</a> to help inform the draft and facilitate automated picks. For this last major, I also wanted to know how the field has performed in this year’s prior majors. Here’s how they’ve fared in 2014 (must have played in at least one major).</p> <table class="ui striped compact table"> <thead> <tr> <th>Player</th> <th>The Masters</th> <th>U.S. Open</th> <th>British Open</th> </tr> </thead> <tbody> <tr><td>Rickie Fowler</td> <td>T5</td> <td>T2</td> <td>T2</td></tr> <tr><td>Adam Scott</td> <td>T14</td> <td>T9</td> <td>T5</td></tr> <tr><td>Jim Furyk</td> <td>T14</td> <td>T12</td> <td>4</td></tr> <tr><td>Rory McIlroy</td> <td>T8</td> <td>T23</td> <td>1</td></tr> <tr><td>Jimmy Walker</td> <td>T8</td> <td>T9</td> <td>T26</td></tr> <tr><td>Justin Rose</td> <td>T14</td> <td>T12</td> <td>T23</td></tr> <tr><td>Jordan Spieth</td> <td>T2</td> <td>T17</td> <td>T36</td></tr> <tr><td>Henrik Stenson</td> <td>T14</td> <td>T4</td> <td>T39</td></tr> <tr><td>Chris Kirk</td> <td>T14</td> <td>T28</td> <td>T19</td></tr> <tr><td>Matt Kuchar</td> <td>T5</td> <td>T12</td> <td>T54</td></tr> <tr><td>Jason Day</td> <td>T21</td> <td>T4</td> <td>T58</td></tr> <tr><td>Francesco Molinari</td> <td>50</td> <td>T23</td> <td>T15</td></tr> <tr><td>Louis Oosthuizen</td> <td>25</td> <td>T40</td> <td>T36</td></tr> <tr><td>Martin Kaymer</td> <td>T31</td> <td>1</td> <td>70</td></tr> <tr><td>Brandt Snedeker</td> <td>T37</td> <td>T9</td> <td>T58</td></tr> <tr><td>Bill Haas</td> <td>T21</td> <td>T35</td> <td>T51</td></tr> <tr><td>Kevin Stadler</td> <td>T8</td> <td>T63</td> <td>T39</td></tr> <tr><td>Stewart Cink</td> <td>T14</td> <td>T54</td> <td>T47</td></tr> <tr><td>Gary Woodland</td> <td>T26</td> <td>T52</td> <td>T39</td></tr> <tr><td>Keegan Bradley</td> <td>CUT</td> <td>T4</td> <td>T19</td></tr> <tr><td>Thomas Bjorn</td> <td>T8</td> <td></td> <td>T26</td></tr> <tr><td>Graeme McDowell</td> <td>CUT</td> <td>T28</td> <td>T9</td></tr> <tr><td>Victor Dubuisson</td> <td>CUT</td> <td>T28</td> <td>T9</td></tr> <tr><td>Sergio Garcia</td> <td>CUT</td> <td>T35</td> <td>T2</td></tr> <tr><td>Ian Poulter</td> <td>T21</td> <td>T17</td> <td>CUT</td></tr> <tr><td>Stephen Gallacher</td> <td>T34</td> <td>CUT</td> <td>T15</td></tr> <tr><td>Phil Mickelson</td> <td>CUT</td> <td>T28</td> <td>T23</td></tr> <tr><td>Steve Stricker</td> <td>T31</td> <td>T21</td> <td></td></tr> <tr><td>Brendon Todd</td> <td></td> <td>T17</td> <td>T39</td></tr> <tr><td>Hunter Mahan</td> <td>T26</td> <td>CUT</td> <td>T32</td></tr> <tr><td>Billy Horschel</td> <td>T37</td> <td>T23</td> <td>CUT</td></tr> <tr><td>Ryan Moore</td> <td>CUT</td> <td>T48</td> <td>T12</td></tr> <tr><td>Brendon de Jonge</td> <td>T37</td> <td>T28</td> <td>CUT</td></tr> <tr><td>John Senden</td> <td>T8</td> <td>CUT</td> <td>T58</td></tr> <tr><td>Kevin Na</td> <td></td> <td>T12</td> <td>T54</td></tr> <tr><td>Darren Clarke</td> <td>T44</td> <td>CUT</td> <td>T26</td></tr> <tr><td>Brooks Koepka</td> <td></td> <td>T4</td> <td>T67</td></tr> <tr><td>Hideki Matsuyama</td> <td>CUT</td> <td>T35</td> <td>T39</td></tr> <tr><td>Thongchai Jaidee</td> <td>T37</td> <td>CUT</td> <td>T39</td></tr> <tr><td>Zach Johnson</td> <td>CUT</td> <td>T40</td> <td>T47</td></tr> <tr><td>Russell Henley</td> <td>T31</td> <td>T60</td> <td>CUT</td></tr> <tr><td>Kevin Streelman</td> <td>T42</td> <td>CUT</td> <td>T54</td></tr> <tr><td>Paul Casey</td> <td></td> <td>T56</td> <td>T47</td></tr> <tr><td>Thorbjorn Olesen</td> <td>T44</td> <td></td> <td>T64</td></tr> <tr><td>Bubba Watson</td> <td>1</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Jonas Blixt</td> <td>T2</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Erik Compton</td> <td></td> <td>T2</td> <td>CUT</td></tr> <tr><td>Miguel Angel Jimenez</td> <td>4</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Marc Leishman</td> <td>CUT</td> <td></td> <td>T5</td></tr> <tr><td>Charl Schwartzel</td> <td>CUT</td> <td>CUT</td> <td>T7</td></tr> <tr><td>Lee Westwood</td> <td>7</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Edoardo Molinari</td> <td></td> <td></td> <td>T7</td></tr> <tr><td>Shane Lowry</td> <td></td> <td>CUT</td> <td>T9</td></tr> <tr><td>Robert Karlsson</td> <td></td> <td></td> <td>T12</td></tr> <tr><td>Jamie Donaldson</td> <td>T14</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>J.B. Holmes</td> <td></td> <td>T17</td> <td>CUT</td></tr> <tr><td>George Coetzee</td> <td></td> <td></td> <td>18</td></tr> <tr><td>Angel Cabrera</td> <td>CUT</td> <td>CUT</td> <td>T19</td></tr> <tr><td>Matteo Manassero</td> <td>CUT</td> <td></td> <td>T19</td></tr> <tr><td>Chris Wood</td> <td></td> <td></td> <td>T23</td></tr> <tr><td>Gonzalo Fernandez-Castano</td> <td>T26</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Joost Luiten</td> <td>T26</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Ben Martin</td> <td></td> <td></td> <td>T26</td></tr> <tr><td>Brian Harman</td> <td></td> <td></td> <td>T26</td></tr> <tr><td>Steven Bowditch</td> <td>T26</td> <td></td> <td></td></tr> <tr><td>Kenny Perry</td> <td></td> <td>T28</td> <td></td></tr> <tr><td>David Hearn</td> <td></td> <td></td> <td>T32</td></tr> <tr><td>K.J. Choi</td> <td>T34</td> <td></td> <td>CUT</td></tr> <tr><td>Patrick Reed</td> <td>CUT</td> <td>T35</td> <td>CUT</td></tr> <tr><td>Ernie Els</td> <td>CUT</td> <td>T35</td> <td>CUT</td></tr> <tr><td>Branden Grace</td> <td>CUT</td> <td></td> <td>T36</td></tr> <tr><td>Vijay Singh</td> <td>T37</td> <td></td> <td></td></tr> <tr><td>Marc Warren</td> <td></td> <td></td> <td>T39</td></tr> <tr><td>Koumei Oda</td> <td></td> <td></td> <td>T39</td></tr> <tr><td>Nick Watney</td> <td>T44</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Webb Simpson</td> <td>CUT</td> <td>T45</td> <td>CUT</td></tr> <tr><td>Danny Willett</td> <td></td> <td>T45</td> <td>CUT</td></tr> <tr><td>Harris English</td> <td>CUT</td> <td>T48</td> <td>CUT</td></tr> <tr><td>Jason Dufner</td> <td>CUT</td> <td>CUT</td> <td>T51</td></tr> <tr><td>Tom Watson</td> <td>CUT</td> <td></td> <td>T51</td></tr> <tr><td>Seung Yul Noh</td> <td></td> <td>T52</td> <td></td></tr> <tr><td>Matt Jones</td> <td>CUT</td> <td>CUT</td> <td>T54</td></tr> <tr><td>Ryan Palmer</td> <td></td> <td>CUT</td> <td>T58</td></tr> <tr><td>Luke Donald</td> <td>CUT</td> <td>CUT</td> <td>T64</td></tr> <tr><td>Boo Weekley</td> <td>CUT</td> <td>66</td> <td>CUT</td></tr> <tr><td>Charley Hoffman</td> <td></td> <td></td> <td>T67</td></tr> <tr><td>Tiger Woods</td> <td></td> <td></td> <td>69</td></tr> <tr><td>Matt Every</td> <td>CUT</td> <td>CUT</td> <td>71</td></tr> <tr><td>Roberto Castro</td> <td>CUT</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Y.E. Yang</td> <td>CUT</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Graham Delaet</td> <td>CUT</td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Pablo Larrazabal</td> <td></td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Bernd Wiesberger</td> <td></td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Hyung-Sung Kim</td> <td></td> <td>CUT</td> <td>CUT</td></tr> <tr><td>Scott Stallings</td> <td>CUT</td> <td></td> <td>CUT</td></tr> <tr><td>Ross Fisher</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Padraig Harrington</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Mikko Ilonen</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Richard Sterne</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Geoff Ogilvy</td> <td></td> <td>CUT</td> <td></td></tr> <tr><td>Shawn Stefani</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Chesson Hadley</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Brian Stuard</td> <td></td> <td>CUT</td> <td></td></tr> <tr><td>Chris Stroud</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Cameron Tringale</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Fredrik Jacobson</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Kiradech Aphibarnrat</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Rafael Cabrera-Bello</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Anirban Lahiri</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Tim Clark</td> <td>CUT</td> <td></td> <td></td></tr> <tr><td>George McNeill</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Tommy Fleetwood</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Brendan Steele</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>John Daly</td> <td></td> <td></td> <td>CUT</td></tr> <tr><td>Ryo Ishikawa</td> <td></td> <td></td> <td>CUT</td></tr> </tbody> <caption class="text-left"><b>Best Majors Performers in 2014</b></caption> </table> <p>No big surprises here. Rickie Fowler has been sniffing at a major championship all year, falling short to two dominant performances by Kaymer and McIlory. Some other folks have been quietly consistent, like Jimmy Walker and Chris Kirk (haven’t heard their names on the Golf Channel all week). I was surprised to see normally consistent players turn in poor performances for the year (looking at you Jason Dufner and Angel Cabrera).</p> <p>Hope this information helps your golf handicapping/gambling purposes! If you have any other suggestions for stats/blog posts please let me know!</p> Wed, 06 Aug 2014 00:00:00 +0000 http://www.josephpconley.com/2014/08/06/pga-championship-preview.html http://www.josephpconley.com/2014/08/06/pga-championship-preview.html Equitable Stroke Control <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <script> //latex stuff MathJax.Hub.Config({ tex2jax: { skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'] } }); MathJax.Hub.Queue(function() { var all = MathJax.Hub.getAllJax(), i; for(i=0; i < all.length; i += 1) { all[i].SourceElement().parentNode.className += ' has-jax'; } }); </script> <p>Before <a href="http://www.swingstats.com">SwingStats</a>, I maintained my golf handicap index like most casual golfers, via formulas in an Excel spreadsheet. While effective (though inelegant), it became difficult to manage as the number of rounds and courses increased. Furthermore, I soon learned about Equitable Stroke Control (ESC), a formula which applies net scores to your handicap index, thereby dampening the effects of spectacularly bad holes (a regrettably common occurrence of my game). I didn’t think many golfers were aware of this methodology so I’ll explain it briefly here.</p> <p>To implement ESC for a given round, we need to calculate a <strong>Course Hanidcap</strong> using this formula:</p> <script type="math/tex; mode=display">\text{Course Handicap} = \frac{\text{your handicap index} * \text{slope of course}}{113}</script> <p>If you don’t have an established handicap index yet, you would use the maximum handicap index of 36.4 for men and 40.4 for women.</p> <p>Once you have the course handicap for your round, you can find the maximum score for a given hole using the following table.</p> <table class="ui table striped compact"> <thead> <tr> <th>Course Handicap</th> <th>Maximum Score</th> </tr> </thead> <tbody> <tr> <td>0-9</td> <td>Double Bogey</td> </tr> <tr> <td>10-19</td> <td>7</td> </tr> <tr> <td>20-29</td> <td>8</td> </tr> <tr> <td>30-39</td> <td>9</td> </tr> <tr> <td>40 or more</td> <td>10</td> </tr> </tbody> </table> <p>Using this table, you would go through each hole and determine the net strokes for the hole (the minimum of your score and the maximum score), and add up the net strokes giving you a net total for the round. It is this net total which you should apply towards your handicap calculation. For those interested here’s a good article on <a href="http://golf.about.com/cs/handicapping/a/howcalculated.htm">calculating your own handicap</a>. I won’t go into detail on the handicap calculation as I would simply advise you to use SwingStats!</p> <h2 id="esc-on-swingstats">ESC on SwingStats</h2> <p>SwingStats performs the ESC calculation automatically when generating your handicap. You can see the result for each round by looking at the NET score once your round is saved (in parentheses). Here’s my <a href="http://www.swingstats.com/rounds/405">most recent round</a>, where you can see my raw score of 93 and net score of 92. I earned a net 7 for the second hole as my handicap is 14.9, making the max on any hole a 7.</p> <p><img src="/assets/ESC.bmp" alt="Equitable Score Control Example" /></p> <h2 id="big-data-analysis-for-your-golf-game">Big Data Analysis for your Golf Game</h2> <p>Equitable Score Control is just one of the many benefits of using a scoring system like <a href="http://www.swingstats.com">SwingStats</a>. We’re working on solutions to extract intelligence from our database of rounds to pinpoint areas of your game that need the most work. Check back for future updates, or <a href="http://www.swingstats.com/contact">let us know</a> if you have any requests or feedback!</p> Wed, 30 Jul 2014 00:00:00 +0000 http://www.josephpconley.com/2014/07/30/equitable-score-control.html http://www.josephpconley.com/2014/07/30/equitable-score-control.html Accenture Match Play Statistics <p>February madness is here! The <a href="http://www.worldgolfchampionships.com/accenture-match-play-championship.html">Accenture Match Play Championship</a> starts today, and although the usual big names of Tiger, Phil, and Adam Scott are absent this year, there still promises to be some drama. Can Matt Kuchar become the first player not named Tiger to go back-to-back? Will Jimmy Walker improve upon his obscene winning percentage this year? Will past Ryder Cup emotions fuel players to victory (looking at you Mr. Poulter)? We’ll find out.</p> <p>The other source of drama is due to the vagaries of the match play format. Underdogs regularly upset favorites, and only one person has won the event as a number one seed (<a href="http://en.wikipedia.org/wiki/WGC-Accenture_Match_Play_Championship">Tiger</a>). This makes completing a bracket the ultimate exercise in futility. While I’m sure <a href="http://www.cbssports.com/collegebasketball/eye-on-college-basketball/24416823/warren-buffett-dan-gilbert-offering-1-billion-for-perfect-tourney-bracket">Warren Buffett’s billion dollar NCAA wager</a> is very safe at odds of 1 in 9.2 quintillion, I’d imagine a similar wager on this tournament would be even safer (though statistically it’s the same odds).</p> <p>Anyways, I’ll be looking at some random statistics as the tournament progresses. One such stat is average holes played per match. If you fill out your bracket on <a href="http://fantasy.pgatour.com/">pgatour.com</a>, you’re asked to put in a tiebreaker of total holes played by the champion of the tournament. A champion will have played six matches in total. For each match, a winner can play less than 18 holes, the full 18, or more than 18 if still tied (here’s a good primer on <a href="http://golf.about.com/od/beginners/a/matchplayscore.htm">match play scoring</a> for the uninitiated). I took a rough guess that on average, a match ends after the 16th hole. But I wanted to be sure (I’m in a money league for my bracket, can’t hold anything back). So naturally, I turned to programming.</p> <p>Here’s a very simply <a href="https://github.com/josephpconley/scala/blob/master/scrape/src/main/scala/com/josephpconley/golf/MatchPlay.scala">program to gather data on past matches</a>. This parses out the holes played for roughly 2,000 matches in this event from 2005 to present. The result was that the average holes played per match is 16.64116095. For the tiebreaker, you’d multiply this by 6 to get (roughly) 100.</p> <p>That’s it for now, I’ll try to dig deeper and come up with more interesting stats. If you have any suggestions feel free to comment!</p> Wed, 19 Feb 2014 00:00:00 +0000 http://www.josephpconley.com/2014/02/19/accenture-match-play-stats.html http://www.josephpconley.com/2014/02/19/accenture-match-play-stats.html Introducing SwingStats <p>SwingStats is a free social golf network, built by and for golfers. We built this application to solve two problems. Firstly, we wanted to help golfers to track their scores and maintain a valid handicap (without needing to belong to a country club). Secondly, we wanted to create a social network to allow golfers to connect and coordinate foursomes and golf outings. We believe providing these solutions helps golfers not only get better at golf but also enjoy the game as well.</p> <p>Our initial release is focused on providing functionality for any golfer to use. Our next major release will focus on providing solutions to golf clubs and golf courses to help them manage their business. We believe that scheduling tee times, running tournaments or outings, and managing promotions can be made simple and effective when run on a platform that any golfer can sign up for and use for free.</p> <p>But don’t worry! We’ll continue to make improvements and updates to the application to give golfers the best experience possible. That’s why we value your feedback. If you have any comments, questions, or feedback, feel free to <a href="http://www.swingstats.com/contact">drop us a line</a></p> Mon, 26 Aug 2013 00:00:00 +0000 http://www.josephpconley.com/2013/08/26/introducing-swingstats.html http://www.josephpconley.com/2013/08/26/introducing-swingstats.html