Overview

Fantasy basketball comes in 2 genres: points and categories leagues. In points leagues, a player's counting stats combine to yield a fantasy points value (via scoring settings) that contributes to your fantasy team's success. In category leagues, a player's counting stats are considered separately: you count how many rebounds your team obtained, how many points, how many assists, etc.

In both leagues, there are generally some roster criteria. For example, you can play 1 PG, 1 SG, 1 SF, 1 PF, 1 C, 1 G, 1 F, and 2-3 UTIL players each day. This only introduces a mild positional complexity to fantasy basketball. I say mild because, on any given day, only a few of your players will be playing, so you are likely not constrained by available positions you can play. This is unlike fantasy football, where all your players play once a week, so positional constraints are strong. At the very least, however, there are some positional curveballs in fantasy basketball leagues. One such curveball is some leagues only allow up to 4 Cs per team.

In points leagues, evaluating players is somewhat 1-dimensional: who is projected to score more fantasy points as a function of their projected box score stats and league scoring settings?

In category leagues, scoring is 9-dimensional (for 9 categories): you can try to optimize on all 9 dimensions, or you can try to admit defeat and "punt" on a couple categories such that you can more easily succeed in the remaining categories.

This post will focus on category leagues, aiming to discuss a quantitative approach to punting and leveraging positional superiority.

Data exercise

NBA player projections are pulled from hashtagbasketball. In fact, for this exercise, you could pull NBA stats from anywhere you want and anyone you trust -- we just need to have some box score stats per NBA player. These hashtag basketball projections include average draft pick (ADP) from some common fantasy basketball platforms as well.

Data cleaning aside, we can see the top 10 players are led by two centers, a couple of wings, but a lot of guards. We can also see a bunch of numbers for each box score, but they become hard to interpret and compare due to scale:

  • Is 6 AST a lot or a little?
  • 10 REB seems like a lot for a center, but to what extent?
  • How do we juxtapose that against 9 AST from a guard?
from IPython.display import display
import pandas as pd
from scipy.stats import zscore

STAT_COLS = ["FG%", "FT%", "3pm", "PTS", "TREB", "AST", "STL", "BLK", "TO"]
POSITIONS = ["PG", "SG", "SF", "PF", "C"]

def format_percentages(val):
    """ String formatting on the percentages columns """
    if "(" in val:
        return float(val[0:val.index('(')])
    else:
        return float(val)
    
def encode_positions(val):
    """ Split comma-joined list of positions into separate columns """
    positions = {
        pos: False
        for pos in POSITIONS
    }
    for code in val.split(","):
        positions[code] = True
    return pd.Series(positions)

def clean_df(df):
    """ Clean and format data """
    df["FG%"] = df["FG%"].apply(format_percentages)
    df["FT%"] = df["FT%"].apply(format_percentages)   
    positions = df["POS"].apply(encode_positions)
    df = df.merge(positions, left_index=True, right_index=True)
    return df
    
df = (
    pd.read_csv("files/2023hashtagbasketballprojections.csv", index_col=2)
    .sort_values("ADP")
    .pipe(clean_df)
)
df.drop(columns=["PG", "SG", "SF", "PF", "C"]).head(10)
R# ADP POS TEAM GP MPG FG% FT% 3pm PTS TREB AST STL BLK TO TOTAL
PLAYER
Nikola Jokic 1 1.1 C DEN 72 33.6 0.624 0.821 1.0 24.5 11.7 9.7 1.4 0.7 3.7 14.56
Joel Embiid 2 2.6 C PHI 67 34.2 0.537 0.836 1.2 32.6 10.2 4.2 1.1 1.6 3.3 13.62
Luka Doncic 6 3.2 PG DAL 66 35.8 0.492 0.761 3.0 32.7 8.8 8.1 1.3 0.5 3.6 9.78
Jayson Tatum 5 4.5 SF,PF BOS 75 36.5 0.466 0.858 3.3 29.5 8.2 4.8 1.1 0.7 3.0 9.82
Tyrese Haliburton 4 5.7 PG,SG IND 73 34.7 0.488 0.857 2.8 23.3 4.0 10.5 1.7 0.4 2.6 9.92
Stephen Curry 7 6.6 PG GS 65 34.6 0.476 0.914 4.7 28.0 5.6 5.6 0.9 0.3 3.3 9.69
Shai Gilgeous-Alexander 3 6.8 PG,SG OKC 67 35.5 0.486 0.884 1.0 29.6 5.0 5.6 1.5 0.9 2.9 11.03
Damian Lillard 8 9.6 PG POR 65 36.3 0.456 0.906 3.8 29.2 4.0 7.1 0.8 0.3 3.1 9.54
Giannis Antetokounmpo 37 10.1 PF,C MIL 65 32.0 0.553 0.683 0.9 30.3 11.6 5.7 0.9 1.0 3.6 5.08
Kevin Durant 10 10.8 SF,PF PHO 60 34.2 0.522 0.900 1.9 25.3 6.5 5.0 0.7 1.0 3.1 9.46

Z-scores to normalize and compare stats

The Z-score is a statistical technique to scale data into more "common sense" ranges. Specifically, when you normalize a range of data, the average shifts to 0 and a "standard deviation" becomes +/-1 . This is a useful tool to better understand how much better certain players are relative to other players.

Note: for the picky ones, the appication of the z-score does not require your data follow a normal distribution. While standardizing data that do follow a normal distribution, you get the added benefit of heuristics of the top 95/99th percentiles. NBA counting stats don't strongly follow a normal distribution, so we can't say that a player with an AST z-score of 2 is in the 95th percentile. If we did a deeper investigation into these distributions, we could identify these cumulative distribution properties, but that's for another time.

Continuing, we can take the example of Nikola Jokic. His REB z-score is 2.5, AST z-score of 2.99, and PTS z-score of 1.4. This corroborates the general consensus: not an outstanding scorer (but still gets points), but really a great passer and rebounder. On the other hand, Joel Embiid has a PTS z-score of 2.8 (we intuitively know Embiid is a stronger scorer than Jokic)

Looking at the top fantasy players, it becomes easy to pick out which players are crazy good in certain categories (roughly, those with z-scores > 2):

  • AST: Jokic, Doncic, Haliburton, Ball, Harden, Young
  • REB: Jokic, Embiid, Giannis, Davis
  • 3PM: Tatum, Curry, Lillard, Ball, Mitchell

By doing this exercise, we can identify which players may be associated with certain punts and focuses for roster composition

(
    df[STAT_COLS]
    .apply(zscore)
    .assign(
        ADP=df["ADP"],
        total_z=lambda df_: df_[STAT_COLS].sum(axis=1)
    )
    .head(50)
    [["ADP", *STAT_COLS, "total_z"]]
)
ADP FG% FT% 3pm PTS TREB AST STL BLK TO total_z
PLAYER
Nikola Jokic 1.1 1.880130 0.457226 -0.563614 1.427499 2.534388 2.994016 1.470340 0.113336 2.320597 12.633918
Joel Embiid 2.6 0.641376 0.632632 -0.360875 2.755406 1.901424 0.336963 0.512464 1.856959 1.821946 10.098294
Luka Doncic 3.2 0.000641 -0.244399 1.463774 2.771800 1.310658 2.221055 1.151048 -0.274136 2.195934 10.596374
Jayson Tatum 4.5 -0.369562 0.889895 1.767883 2.247195 1.057472 0.626823 0.512464 0.113336 1.447958 8.293463
Tyrese Haliburton 5.7 -0.056313 0.878201 1.261036 1.230773 -0.714827 3.380496 2.428216 -0.467872 0.949307 8.889015
Stephen Curry 6.6 -0.227176 1.544745 3.187055 2.001286 -0.039666 1.013303 -0.126120 -0.661608 1.821946 8.513764
Shai Gilgeous-Alexander 6.8 -0.084791 1.193932 -0.563614 2.263589 -0.292851 1.013303 1.789632 0.500807 1.323295 7.143303
Damian Lillard 9.6 -0.511947 1.451195 2.274730 2.198013 -0.714827 1.737954 -0.445412 -0.661608 1.572620 6.900717
Giannis Antetokounmpo 10.1 0.869193 -1.156512 -0.664983 2.378346 2.492191 1.061614 -0.126120 0.694543 2.195934 7.744204
Kevin Durant 10.8 0.427797 1.381032 0.348711 1.558651 0.340113 0.723443 -0.764705 0.694543 1.572620 6.282206
Anthony Davis 11.6 0.826477 -0.267787 -1.273200 1.476681 2.407796 -0.339378 0.512464 2.825639 0.325993 6.494684
LaMelo Ball 12.6 -0.882150 0.913282 2.173360 1.247166 0.551101 2.462605 2.108924 -0.467872 2.195934 10.302352
Anthony Edwards 14.6 -0.398039 -0.150849 1.565144 1.738984 0.044729 0.675133 2.428216 0.307072 1.821946 8.032336
Jaren Jackson Jr. 15.0 -0.184460 0.153188 0.145972 0.624198 0.593298 -1.112339 0.193172 4.569263 0.201330 5.183622
Kyrie Irving 15.2 -0.084791 1.474583 1.666513 1.788165 -0.377247 0.964993 0.831756 0.113336 0.450656 6.827965
Devin Booker 17.0 -0.070552 0.924976 0.754189 1.870135 -0.335049 1.351474 0.512464 -0.467872 0.949307 5.489070
Mikal Bridges 19.1 -0.241415 1.147157 0.855558 1.575045 -0.461642 -0.049518 0.512464 -0.080400 -0.047995 3.209254
Donovan Mitchell 19.7 -0.155983 0.913282 2.173360 1.968498 -0.546037 0.433583 1.789632 -0.661608 1.073969 6.988697
Desmond Bane 20.4 -0.312607 1.264095 1.869252 1.116015 -0.124061 0.240343 0.831756 -0.467872 0.450656 4.867576
Fred VanVleet 21.0 -1.309306 1.240707 1.565144 0.427471 -0.757025 1.399784 2.108924 -0.274136 0.325993 4.727556
Domantas Sabonis 21.4 1.652313 -0.454887 -1.070461 0.607804 2.829772 1.834575 -0.126120 -0.274136 1.447958 6.446816
James Harden 22.4 -0.867911 1.076995 0.855558 0.788137 0.382310 3.428806 0.831756 -0.274136 2.320597 8.542112
Trae Young 23.5 -0.825195 1.322564 0.652819 1.853741 -0.968013 3.138946 0.193172 -1.049080 2.819247 7.138200
Lauri Markkanen 25.4 -0.042075 1.030220 1.362405 1.329136 0.973077 -0.774169 -0.764705 -0.080400 0.076668 3.110157
LeBron James 25.5 0.128788 -0.244399 0.754189 1.788165 0.804286 1.206544 -0.445412 -0.274136 1.572620 5.290644
Kawhi Leonard 26.6 0.171503 0.948364 0.348711 1.214379 0.213520 0.095412 1.151048 -0.274136 -0.172658 3.696142
Jimmy Butler 26.8 0.271173 0.901589 -1.070461 0.902894 0.002532 0.723443 2.108924 -0.467872 -0.047995 3.324227
Karl-Anthony Towns 27.8 0.171503 0.597551 0.551450 0.968470 1.184065 0.530203 -0.764705 0.113336 1.198632 4.550505
Victor Wembanyama 30.1 -0.540424 -0.033912 -0.563614 0.247138 1.057472 -0.822479 -0.764705 3.213111 -0.047995 1.744593
Paul George 30.3 -0.697048 0.995139 1.261036 1.181591 0.171322 0.723443 1.789632 -0.467872 1.821946 6.779188
Pascal Siakam 30.6 -0.198699 -0.221012 -0.360875 1.034046 0.888682 0.868373 0.193172 -0.274136 0.699981 2.629531
Jalen Brunson 32.2 0.000641 0.585857 0.450080 1.378318 -0.841420 1.448094 0.193172 -0.855344 0.450656 2.810053
Dejounte Murray 33.1 -0.412277 0.468920 0.044603 0.804531 0.340113 1.399784 2.108924 -0.661608 0.450656 4.543644
Myles Turner 34.4 0.598660 -0.092381 -0.056767 0.050411 0.719891 -1.064029 -1.083997 3.600583 -0.421983 2.250389
Bam Adebayo 35.6 0.783761 0.001169 -1.577308 0.722561 1.732634 -0.049518 1.151048 0.307072 0.949307 4.020726
Nikola Vucevic 35.7 -0.027836 0.281819 -0.056767 0.263532 2.239005 -0.146138 -0.764705 0.113336 -0.047995 1.854251
Jrue Holiday 38.2 -0.127506 0.305207 0.652819 0.460259 -0.377247 1.737954 1.470340 -0.467872 1.198632 4.852586
De'Aaron Fox 40.7 0.057595 -0.092381 0.044603 1.525863 -0.630432 1.254854 0.831756 -0.467872 1.073969 3.597954
Jaylen Brown 40.9 0.029118 -0.150849 1.058297 1.738984 0.424508 0.047102 0.512464 -0.661608 1.323295 4.321309
Darius Garland 41.3 -0.426516 1.112076 0.956927 0.984864 -1.136804 2.076125 0.831756 -1.049080 1.447958 4.797306
Kristaps Porzingis 41.4 -0.198699 0.831426 0.247341 0.525835 0.973077 -0.580928 -0.445412 1.663223 -0.047995 2.967867
Walker Kessler 41.9 3.232792 -3.109369 -1.577308 -0.638133 2.196808 -1.112339 -1.403289 4.375527 -1.045297 0.919392
Chet Holmgren 42.6 -0.170222 -0.349643 -0.259506 -0.244679 1.479448 -0.919099 -1.403289 2.631903 -0.795971 -0.031058
Jamal Murray 43.4 -0.369562 0.597551 1.159666 0.853713 -0.672630 1.351474 0.193172 -0.661608 0.575318 3.027094
Cade Cunningham 43.7 -1.010297 0.632632 0.145972 0.771743 0.297915 1.448094 1.151048 0.113336 1.697283 5.247726
Evan Mobley 45.2 0.840715 -1.168206 -1.273200 0.230744 1.521646 -0.291068 -0.126120 2.050695 0.076668 1.861874
OG Anunoby 47.8 -0.440754 0.258432 0.551450 0.050411 -0.335049 -0.677549 2.108924 -0.080400 -0.047995 1.387470
DeMar DeRozan 48.7 0.171503 1.030220 -0.969092 1.460287 -0.461642 0.675133 0.193172 -0.467872 0.325993 1.957702
Nicolas Claxton 49.7 2.905306 -2.349275 -1.577308 -0.408618 1.732634 -0.822479 -0.126120 3.600583 -0.671309 2.283413
Brandon Ingram 50.8 -0.284130 0.819732 -0.158136 1.197985 -0.081863 1.013303 -0.764705 -0.467872 1.323295 2.597608

Choosing the set of data to compute z-scores

One key characteristic of the z-score is it adjusts the range of input data that are provided. It becomes extremely versatile if you carefully choose what your input data are.

In the above example, we looked at the pool of all available players. This is certainly useful to understand the "landscape" of counting stats, but as top tier players get drafted, the remaining players all begin to appear muted and unimpressive with z-scores all close to 0.

We can remove players from our pool as they get drafted and re-tabulate z-scores to continually adjust and re-scale our data. For example, if we neglected Jokic and Embiid from the dataset, the overall average REB goes down but still gets standardized to 0 (data below). Anyone who stands out relative to this new average REB will show up with z-scores above 1 or 2.

Admittedly, this re-scaling does nothing more than slide numbers up and down, but will not change the ultimate, qualitative trend of who produces more AST. In reality, you could do this z-score calculation over all players once, and work off that. Re-scaling simply helps to make numbers pop out more easily.

(
    df[STAT_COLS]
    .drop(index=["Nikola Jokic", "Joel Embiid"])
    .apply(zscore)
    .assign(
        ADP=df["ADP"],
        total_z=lambda df_: df_[STAT_COLS].sum(axis=1)
    )
    .head(50)
    [["ADP", *STAT_COLS, "total_z"]]
)
ADP FG% FT% 3pm PTS TREB AST STL BLK TO total_z
PLAYER
Luka Doncic 3.2 0.013443 -0.238064 1.453436 2.849007 1.361330 2.279315 1.162367 -0.265179 2.255881 10.871537
Jayson Tatum 4.5 -0.358623 0.892284 1.756362 2.313868 1.102775 0.655564 0.523065 0.123750 1.494738 8.503784
Tyrese Haliburton 5.7 -0.043798 0.880631 1.251485 1.277036 -0.707108 3.460225 2.440971 -0.459643 0.987308 9.087108
Stephen Curry 6.6 -0.215521 1.544857 3.170019 2.063022 -0.017629 1.049201 -0.116237 -0.654108 1.875309 8.698914
Shai Gilgeous-Alexander 6.8 -0.072418 1.195264 -0.566075 2.330591 -0.276184 1.049201 1.801669 0.512679 1.367880 7.342608
Damian Lillard 9.6 -0.501725 1.451632 2.261240 2.263699 -0.707108 1.787269 -0.435888 -0.654108 1.621595 7.086606
Giannis Antetokounmpo 10.1 0.886367 -1.147004 -0.667050 2.447653 2.567919 1.098405 -0.116237 0.707144 2.255881 8.033077
Kevin Durant 10.8 0.442750 1.381714 0.342705 1.611498 0.370203 0.753973 -0.755539 0.707144 1.621595 6.476043
Anthony Davis 11.6 0.843436 -0.261370 -1.272904 1.527883 2.481734 -0.328528 0.523065 2.846253 0.353022 6.712592
LaMelo Ball 12.6 -0.873791 0.915591 2.160264 1.293759 0.585666 2.525338 2.121320 -0.459643 2.255881 10.524385
Anthony Edwards 14.6 -0.387243 -0.144840 1.554411 1.795452 0.068556 0.704769 2.440971 0.318215 1.875309 8.225601
Jaren Jackson Jr. 15.0 -0.172590 0.158141 0.140754 0.658282 0.628758 -1.115801 0.203414 4.596433 0.226165 5.323556
Kyrie Irving 15.2 -0.072418 1.474938 1.655387 1.845621 -0.362368 0.999996 0.842716 0.123750 0.479879 6.987501
Devin Booker 17.0 -0.058108 0.927244 0.746607 1.929237 -0.319276 1.393633 0.523065 -0.459643 0.987308 5.670067
Mikal Bridges 19.1 -0.229831 1.148652 0.847582 1.628221 -0.448553 -0.033300 0.523065 -0.070714 -0.027550 3.337573
Donovan Mitchell 19.7 -0.143970 0.915591 2.160264 2.029576 -0.534738 0.458746 1.801669 -0.654108 1.114166 7.147195
Desmond Bane 20.4 -0.301382 1.265183 1.857338 1.159975 -0.103814 0.261927 0.842716 -0.459643 0.479879 5.002179
Fred VanVleet 21.0 -1.303098 1.241877 1.554411 0.457605 -0.750201 1.442837 2.121320 -0.265179 0.353022 4.852595
Domantas Sabonis 21.4 1.673429 -0.447820 -1.070953 0.641559 2.912659 1.885679 -0.116237 -0.265179 1.494738 6.707875
James Harden 22.4 -0.859481 1.078734 0.847582 0.825513 0.413296 3.509430 0.842716 -0.265179 2.382739 8.775350
Trae Young 23.5 -0.816550 1.323448 0.645631 1.912514 -0.965663 3.214202 0.203414 -1.043037 2.890168 7.364128
Lauri Markkanen 25.4 -0.029488 1.032121 1.352460 1.377375 1.016590 -0.771369 -0.755539 -0.070714 0.099307 3.250744
LeBron James 25.5 0.142235 -0.238064 0.746607 1.845621 0.844221 1.246019 -0.435888 -0.265179 1.621595 5.507167
Kawhi Leonard 26.6 0.185166 0.950550 0.342705 1.260313 0.240926 0.114314 1.162367 -0.265179 -0.154407 3.836755
Jimmy Butler 26.8 0.285337 0.903937 -1.070953 0.942574 0.025464 0.753973 2.121320 -0.459643 -0.027550 3.474461
Karl-Anthony Towns 27.8 0.185166 0.600957 0.544656 1.009467 1.232053 0.557155 -0.755539 0.123750 1.241023 4.738688
Victor Wembanyama 30.1 -0.530346 -0.028309 -0.566075 0.273651 1.102775 -0.820573 -0.755539 3.235182 -0.027550 1.883217
Paul George 30.3 -0.687758 0.997162 1.251485 1.226867 0.197834 0.753973 1.801669 -0.459643 1.875309 6.956898
Pascal Siakam 30.6 -0.186900 -0.214758 -0.364124 1.076359 0.930405 0.901587 0.203414 -0.265179 0.733594 2.814399
Jalen Brunson 32.2 0.013443 0.589304 0.443680 1.427544 -0.836386 1.492042 0.203414 -0.848572 0.479879 2.964350
Dejounte Murray 33.1 -0.401554 0.472774 0.039778 0.842236 0.370203 1.442837 2.121320 -0.654108 0.479879 4.713367
Myles Turner 34.4 0.614472 -0.086574 -0.061197 0.072974 0.758036 -1.066596 -1.075190 3.624111 -0.408122 2.371913
Bam Adebayo 35.6 0.800505 0.006650 -1.575830 0.758620 1.792255 -0.033300 1.162367 0.318215 0.987308 4.216791
Nikola Vucevic 35.7 -0.015178 0.286324 -0.061197 0.290374 2.309364 -0.131709 -0.755539 0.123750 -0.027550 2.018640
Jrue Holiday 38.2 -0.115349 0.309631 0.645631 0.491051 -0.362368 1.787269 1.482018 -0.459643 1.241023 5.019263
De'Aaron Fox 40.7 0.070684 -0.086574 0.039778 1.578052 -0.620923 1.295224 0.842716 -0.459643 1.114166 3.773479
Jaylen Brown 40.9 0.042063 -0.144840 1.049533 1.795452 0.456388 0.065109 0.523065 -0.654108 1.367880 4.500545
Darius Garland 41.3 -0.415864 1.113693 0.948558 1.026190 -1.138033 2.131702 0.842716 -1.043037 1.494738 4.960663
Kristaps Porzingis 41.4 -0.186900 0.834019 0.241729 0.557943 1.016590 -0.574550 -0.435888 1.679466 -0.027550 3.104860
Walker Kessler 41.9 3.261864 -3.093068 -1.575830 -0.629396 2.266272 -1.115801 -1.394841 4.401969 -1.042408 1.078760
Chet Holmgren 42.6 -0.158280 -0.342942 -0.263148 -0.228042 1.533700 -0.918983 -1.394841 2.651789 -0.788694 0.090559
Jamal Murray 43.4 -0.358623 0.600957 1.150509 0.892405 -0.664016 1.393633 0.203414 -0.654108 0.606737 3.170909
Cade Cunningham 43.7 -1.002583 0.635917 0.140754 0.808790 0.327111 1.492042 1.162367 0.123750 1.748452 5.436600
Evan Mobley 45.2 0.857746 -1.158657 -1.272904 0.256928 1.576792 -0.279323 -0.116237 2.068395 0.099307 2.032048
OG Anunoby 47.8 -0.430174 0.263018 0.544656 0.072974 -0.319276 -0.672960 2.121320 -0.070714 -0.027550 1.481294
DeMar DeRozan 48.7 0.185166 1.032121 -0.969977 1.511160 -0.448553 0.704769 0.203414 -0.459643 0.353022 2.111478
Nicolas Claxton 49.7 2.932729 -2.335618 -1.575830 -0.395273 1.792255 -0.820573 -0.116237 3.624111 -0.661836 2.443727
Brandon Ingram 50.8 -0.272762 0.822366 -0.162173 1.243590 -0.060721 1.049201 -0.755539 -0.459643 1.367880 2.772199
Zach LaVine 52.8 -0.143970 0.799060 1.251485 1.561329 -0.448553 0.507950 -0.435888 -0.654108 0.987308 3.424614
Deandre Ayton 53.4 1.759290 -0.307983 -1.474855 0.089697 2.050809 -0.918983 -1.075190 0.318215 -0.154407 0.286594

Positional z-score comparisons

The other consideration in fantasy drafting is position. If you decided you want to build a team that focuses on REB and BLK and are willing to give up something like 3PM, you'd probably want to draft a bunch of Cs. However, due to positional constraints, you will inevitably have to draft some PGs/SGs.

We can, again, apply z-scores to compare players. In this situation, however, we restrict our input data to just players among PGs (or another position). This way, we are asking ourselves "among PGs, who gets rebounds really well"? Below, we have 5 tables comparing z-scores for each position.

Again, this ultimately doesn't change qualitative trends (we know Luka gets more rebounds than Steph), but in the world of PGs, we can see this gap is huge.

When searching for a good rebounding PG, you might observe someone like Cade fits the role well, but he's somewhat far down in the draft (mid ADP). Unless you are extremely confident in someone like Cade to outperform his stats or fit your team composition extremely well, it's not a good idea to "reach" and try to draft him super early as your rebounding PG; there are likely some better options out there that could still fit your build. With an ADP of 43.7, perhaps it may be reasonable to pick him 5-10 spots early based on role-fit.

positions_zscores = {}
for pos in POSITIONS:
    positions_zscores[pos] = (
        df.loc[df[pos], STAT_COLS]
        .apply(zscore)
        .assign(
            ADP=df.loc[df[pos], "ADP"],
            total_z=lambda df_: df_[STAT_COLS].sum(axis=1)
        )
    )


for pos, subdf in positions_zscores.items():
    subdf.index.rename(pos, inplace=True)
    display(subdf.head(20)[["ADP", *STAT_COLS, "total_z"]])
    print("--")
ADP FG% FT% 3pm PTS TREB AST STL BLK TO total_z
PG
Luka Doncic 3.2 1.035558 -0.746131 1.078940 2.376326 3.695595 1.433339 0.650081 0.763193 1.677393 11.964294
Tyrese Haliburton 5.7 0.926413 0.529644 0.866240 0.947392 -0.094236 2.655579 2.016353 0.254398 0.483382 8.585163
Stephen Curry 6.6 0.598978 1.287135 2.886894 1.661859 1.169041 0.160173 -0.716191 -0.254398 1.319190 8.112681
Shai Gilgeous-Alexander 6.8 0.871840 0.888456 -1.048064 1.905082 0.695312 0.160173 1.333217 2.798374 0.841585 8.445974
Damian Lillard 9.6 0.053252 1.180821 1.929742 1.844276 -0.094236 0.924072 -1.057759 -0.254398 1.080388 5.606158
LaMelo Ball 12.6 -0.656191 0.569512 1.823392 0.962593 2.274408 1.687972 1.674785 0.254398 1.677393 10.268263
Kyrie Irving 15.2 0.871840 1.207399 1.291641 1.464240 0.537402 0.109246 0.308513 1.780784 0.005777 7.576843
Donovan Mitchell 19.7 0.735409 0.569512 1.823392 1.631456 0.221583 -0.450947 1.333217 -0.254398 0.602783 6.212007
Fred VanVleet 21.0 -1.474779 0.941613 1.185291 0.202522 -0.173191 0.567586 1.674785 0.763193 -0.113624 3.573396
James Harden 22.4 -0.628904 0.755562 0.440839 0.536954 1.958589 2.706505 0.308513 0.763193 1.796794 8.638045
Trae Young 23.5 -0.547046 1.034638 0.228138 1.525046 -0.567965 2.400945 -0.374623 -1.271988 2.274399 4.701545
Jalen Brunson 32.2 1.035558 0.197411 0.015438 1.084205 -0.331101 0.618512 -0.374623 -0.763193 0.005777 1.487984
Dejounte Murray 33.1 0.244256 0.064518 -0.409963 0.552155 1.879634 0.567586 1.674785 -0.254398 0.005777 4.324350
Jrue Holiday 38.2 0.789981 -0.121533 0.228138 0.232925 0.537402 0.924072 0.991649 0.254398 0.722184 4.559217
De'Aaron Fox 40.7 1.144703 -0.573370 -0.409963 1.221018 0.063673 0.414806 0.308513 0.254398 0.602783 3.026560
Darius Garland 41.3 0.216970 0.795430 0.547189 0.719371 -0.883785 1.280559 0.308513 -1.271988 0.960986 2.673245
Jamal Murray 43.4 0.326115 0.210700 0.759890 0.597759 -0.015282 0.516659 -0.374623 -0.254398 0.125179 1.891999
Cade Cunningham 43.7 -0.901767 0.250568 -0.303613 0.521752 1.800679 0.618512 0.650081 1.780784 1.199789 5.616785
Jordan Poole 53.5 -0.410614 0.981481 1.078940 0.749773 -0.489011 -0.247241 -0.716191 -0.254398 1.080388 1.773128
Tyrese Maxey 57.8 0.844554 0.503065 0.972590 0.552155 -0.725875 -0.501874 -1.057759 -0.254398 -1.068833 -0.736374
--
ADP FG% FT% 3pm PTS TREB AST STL BLK TO total_z
SG
Tyrese Haliburton 5.7 0.758798 0.603462 0.944849 1.158943 -0.223524 3.498986 1.990494 0.075512 0.925970 9.733489
Shai Gilgeous-Alexander 6.8 0.702515 1.006429 -1.233553 2.244790 0.597382 0.899831 1.381982 2.686970 1.323498 9.609842
LaMelo Ball 12.6 -0.873397 0.648236 2.034051 1.176178 2.239193 2.491150 1.686238 0.075512 2.251064 11.728224
Anthony Edwards 14.6 0.083407 -0.709912 1.307917 1.693248 1.254106 0.528523 1.990494 2.164678 1.853536 10.165996
Kyrie Irving 15.2 0.702515 1.364621 1.428939 1.744955 0.433201 0.846787 0.469214 1.642387 0.395932 9.028551
Devin Booker 17.0 0.730657 0.663160 0.339738 1.831134 0.515291 1.271139 0.164958 0.075512 0.925970 6.517558
Mikal Bridges 19.1 0.392961 0.946730 0.460760 1.520892 0.269020 -0.267137 0.164958 1.120095 -0.134106 4.474172
Donovan Mitchell 19.7 0.561809 0.648236 2.034051 1.934548 0.104839 0.263303 1.381982 -0.446780 1.058479 7.540465
Desmond Bane 20.4 0.252255 1.095977 1.670984 1.038293 0.925744 0.051127 0.469214 0.075512 0.395932 5.975037
James Harden 22.4 -0.845256 0.857182 0.460760 0.693580 1.910831 3.552030 0.469214 0.597804 2.383573 10.079717
Kawhi Leonard 26.6 1.209059 0.693010 -0.144352 1.141707 1.582468 -0.108005 0.773470 0.597804 -0.266615 5.478545
Paul George 30.3 -0.507561 0.752709 0.944849 1.107236 1.500378 0.581567 1.381982 0.075512 1.853536 7.690207
Dejounte Murray 33.1 0.055265 0.081097 -0.507419 0.710815 1.828740 1.324183 1.686238 -0.446780 0.395932 5.128071
Jrue Holiday 38.2 0.618091 -0.127849 0.218715 0.348866 0.433201 1.695490 1.077726 0.075512 1.190988 5.530742
Jaylen Brown 40.9 0.927646 -0.709912 0.702805 1.693248 1.992921 -0.161049 0.164958 -0.446780 1.323498 5.487334
Jamal Murray 43.4 0.139689 0.245269 0.823827 0.762522 -0.141433 1.271139 -0.139298 -0.446780 0.528441 3.043377
Cade Cunningham 43.7 -1.126669 0.290043 -0.386397 0.676344 1.746650 1.377227 0.773470 1.642387 1.721026 6.714080
OG Anunoby 47.8 -0.001017 -0.187548 0.097693 -0.082025 0.515291 -0.956709 1.686238 1.120095 -0.134106 2.057912
DeMar DeRozan 48.7 1.209059 0.797483 -1.717643 1.400242 0.269020 0.528523 -0.139298 0.075512 0.263422 2.686319
Brandon Ingram 50.8 0.308537 0.528838 -0.749464 1.124471 1.007835 0.899831 -1.052066 0.075512 1.323498 3.466992
--
ADP FG% FT% 3pm PTS TREB AST STL BLK TO total_z
SF
Jayson Tatum 4.5 -0.037308 0.886156 1.781118 2.374858 2.338643 1.346554 0.408842 1.098730 1.858725 12.056318
Kevin Durant 10.8 1.667714 1.566866 -0.051627 1.623311 1.116148 1.493413 -0.895778 2.467324 1.999567 10.986939
Anthony Edwards 14.6 -0.098202 -0.556301 1.519297 1.820145 0.612767 1.419984 2.365773 1.554928 2.281252 10.919643
Devin Booker 17.0 0.602075 0.934778 0.472015 1.963297 -0.034436 2.447998 0.408842 -0.269864 1.295354 7.820059
Mikal Bridges 19.1 0.236713 1.242718 0.602925 1.641205 -0.250171 0.318540 0.408842 0.642532 0.168614 5.011919
Desmond Bane 20.4 0.084479 1.404792 1.912028 1.140174 0.325121 0.759117 0.734997 -0.269864 0.731984 6.822830
Lauri Markkanen 25.4 0.662969 1.080644 1.257477 1.372795 2.194820 -0.782904 -0.895778 0.642532 0.309457 5.842012
LeBron James 25.5 1.028331 -0.685960 0.472015 1.873827 1.907174 2.227709 -0.569623 0.186334 1.999567 8.439373
Kawhi Leonard 26.6 1.119671 0.967193 -0.051627 1.247538 0.900413 0.538828 1.061152 0.186334 0.027772 5.997275
Jimmy Butler 26.8 1.332799 0.902363 -1.884371 0.907552 0.540856 1.493413 2.039618 -0.269864 0.168614 5.230980
Paul George 30.3 -0.737585 1.032022 1.126566 1.211750 0.828502 1.493413 1.713463 -0.269864 2.281252 8.679519
Jaylen Brown 40.9 0.815203 -0.556301 0.864746 1.820145 1.259971 0.465399 0.408842 -0.726062 1.717882 6.069824
OG Anunoby 47.8 -0.189542 0.010957 0.210194 -0.022935 -0.034436 -0.636045 2.039618 0.642532 0.168614 2.188957
Brandon Ingram 50.8 0.145373 0.788912 -0.706178 1.229644 0.397033 1.933991 -0.895778 -0.269864 1.717882 4.341013
Zach LaVine 52.8 0.419394 0.756497 1.126566 1.569629 -0.250171 1.126265 -0.569623 -0.726062 1.295354 4.747851
Scottie Barnes 55.3 0.175820 -0.442850 -1.491640 -0.219768 1.403794 1.566843 0.408842 1.554928 0.309457 3.265425
Paolo Banchero 58.7 -0.737585 -0.831827 -0.837089 0.943340 1.835263 0.759117 0.082687 1.098730 1.577040 3.889676
Jalen Williams 61.6 1.637267 0.124409 -1.229820 -0.219768 -0.106348 0.391969 1.713463 0.186334 0.027772 2.525278
Cameron Johnson 63.2 -0.098202 0.740289 1.388387 -0.005041 0.037475 -0.709475 1.061152 -0.726062 -1.098968 0.589557
Josh Giddey 64.0 0.328054 -1.301841 -1.098909 0.191793 2.266732 2.594857 -0.243468 -0.269864 1.858725 4.326078
--
ADP FG% FT% 3pm PTS TREB AST STL BLK TO total_z
PF
Jayson Tatum 4.5 -0.544238 1.199380 2.372760 2.387777 0.864325 1.152265 0.897050 -0.181540 1.551945 9.699723
Giannis Antetokounmpo 10.1 0.962311 -1.021022 -0.515817 2.521639 2.609102 1.682526 0.175286 0.414138 2.285973 9.114136
Kevin Durant 10.8 0.425495 1.732276 0.687756 1.684997 -0.008064 1.270101 -0.546479 0.414138 1.674283 7.334503
Anthony Davis 11.6 0.910361 -0.056734 -1.237962 1.601333 2.506468 -0.026092 0.897050 2.598291 0.450903 7.643620
Jaren Jackson Jr. 15.0 -0.319121 0.400035 0.447042 0.731225 0.299838 -0.968778 0.536168 4.385326 0.328565 5.840299
Domantas Sabonis 21.4 1.914727 -0.259742 -0.997247 0.714492 3.019638 2.625212 0.175286 -0.578659 1.551945 8.165653
Lauri Markkanen 25.4 -0.145955 1.351636 1.891330 1.450737 0.761691 -0.556353 -0.546479 -0.380099 0.206227 4.032735
LeBron James 25.5 0.061845 -0.031358 1.169186 1.919257 0.556423 1.859279 -0.185597 -0.578659 1.674283 6.444660
Jimmy Butler 26.8 0.235012 1.212068 -0.997247 1.015684 -0.418600 1.270101 2.701462 -0.777218 0.083889 4.325149
Karl-Anthony Towns 27.8 0.113795 0.882179 0.928471 1.082615 1.018276 1.034429 -0.546479 -0.181540 1.307269 5.639015
Victor Wembanyama 30.1 -0.752038 0.197027 -0.395460 0.346370 0.864325 -0.615271 -0.546479 2.995410 0.083889 2.177773
Paul George 30.3 -0.942521 1.313572 1.770973 1.300142 -0.213332 1.270101 2.340579 -0.777218 1.918959 7.981254
Pascal Siakam 30.6 -0.336438 -0.005981 -0.154745 1.149546 0.659057 1.446854 0.536168 -0.578659 0.817917 3.533719
Kristaps Porzingis 41.4 -0.336438 1.135939 0.567399 0.630828 0.761691 -0.320682 -0.185597 1.406935 0.083889 3.743965
Chet Holmgren 42.6 -0.301805 -0.145550 -0.034388 -0.155615 1.377495 -0.733107 -1.268243 2.399732 -0.650139 0.488380
Evan Mobley 45.2 0.927678 -1.033710 -1.237962 0.329637 1.428812 0.032826 0.175286 1.804054 0.206227 2.632847
Brandon Ingram 50.8 -0.440338 1.123251 0.085970 1.316875 -0.521234 1.623608 -0.546479 -0.777218 1.429607 3.294042
Scottie Barnes 55.3 -0.423021 0.158963 -0.636175 -0.038486 0.197204 1.329019 0.897050 0.017019 0.206227 1.707800
Julius Randle 57.0 -0.786671 -0.094798 1.169186 1.283409 1.788030 1.093347 -0.546479 -0.777218 1.674283 4.803090
Paolo Banchero 58.7 -0.942521 -0.145550 -0.034388 1.049149 0.505106 0.680922 0.536168 -0.181540 1.307269 2.774616
--
ADP FG% FT% 3pm PTS TREB AST STL BLK TO total_z
C
Nikola Jokic 1.1 0.739002 1.212933 0.549929 1.754116 1.554789 4.055070 2.766862 -0.780403 2.522974 14.375272
Joel Embiid 2.6 -0.365621 1.384186 0.859264 3.119817 0.854356 1.002204 1.497084 0.634805 2.019312 11.005406
Giannis Antetokounmpo 10.1 -0.162472 -0.362590 0.395261 2.732026 1.508093 1.834804 0.650565 -0.308667 2.397059 8.684078
Anthony Davis 11.6 -0.200563 0.505089 -0.532744 1.804698 1.414702 0.225110 1.497084 1.421032 0.508326 6.642736
Jaren Jackson Jr. 15.0 -1.102036 0.916095 1.632601 0.927952 -0.593206 -0.662996 1.073825 2.836241 0.382410 5.410885
Domantas Sabonis 21.4 0.535853 0.322420 -0.223409 0.911091 1.881657 2.722910 0.650565 -1.094894 1.641565 7.347760
Karl-Anthony Towns 27.8 -0.784616 1.349935 2.251271 1.282022 0.060531 1.224230 -0.195953 -0.780403 1.389734 5.796752
Victor Wembanyama 30.1 -1.419457 0.733426 0.549929 0.540160 -0.079555 -0.329956 -0.195953 1.735523 0.130579 1.664696
Pascal Siakam 30.6 -1.114733 0.550757 0.859264 1.349464 -0.266338 1.612777 1.073825 -1.094894 0.886072 3.856194
Myles Turner 34.4 -0.403712 0.676342 1.323266 0.337834 -0.453120 -0.607490 -0.619213 2.050014 -0.247168 2.056755
Bam Adebayo 35.6 -0.238653 0.767677 -0.996746 1.029115 0.667573 0.558150 2.343603 -0.623158 1.137903 4.645465
Nikola Vucevic 35.7 -0.962371 1.041681 1.323266 0.557021 1.227920 0.447137 -0.195953 -0.780403 0.130579 2.788876
Kristaps Porzingis 41.4 -1.114733 1.578272 1.787269 0.826789 -0.172946 -0.052423 0.227306 0.477560 0.130579 3.687672
Walker Kessler 41.9 1.945199 -2.269202 -0.996746 -0.370307 1.181224 -0.662996 -1.042472 2.678996 -0.876745 -0.413049
Chet Holmgren 42.6 -1.089340 0.425171 1.013931 0.034345 0.387400 -0.440970 -1.042472 1.263787 -0.624914 -0.073060
Evan Mobley 45.2 -0.187866 -0.374007 -0.532744 0.523300 0.434096 0.280617 0.650565 0.792051 0.256495 1.842507
Nicolas Claxton 49.7 1.653172 -1.527108 -0.996746 -0.134260 0.667573 -0.329956 0.650565 2.050014 -0.498999 1.534257
Deandre Ayton 53.4 0.612033 0.459422 -0.842079 0.354695 0.947747 -0.440970 -0.619213 -0.623158 0.004664 -0.146858
Brook Lopez 57.5 -0.619557 0.904679 1.477934 0.034345 -1.153553 -0.718503 -1.042472 1.578278 -0.624914 -0.163764
Jarrett Allen 59.5 1.183390 0.048416 -0.996746 0.000624 0.620878 -0.496476 -0.195953 0.005824 -0.373083 -0.203127
--

Holistically comparing players and re-ranking players according to punts

In the data tables presented so far, I've included a total_z column. Roughly speaking, if you wanted to find the most-general "best" player, you'd want the player with the highest z-score across the board. This can be simply evaluated by summing up a player's zscores. Revisiting the data, we can see that higher z-score does not directly correlate to higher ADP. ADP will generally factor in things like player availability (injuries) and season outlook, for which our z-score has not accounted.

As a team is constructed through the draft, perhaps you begin to identify (perhaps by using z-scores) certain categories you want to punt. If you want to commit to the punt, you can re-evaluate the remaining players solely based on the categories on which you're focusing. For example, the table below examines a scenario where we focus on PTS, REB, AST, STL, and FT%. In this case, we pretend the other 4 categories don't exist and only examine these 5; compute the z-scores and sum across these 5 categories. By neglecting certain categories, the new "best" players can shift around and this may help prioritze players for the punt.

As a counterpoint, some leagues might be more amenable to drafting the best player available. In this situation, you do not draft based on your team build, but instead try to draft the best players to maximize the amount of "draft capital" you have throughout the season. Drafting the best player available means the player will likely have good value to both you and opposing league managers. The team you draft might not have any notably strong or weak categories, but you have a lot of valuable trade pieces for which you can then re-construct your team (if your league trades a lot). If you draft based on your punt, your valuation of the player will noticeably differ from another manager's valuation of a player. For example, our PTS, REB, AST, STL, FT% focus says Trae Young is the 8th best player in the league even though his ADP is 23.5. Spending your first round pick on Trae Young means you likely miss out on some players that would be highly valued by your competition (like missing out on Embiid or Giannis). In my experience, the fact that there's no objective valuation for a player is what makes fantasy basketball trades so interesting and complex.

FOCUS_COLS = ["PTS", "TREB", "AST", "STL", "FT%"]
(
    df[FOCUS_COLS]
    .apply(zscore)
    .assign(
        ADP=df["ADP"],
        total_z=lambda df_: df_[FOCUS_COLS].sum(axis=1),
        new_rank=lambda df_: df_["total_z"].rank(ascending=False)
    )
    .sort_values("total_z", ascending=False)
    .head(50)
    [["ADP", "new_rank", *FOCUS_COLS, "total_z"]]
)
ADP new_rank PTS TREB AST STL FT% total_z
PLAYER
Nikola Jokic 1.1 1.0 1.427499 2.534388 2.994016 1.470340 0.457226 8.883470
LaMelo Ball 12.6 2.0 1.247166 0.551101 2.462605 2.108924 0.913282 7.283079
Luka Doncic 3.2 3.0 2.771800 1.310658 2.221055 1.151048 -0.244399 7.210161
Tyrese Haliburton 5.7 4.0 1.230773 -0.714827 3.380496 2.428216 0.878201 7.202859
James Harden 22.4 5.0 0.788137 0.382310 3.428806 0.831756 1.076995 6.508005
Joel Embiid 2.6 6.0 2.755406 1.901424 0.336963 0.512464 0.632632 6.138889
Shai Gilgeous-Alexander 6.8 7.0 2.263589 -0.292851 1.013303 1.789632 1.193932 5.967605
Trae Young 23.5 8.0 1.853741 -0.968013 3.138946 0.193172 1.322564 5.540409
Jayson Tatum 4.5 9.0 2.247195 1.057472 0.626823 0.512464 0.889895 5.333848
Dejounte Murray 33.1 10.0 0.804531 0.340113 1.399784 2.108924 0.468920 5.122272
Paul George 30.3 11.0 1.181591 0.171322 0.723443 1.789632 0.995139 4.861127
Anthony Edwards 14.6 12.0 1.738984 0.044729 0.675133 2.428216 -0.150849 4.736213
Domantas Sabonis 21.4 13.0 0.607804 2.829772 1.834575 -0.126120 -0.454887 4.691143
Kyrie Irving 15.2 14.0 1.788165 -0.377247 0.964993 0.831756 1.474583 4.682251
Giannis Antetokounmpo 10.1 15.0 2.378346 2.492191 1.061614 -0.126120 -1.156512 4.649518
Jimmy Butler 26.8 16.0 0.902894 0.002532 0.723443 2.108924 0.901589 4.639382
Donovan Mitchell 19.7 17.0 1.968498 -0.546037 0.433583 1.789632 0.913282 4.558959
Fred VanVleet 21.0 18.0 0.427471 -0.757025 1.399784 2.108924 1.240707 4.419862
Stephen Curry 6.6 19.0 2.001286 -0.039666 1.013303 -0.126120 1.544745 4.393549
Devin Booker 17.0 20.0 1.870135 -0.335049 1.351474 0.512464 0.924976 4.324000
Cade Cunningham 43.7 21.0 0.771743 0.297915 1.448094 1.151048 0.632632 4.301433
Damian Lillard 9.6 22.0 2.198013 -0.714827 1.737954 -0.445412 1.451195 4.226922
Darius Garland 41.3 23.0 0.984864 -1.136804 2.076125 0.831756 1.112076 3.868017
Anthony Davis 11.6 24.0 1.476681 2.407796 -0.339378 0.512464 -0.267787 3.789775
Ja Morant 75.4 25.0 1.755378 0.044729 1.737954 0.512464 -0.326256 3.724269
Kawhi Leonard 26.6 26.0 1.214379 0.213520 0.095412 1.151048 0.948364 3.622722
Jrue Holiday 38.2 27.0 0.460259 -0.377247 1.737954 1.470340 0.305207 3.596514
Bam Adebayo 35.6 28.0 0.722561 1.732634 -0.049518 1.151048 0.001169 3.557895
Desmond Bane 20.4 29.0 1.116015 -0.124061 0.240343 0.831756 1.264095 3.328148
Kevin Durant 10.8 30.0 1.558651 0.340113 0.723443 -0.764705 1.381032 3.238534
LeBron James 25.5 31.0 1.788165 0.804286 1.206544 -0.445412 -0.244399 3.109184
DeMar DeRozan 48.7 32.0 1.460287 -0.461642 0.675133 0.193172 1.030220 2.897170
De'Aaron Fox 40.7 33.0 1.525863 -0.630432 1.254854 0.831756 -0.092381 2.889660
Jalen Brunson 32.2 34.0 1.378318 -0.841420 1.448094 0.193172 0.585857 2.764020
Pascal Siakam 30.6 35.0 1.034046 0.888682 0.868373 0.193172 -0.221012 2.763260
Mikal Bridges 19.1 36.0 1.575045 -0.461642 -0.049518 0.512464 1.147157 2.723506
Khris Middleton 87.4 37.0 0.493047 -0.250654 0.916683 0.193172 1.275789 2.628037
Jaylen Brown 40.9 38.0 1.738984 0.424508 0.047102 0.512464 -0.150849 2.572208
Karl-Anthony Towns 27.8 39.0 0.968470 1.184065 0.530203 -0.764705 0.597551 2.515584
Julius Randle 57.0 40.0 1.165197 1.817029 0.578513 -0.764705 -0.302868 2.493166
Jamal Murray 43.4 41.0 0.853713 -0.672630 1.351474 0.193172 0.597551 2.323279
Zion Williamson 70.1 42.0 1.591438 0.466706 0.481893 0.512464 -0.794006 2.258495
Markelle Fultz 94.0 43.0 -0.228285 -0.714827 1.303164 1.789632 0.094719 2.244403
Brandon Ingram 50.8 44.0 1.197985 -0.081863 1.013303 -0.764705 0.819732 2.184452
Josh Giddey 64.0 45.0 0.247138 1.015274 1.448094 -0.126120 -0.688762 1.895624
Zach LaVine 52.8 46.0 1.509469 -0.461642 0.481893 -0.445412 0.796345 1.880652
Nikola Vucevic 35.7 47.0 0.263532 2.239005 -0.146138 -0.764705 0.281819 1.873514
Jordan Poole 53.5 48.0 1.017652 -0.925816 0.626823 -0.126120 1.275789 1.868328
Terry Rozier 83.4 49.0 0.624198 -0.672630 0.530203 0.831756 0.527388 1.840915
Chris Paul 68.4 50.0 -0.687315 -0.883618 1.931195 0.831756 0.620938 1.812957

A framework or starting point for evaluating trades

Even though I just said there's no objective valuation for fantasy basketball players, we can still try to establish some princples when it comes to conducting fair trades.

When trading, people quickly react with "X got fleeced". However, if it was so easy to identify X got fleeced, why would X have made the trade in the first place? It ultimately comes down to the values each player has on the new team.

For example, having notoriously-inefficient shooter like Fred Vanvleet is bad if you need to keep a high FG%, but great if you're looking for AST and STL. If you're looking to add FVV to your AST/STL focus, his "value" comes from how many z-scores of AST/STL by which he could increase your team. If you don't care about FG%, you don't need to look into his abysmal FG% z-score.

Conversely, if you're trying to build a reasonable trade offer for FVV, it helps to understand the team composition of your trade counterpart. If your trade counterpart is looking to optimize on something like BLK and PTS, then examine who on your roster can add as many BLK/PTS z-scores as FVV adds AST/STL z-scores. In summary, valuations of players for trades comes down to the dimensions/categories that are relevant for you (and then any personal opinions/availability outlook/player news that could affect projections).

Or, yes, you could try to fleece your opponent and trade a player with "value 10" for an unequivocally player with "value 15", but this is probably not the best way to conduct fantasy basketball trades. If you are successful, then this is certainly one way to try and increase the "net worth" of your team without any considerations for winning categories.

Building an interactive tool

I've updated the streamlit fantasy basketball dashboard to apply these ideas github repo here