Resources
A short, opinionated list of further reading and tools.
Books
- The Psychology of Money, by Morgan Housel (Housel 2020)
- I Will Teach You to Be Rich (2nd ed.), by Ramit Sethi (Sethi 2019)
- The Algebra of Wealth, by Scott Galloway (Galloway 2024)
- The Little Book of Common Sense Investing, by John C. Bogle (Bogle 2017)
- The Simple Path to Wealth, by J. L. Collins (Collins 2016)
Podcasts & channels
- Rational Reminder: Ben Felix and Cameron Passmore’s evidence-based investing podcast (also on YouTube)
- Common Sense Investing: Ben Felix’s short-form video series at PWL Capital
- The Prof G Pod and Prof G Markets: Scott Galloway’s podcasts on business, markets, and personal finance
Blogs & sites
- morganhousel.com: Morgan Housel’s writing
- Collaborative Fund blog: where many Psychology of Money essays first appeared
- iwillteachyoutoberich.com: Ramit Sethi’s site, including the Conscious Spending Plan
- PWL Capital research: Ben Felix’s firm publishes white papers on housing, factor investing, and human capital
- profgalloway.com: Scott Galloway’s weekly No Mercy / No Malice newsletter and writing
Communities
- r/personalfinance: the wiki is unusually good
- Bogleheads: forum and wiki around low-cost index investing, the community John Bogle inspired
Tools
- Spreadsheets (Google Sheets / Excel): still the most flexible option
- Account aggregators (Monarch, Copilot, YNAB)
References
Color Palette
The mermaid diagrams throughout this book use a consistent Atomic Age / Mid-Century Modern palette. Each color is assigned to a semantic role:
| Role | Color Name | Hex | Text | Usage |
|---|---|---|---|---|
| green | Forest Green | #48a56a |
#F5F2E8 |
Root / start / end nodes |
| primary | Ocean Teal | #0e9aa7 |
#F5F2E8 |
Process and action nodes |
| decision | Blush Pink | #f0cfcf |
#1C1C1E |
Decision / branching nodes |
| outcome | Mint | #86ddcd |
#1C1C1E |
Positive result nodes |
| warn | Atomic Red | #f44242 |
#F5F2E8 |
Warning / negative nodes |
| — | Space Black | #1C1C1E |
— | Borders, arrows, body text |
| — | Cream | #F5F2E8 |
— | Light text on dark fills |
Notable Differences Between R and Python
The differences below haven’t yet been placed in a chapter callout — either because the chapter that would naturally introduce the concept hasn’t been written yet, or because the existing chapters don’t use the concept in code. As each chapter is completed, the relevant entry will be moved into that chapter’s Math section.
String Formatting
R uses paste(), paste0(), sprintf(), or glue::glue() for string construction.
Python uses f-strings, the .format() method, or % formatting.
name <- "John"
paste0("Hello, ", name)
glue::glue("Hello, {name}")name = "John"
f"Hello, {name}"Whitespace Rules
Spaces, line breaks, and indentation are flexible and stylistic in R.
In Python, indentation is syntactic (inconsistent indentation raises an IndentationError). Blank lines are ignored but can be used to separate code blocks for readability.
# R — all of this is valid
# and produces the same result
# Clean, conventional style
if (x > 0) {
result <- x * 2
print(result)
}
# Messy but still valid
if(x>0){result<-x*2
print(result)}
# Extreme and ugly but works
if ( x > 0 ) {
result <-x*2
print( result )
}# Python — indentation matters
# Correct: consistent 4-space
# indentation
if x > 0:
result = x * 2
print(result)
# Blank lines are fine —
# they improve readability
def process(x):
if x > 0:
result = x * 2
print(result)
return result
# Raises IndentationError
if x > 0:
result = x * 2
print(result) # ❌ bad indentIndexing
R uses 1-based indexing.
Python uses 0-based indexing.
vec <- c("a", "b", "c")
vec[1] # returns "a"lst = ["a", "b", "c"]
lst[0] # returns "a"Missing Values
R uses NA (with variants like NA_integer_, NA_character_), plus NULL and NaN.
Python uses None natively; polars represents missing values as null in its columnar data structures.
x <- c(1, NA, 3)
is.na(x)import polars as pl
s = pl.Series([1, None, 3])
s.is_null()Package Management
In R, packages are installed with install.packages() and loaded with library().
In Python, packages are installed via pip or conda from the terminal and loaded with import.
install.packages("dplyr")
library(dplyr)# terminal: pip install polars
import polars as plComments
In R, comments are single-line only, using #. No multi-line comment syntax.
In Python, single-line comments use #. Triple-quoted strings ("""...""") are commonly used as block comments or docstrings.
# This is a comment# This is a comment
"""
This is a multi-line
comment or docstring.
"""