I’m traveling to Montreal for a work trip next week and I may or may not have pressured my team into attending the Habs vs Jets pre-season game on the Thursday. Yup, its Fall now and the NHL is back soon! I can’t wait, not just to watch my beloved Habs chase Connor Bedard all season, but also for all the blood, sweat and tears I am going to pour into fantasy hockey. Draft season is around the corner!
I’ve been working all summer (again) to prepare FantasyHockeyHelper.ca, both for the draft before the season starts and for regularly showing in-season player rankings too! There’s several new improvements I’ve implemented, I hope you find them helpful in managing your fantasy team.
1. Fantasy Score Algorithm Improvements
While the hypothesis of the Fantasy Score rankings is that all selected statistic categories are equally as important, that's not necessarily true when considering the value of offense. Connor McDavid is going to go first overall in most category-based drafts even though he puts up a mediocre number of blocks which makes sense. And later in the regular season once the break-out players have been identified and scooped up, finding offensive power on waivers is much more difficult than finding a heavy hitter with lots of PIMs.
Clearly, offense is valued highly when selecting players, and that should come into play when ranking the players too. When configuring your Fantasy Score algorithm, you can open the “Configure Statistics” menu, check the “Highly value offense?” config box and regenerate the page. This will alter the rankings to ensure that high-offense players rise higher than they otherwise would when all categories were ranked equally.
This is not a change in my approach to the Fantasy Score algorithm, all statistics should still be considered on equal footing and putting together a team strong in most categories is a recipe for success. Again, winning the blocks category is as important (and often easier) than winning the goals category. However, the reality is that offensive output is harder to acquire than defensive output.
Also, there have been several small alterations to the logic that filters out outliers in data to help improve the rankings.
2. Time Series Fantasy Score Rankings
This is one of the big features I’ve been thinking about for a while, specific to the in-season player rankings (not available on pre-season draft rankings). To help you pick up the best waiver-wire picks or decide which players to drop, you can now view time series data of fantasy score rankings for:
- The whole season (all you could see previously)
- The last month
- The last 2 weeks
- The last week
This will help you identify players on hot streaks and slumps, helping you make the best choice based on recent data.
Simply open up “Filter Skaters” menu and select your Time Period Filter (full season by default) and regenerate the rankings.
3. UI Improvements
I’ve been pretty open about not being a frontend developer with an eye for design. I work in servers and APIs and JSON professionally, however after enough pushing from various trusted folks and users, I decided to try to improve the look and feel of the site. Its still doesn’t look like a 2022-calibre modern website and there are tons of things that can be improved still, but at least its not from the 90's anymore.
The site is still server-side rendered HTML via Ruby on Rails ERB, however I am now leveraging Bootstrap + Material Design (aka MDB) to make the website nicer.
Below are some of the improvements you’ll see:
Improved Fantasy Score Rankings Heat Map
No longer am I representing table cell stat strength using a rainbow gradient that doesn’t mean a lot on first glance, a fire-based heat map is much more intuitive! The hotter the table cell, the better the stat value.
Paginated tables with search
Thanks to MDB, I can render a full skaters table via server-side HTML and then have it simply presented in smaller, bite-sized pages with a fast client-side search too! This makes it easier to return more skaters to the page, previously I was limiting it to 150 skaters to prevent page rendering from taking too long.
Fantasy Team Averages in the Skaters Table
When signed in, you can view your drafted Fantasy Team’s statistic averages across your chosen statistic categories in the skaters table on both the pre-season and in-season player rankings in order to help you keep your strengths and weaknesses in mind when selecting players.
Collapsible Configuration Menus
Remember the ugly HTML web form used to configure the Fantasy Score that I had previously? It practically took up the whole page, well its gone! Now you can view the configurations as needed by clicking any of the buttons presented on any skater pages.
4. Platform Migration
Previously, I was deploying the Ruby on Rails application through Heroku. I was paying $9 USD per month for the lowest paid-tier “dyno” (computing service) and I was using the free-tier Postgres database. The dyno worked well for the traffic I had but the database limited how many rows I could save to it. To save on costs, I was storing some data (like team schedules) in summarized manners (JSONB and array blobs containing semi-structured data) to squeeze more data into a single table row. It was also causing me to deprioritize implementing data-heavy features like the Time Series data (see section 2) and I was regularly having to clear out some junk data which was kind of a pain.
However, that changes in August! Heroku made the mistake of removing support for free-tier databases this year and since I knew I was already overpaying for their lowest-tier dyno, I wasn't willing to pay another $15 USD per month to get the lowest paid-tier Postgres offering.
So, I very quickly migrated the app to Railway.app, an alternative offering to Heroku which charges based on actual usage and has much better pricing. As a result, the app has more computing power, much more database capacity (enabling the Time Series stats feature, see section 2), and a slightly cheaper price tag! Win-Win-Win!