Chapter 50 Advanced ~45 min read

College-to-Pro Translations

Converting college statistics to projected NBA performance levels.

The Translation Problem

College statistics exist in a different context than NBA statistics. Competition is weaker, pace is different, and roles are often more prominent. Simply comparing raw college stats to NBA stats misleads; proper comparison requires translation that accounts for these differences.

Translation Factors

Translation applies context-specific adjustments to convert college stats to NBA-equivalent values. Points, rebounds, and assists typically translate at 60-70% of college rates. Efficiency metrics require adjustment for increased competition. These translations are averages—individual players may outperform or underperform expected translations.

Competition Adjustments

Performance against strong competition predicts NBA success better than performance against weak competition. Adjusting college stats for schedule strength improves NBA projections. A player dominating mid-major competition may look great statistically but struggle against better athletes.

Role Projection

College roles often differ from likely NBA roles. A college team's primary scorer may become a role player in the NBA. Projecting likely NBA role helps evaluate whether a player's college skills will translate to their professional context.

Implementation in R

# Trade value analysis
library(tidyverse)

calculate_trade_value <- function(player_data) {
  player_data %>%
    mutate(
      # Current production value
      production_value = ws * 3.5,

      # Contract value (positive if team-friendly)
      contract_value = production_value - (salary / 1e6),

      # Age/potential adjustment
      age_factor = case_when(
        age < 24 ~ 1.3,
        age <= 27 ~ 1.1,
        age <= 30 ~ 1.0,
        age <= 33 ~ 0.8,
        TRUE ~ 0.5
      ),

      # Years remaining value
      control_value = years_remaining * 2,

      # Total trade value
      trade_value = (production_value * age_factor + contract_value +
                     control_value)
    )
}

players <- read_csv("player_contract_stats.csv")
trade_values <- calculate_trade_value(players)

# Highest trade values
top_trade_value <- trade_values %>%
  arrange(desc(trade_value)) %>%
  select(player_name, age, trade_value, production_value,
         contract_value) %>%
  head(20)

print(top_trade_value)

Implementation in Python

# Trade value analysis
import pandas as pd

def calculate_trade_value(player_data):
    df = player_data.copy()

    # Current production value
    df["production_value"] = df["ws"] * 3.5

    # Contract value
    df["contract_value"] = df["production_value"] - (df["salary"] / 1e6)

    # Age factor
    def age_factor(age):
        if age < 24: return 1.3
        if age <= 27: return 1.1
        if age <= 30: return 1.0
        if age <= 33: return 0.8
        return 0.5

    df["age_factor"] = df["age"].apply(age_factor)

    # Total trade value
    df["control_value"] = df["years_remaining"] * 2
    df["trade_value"] = (
        df["production_value"] * df["age_factor"] +
        df["contract_value"] + df["control_value"]
    )

    return df

players = pd.read_csv("player_contract_stats.csv")
trade_values = calculate_trade_value(players)
print(trade_values.nlargest(20, "trade_value"))

Implementation in R

# Trade value analysis
library(tidyverse)

calculate_trade_value <- function(player_data) {
  player_data %>%
    mutate(
      # Current production value
      production_value = ws * 3.5,

      # Contract value (positive if team-friendly)
      contract_value = production_value - (salary / 1e6),

      # Age/potential adjustment
      age_factor = case_when(
        age < 24 ~ 1.3,
        age <= 27 ~ 1.1,
        age <= 30 ~ 1.0,
        age <= 33 ~ 0.8,
        TRUE ~ 0.5
      ),

      # Years remaining value
      control_value = years_remaining * 2,

      # Total trade value
      trade_value = (production_value * age_factor + contract_value +
                     control_value)
    )
}

players <- read_csv("player_contract_stats.csv")
trade_values <- calculate_trade_value(players)

# Highest trade values
top_trade_value <- trade_values %>%
  arrange(desc(trade_value)) %>%
  select(player_name, age, trade_value, production_value,
         contract_value) %>%
  head(20)

print(top_trade_value)

Implementation in Python

# Trade value analysis
import pandas as pd

def calculate_trade_value(player_data):
    df = player_data.copy()

    # Current production value
    df["production_value"] = df["ws"] * 3.5

    # Contract value
    df["contract_value"] = df["production_value"] - (df["salary"] / 1e6)

    # Age factor
    def age_factor(age):
        if age < 24: return 1.3
        if age <= 27: return 1.1
        if age <= 30: return 1.0
        if age <= 33: return 0.8
        return 0.5

    df["age_factor"] = df["age"].apply(age_factor)

    # Total trade value
    df["control_value"] = df["years_remaining"] * 2
    df["trade_value"] = (
        df["production_value"] * df["age_factor"] +
        df["contract_value"] + df["control_value"]
    )

    return df

players = pd.read_csv("player_contract_stats.csv")
trade_values = calculate_trade_value(players)
print(trade_values.nlargest(20, "trade_value"))
Chapter Summary

You've completed Chapter 50: College-to-Pro Translations.