From 2aafc94ad5ed3c8f5bdf08fb61518c868db9813d Mon Sep 17 00:00:00 2001 From: igerber Date: Sun, 15 Mar 2026 17:55:39 -0400 Subject: [PATCH 1/2] Add EfficientDiD v2.7 LinkedIn carousel PDF generator 8-slide dark-themed carousel (4:5 portrait) targeting applied researchers. Highlights EfficientDiD as the first open-source implementation of Chen, Sant'Anna & Xie (2025), with slides covering the problem, insight, PT-All assumption, efficiency payoff, API code, safety net, and CTA. Co-Authored-By: Claude Opus 4.6 (1M context) --- carousel/diff-diff-v27-carousel.pdf | Bin 0 -> 93081 bytes carousel/generate_v27_pdf.py | 776 ++++++++++++++++++++++++++++ 2 files changed, 776 insertions(+) create mode 100644 carousel/diff-diff-v27-carousel.pdf create mode 100644 carousel/generate_v27_pdf.py diff --git a/carousel/diff-diff-v27-carousel.pdf b/carousel/diff-diff-v27-carousel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aa4bb448712863b2561d3556cb54ce06326b56e2 GIT binary patch literal 93081 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

25{Aaoxt7K{r9F+KSEGZIZX1Z11AC9VDv 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 literal 0 HcmV?d00001 diff --git a/carousel/generate_v27_pdf.py b/carousel/generate_v27_pdf.py new file mode 100644 index 00000000..c99d70a6 --- /dev/null +++ b/carousel/generate_v27_pdf.py @@ -0,0 +1,776 @@ +#!/usr/bin/env python3 +"""Generate LinkedIn carousel PDF for diff-diff v2.7 release.""" + +import os +import tempfile +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +import matplotlib.patches as mpatches # noqa: E402 +import numpy as np # noqa: E402 +from PIL import Image as PILImage # noqa: E402 + +from fpdf import FPDF # noqa: E402 + +# Computer Modern for math +plt.rcParams["mathtext.fontset"] = "cm" + +# Page dimensions (4:5 portrait) +WIDTH = 270 # mm +HEIGHT = 337.5 # mm + +# Dark theme palette +BG = (26, 26, 46) # #1a1a2e +CYAN = (0, 212, 255) # #00d4ff +WHITE = (255, 255, 255) # #ffffff +GRAY = (136, 146, 176) # #8892b0 +DARK_PANEL = (22, 33, 62) # #16213e +ORANGE = (255, 107, 53) # #ff6b35 +GREEN = (80, 250, 123) # #50fa7b +GOLD = (241, 250, 140) # #f1fa8c + +# Hex colors for matplotlib +CYAN_HEX = "#00d4ff" +WHITE_HEX = "#ffffff" +GRAY_HEX = "#8892b0" +DARK_PANEL_HEX = "#16213e" +ORANGE_HEX = "#ff6b35" + + +class CarouselV27PDF(FPDF): + def __init__(self): + super().__init__(orientation="P", unit="mm", format=(WIDTH, HEIGHT)) + self.set_auto_page_break(False) + self._temp_files = [] + + def cleanup(self): + """Remove temporary image files.""" + for f in self._temp_files: + try: + os.unlink(f) + except OSError: + pass + + # ── Background & Footer ──────────────────────────────────────── + + def _add_dark_bg(self): + """Fill page with dark background.""" + self.set_fill_color(*BG) + self.rect(0, 0, WIDTH, HEIGHT, "F") + + def _add_footer(self): + """Add footer with cyan rule and version text.""" + rule_y = HEIGHT - 28 + self.set_draw_color(*CYAN) + self.set_line_width(0.5) + self.line(50, rule_y, WIDTH - 50, rule_y) + + self.set_font("Helvetica", "B", 12) + dd_text = "diff-diff " + v_text = "v2.7" + dd_w = self.get_string_width(dd_text) + v_w = self.get_string_width(v_text) + start_x = (WIDTH - dd_w - v_w) / 2 + + self.set_xy(start_x, HEIGHT - 22) + self.set_text_color(*GRAY) + self.cell(dd_w, 10, dd_text) + self.set_text_color(*CYAN) + self.cell(v_w, 10, v_text) + + # ── Text Helpers ─────────────────────────────────────────────── + + def _centered_text(self, y, text, size=28, bold=True, color=WHITE): + """Add centered text.""" + self.set_xy(0, y) + self.set_font("Helvetica", "B" if bold else "", size) + self.set_text_color(*color) + self.cell(WIDTH, size * 0.5, text, align="C") + + # ── Equation Rendering ───────────────────────────────────────── + + def _render_equations(self, latex_lines, fontsize=28, color=CYAN_HEX): + """Render LaTeX equations to transparent PNG.""" + n = len(latex_lines) + fig_h = max(0.7, 0.55 * n + 0.15) + fig = plt.figure(figsize=(10, fig_h)) + + for i, line in enumerate(latex_lines): + y_frac = 1.0 - (2 * i + 1) / (2 * n) + fig.text( + 0.5, y_frac, line, + fontsize=fontsize, ha="center", va="center", + color=color, + ) + + fig.patch.set_alpha(0) + fd, path = tempfile.mkstemp(suffix=".png") + os.close(fd) + fig.savefig(path, dpi=250, bbox_inches="tight", pad_inches=0.06, + transparent=True) + plt.close(fig) + + with PILImage.open(path) as img: + pw, ph = img.size + + self._temp_files.append(path) + return path, pw, ph + + def _place_equation_centered(self, path, pw, ph, y, max_w=200): + """Place equation image centered on page at given y.""" + aspect = ph / pw + display_w = min(max_w, WIDTH * 0.75) + display_h = display_w * aspect + eq_x = (WIDTH - display_w) / 2 + self.image(path, eq_x, y, display_w) + return display_h + + # ── Diagram: Single Comparison (Slide 2) ─────────────────────── + + def _render_single_comparison(self): + """ATT(g,t) -> single arrow -> one comparison box.""" + fig, ax = plt.subplots(figsize=(9, 2.5)) + ax.set_xlim(0, 10) + ax.set_ylim(0, 2.5) + ax.set_aspect("equal") + ax.axis("off") + fig.patch.set_alpha(0) + ax.set_facecolor("none") + + # ATT box (left) + att = mpatches.FancyBboxPatch( + (0.3, 0.5), 3.2, 1.5, boxstyle="round,pad=0.2", + facecolor="none", edgecolor=CYAN_HEX, linewidth=2.5, + ) + ax.add_patch(att) + ax.text(1.9, 1.25, r"$ATT(g,\,t)$", color=CYAN_HEX, + fontsize=24, ha="center", va="center", fontweight="bold") + + # Arrow + ax.annotate( + "", xy=(6.8, 1.25), xytext=(3.8, 1.25), + arrowprops=dict(arrowstyle="->", color=GRAY_HEX, lw=2.5, + mutation_scale=20), + ) + + # Comparison box (right) + comp = mpatches.FancyBboxPatch( + (6.5, 0.5), 3.2, 1.5, boxstyle="round,pad=0.2", + facecolor="none", edgecolor=GRAY_HEX, linewidth=2, + ) + ax.add_patch(comp) + ax.text(8.1, 1.25, r"$(g',\, t_{pre})$", color=GRAY_HEX, + fontsize=22, ha="center", va="center") + + fd, path = tempfile.mkstemp(suffix=".png") + os.close(fd) + fig.savefig(path, dpi=200, bbox_inches="tight", pad_inches=0.1, + transparent=True) + plt.close(fig) + + with PILImage.open(path) as img: + pw, ph = img.size + + self._temp_files.append(path) + return path, pw, ph + + # ── Diagram: Fan of Comparisons (Slide 3) ───────────────────── + + def _render_fan_comparison(self): + """ATT(g,t) -> fan of arrows -> multiple comparison boxes.""" + fig, ax = plt.subplots(figsize=(9, 5)) + ax.set_xlim(0, 10) + ax.set_ylim(-0.2, 5.2) + ax.set_aspect("equal") + ax.axis("off") + fig.patch.set_alpha(0) + ax.set_facecolor("none") + + # ATT box (left, vertically centered) + att = mpatches.FancyBboxPatch( + (0.2, 1.75), 3.2, 1.5, boxstyle="round,pad=0.2", + facecolor="none", edgecolor=CYAN_HEX, linewidth=2.5, + ) + ax.add_patch(att) + ax.text(1.8, 2.5, r"$ATT(g,\,t)$", color=CYAN_HEX, + fontsize=24, ha="center", va="center", fontweight="bold") + + # Fan of comparison boxes + labels = [ + r"$(g_1,\, t_1)$", + r"$(g_2,\, t_2)$", + r"$(g_3,\, t_3)$", + r"$(g_4,\, t_4)$", + r"$(g_5,\, t_5)$", + ] + y_positions = np.linspace(4.5, 0.5, len(labels)) + + for label, yp in zip(labels, y_positions): + ax.annotate( + "", xy=(6.5, yp), xytext=(3.6, 2.5), + arrowprops=dict(arrowstyle="->", color=CYAN_HEX, lw=1.8, + alpha=0.7, mutation_scale=15), + ) + box = mpatches.FancyBboxPatch( + (6.3, yp - 0.4), 3.4, 0.8, boxstyle="round,pad=0.1", + facecolor="none", edgecolor=GRAY_HEX, linewidth=1.5, + ) + ax.add_patch(box) + ax.text(8.0, yp, label, color=GRAY_HEX, + fontsize=15, ha="center", va="center") + + fd, path = tempfile.mkstemp(suffix=".png") + os.close(fd) + fig.savefig(path, dpi=200, bbox_inches="tight", pad_inches=0.1, + transparent=True) + plt.close(fig) + + with PILImage.open(path) as img: + pw, ph = img.size + + self._temp_files.append(path) + return path, pw, ph + + # ── CI Comparison (Slide 4) ──────────────────────────────────── + + def _render_ci_comparison(self): + """Two horizontal CI bars: CS (wider, orange) vs EDiD (narrower, cyan).""" + fig, ax = plt.subplots(figsize=(8, 3.5)) + ax.set_xlim(-4, 5) + ax.set_ylim(-0.5, 3) + ax.axis("off") + fig.patch.set_alpha(0) + ax.set_facecolor("none") + + point_est = 0.8 + + # CS bar (wider, orange) + cs_lo, cs_hi = -1.5, 3.1 + cs_y = 2.0 + ax.plot([cs_lo, cs_hi], [cs_y, cs_y], color=ORANGE_HEX, linewidth=7, + solid_capstyle="round") + ax.plot(point_est, cs_y, "o", color=ORANGE_HEX, markersize=14, + zorder=5) + ax.text(-3.8, cs_y, "Callaway-\nSant'Anna", color=ORANGE_HEX, + fontsize=14, ha="left", va="center", fontweight="bold") + + # EDiD bar (narrower, cyan) + edid_lo, edid_hi = 0.0, 1.6 + edid_y = 0.7 + ax.plot([edid_lo, edid_hi], [edid_y, edid_y], color=CYAN_HEX, + linewidth=7, solid_capstyle="round") + ax.plot(point_est, edid_y, "o", color=CYAN_HEX, markersize=14, + zorder=5) + ax.text(-3.8, edid_y, "EfficientDiD", color=CYAN_HEX, + fontsize=14, ha="left", va="center", fontweight="bold") + + # Reference line at point estimate + ax.axvline(point_est, color=GRAY_HEX, linewidth=1.2, linestyle="--", + alpha=0.6) + + fd, path = tempfile.mkstemp(suffix=".png") + os.close(fd) + fig.savefig(path, dpi=200, bbox_inches="tight", pad_inches=0.15, + transparent=True) + plt.close(fig) + + with PILImage.open(path) as img: + pw, ph = img.size + + self._temp_files.append(path) + return path, pw, ph + + # ── Code Block (Slide 5) ─────────────────────────────────────── + + def _add_code_block(self, x, y, w, token_lines, font_size=13, + line_height=12): + """Render syntax-highlighted code on a dark panel. + + token_lines: list of lists of (text, color_tuple) pairs per line. + """ + n_lines = len(token_lines) + total_h = n_lines * line_height + 24 + + # Dark panel + self.set_fill_color(*DARK_PANEL) + self.rect(x, y, w, total_h, "F") + + self.set_font("Courier", "", font_size) + char_w = self.get_string_width("M") + + pad_x = 15 + pad_y = 12 + + for i, tokens in enumerate(token_lines): + cx = x + pad_x + cy = y + pad_y + i * line_height + + for text, color in tokens: + if not text: + continue + self.set_xy(cx, cy) + self.set_text_color(*color) + self.cell(char_w * len(text), 10, text) + cx += char_w * len(text) + + return total_h + + # ════════════════════════════════════════════════════════════════ + # SLIDES + # ════════════════════════════════════════════════════════════════ + + def slide_01_hook(self): + """Slide 1: Hook — First open-source implementation.""" + self.add_page() + self._add_dark_bg() + + # Hero — method name dominates the page + self._centered_text(55, "Efficient DiD", size=52, color=CYAN) + + # Positioning statement + self._centered_text(118, "First & Only", size=30, color=WHITE) + self._centered_text(150, "Open-Source Implementation", size=30, + color=WHITE) + + # Badge + badge_w = 170 + badge_h = 34 + badge_x = (WIDTH - badge_w) / 2 + badge_y = 195 + self.set_draw_color(*CYAN) + self.set_line_width(1.5) + self.rect(badge_x, badge_y, badge_w, badge_h, "D") + + self.set_xy(badge_x, badge_y + 8) + self.set_font("Helvetica", "B", 20) + self.set_text_color(*CYAN) + self.cell(badge_w, 16, "diff-diff v2.7", align="C") + + # Citation + self.set_xy(0, 247) + self.set_font("Helvetica", "I", 17) + self.set_text_color(*GRAY) + self.cell(WIDTH, 10, "Chen, Sant'Anna & Xie (2025)", align="C") + + # Tagline + self._centered_text(278, "Semiparametric efficiency bound", + size=17, bold=False, color=GRAY) + self._centered_text(295, "for staggered DiD", + size=17, bold=False, color=GRAY) + + self._add_footer() + + def slide_02_problem(self): + """Slide 2: The Problem — single comparison per target.""" + self.add_page() + self._add_dark_bg() + + self._centered_text(30, "The Problem", size=38, color=WHITE) + + # Body text + self._centered_text(80, "Standard staggered DiD uses one", size=18, + bold=False, color=GRAY) + self._centered_text(100, "comparison per target effect --", size=18, + bold=False, color=GRAY) + self._centered_text(120, "leaving valid information unused.", size=18, + bold=False, color=GRAY) + + # Diagram + diag_path, dpw, dph = self._render_single_comparison() + diag_w = WIDTH * 0.82 + diag_aspect = dph / dpw + diag_h = diag_w * diag_aspect + diag_x = (WIDTH - diag_w) / 2 + diag_y = 155 + self.image(diag_path, diag_x, diag_y, diag_w) + + # Label + self._centered_text(diag_y + diag_h + 10, + "Single 2x2 comparison (CS default)", + size=16, bold=False, color=GRAY) + + self._add_footer() + + def slide_03_insight(self): + """Slide 3: The Insight — multiple valid comparisons, GLS weights.""" + self.add_page() + self._add_dark_bg() + + self._centered_text(25, "The Insight", size=38, color=WHITE) + + # Body text + self._centered_text(68, "Under PT-All, multiple valid comparisons", + size=17, bold=False, color=GRAY) + self._centered_text(86, "exist. EDiD finds the optimal combination.", + size=17, bold=False, color=GRAY) + + # Fan diagram + fan_path, fpw, fph = self._render_fan_comparison() + fan_w = WIDTH * 0.78 + fan_aspect = fph / fpw + fan_h = fan_w * fan_aspect + fan_x = (WIDTH - fan_w) / 2 + fan_y = 105 + self.image(fan_path, fan_x, fan_y, fan_w) + + # Equation + eq_path, epw, eph = self._render_equations( + [r"$w^* = \frac{\mathbf{1}' \Omega^{*-1}" + r"}{\mathbf{1}' \Omega^{*-1} \mathbf{1}}$"], + fontsize=34, + ) + eq_y = fan_y + fan_h + 8 + eq_h = self._place_equation_centered(eq_path, epw, eph, eq_y, + max_w=180) + + # Label + self._centered_text(eq_y + eq_h + 8, "GLS optimal weighting", + size=16, bold=True, color=CYAN) + + self._add_footer() + + def slide_04_assumption(self): + """Slide 4: The Assumption — what PT-All means and when it holds.""" + self.add_page() + self._add_dark_bg() + + self._centered_text(25, "The Assumption", size=38, color=WHITE) + self._centered_text(58, "Parallel Trends for All Groups", size=22, + bold=True, color=CYAN) + + # Definition (single line) + self._centered_text(92, "All cohorts share common outcome trends,", + size=17, bold=False, color=GRAY) + self._centered_text(110, "treated or not.", size=17, bold=False, + color=GRAY) + + # Two comparison panels + margin = 28 + gap = 12 + panel_w = (WIDTH - margin * 2 - gap) / 2 + panel_h = 65 + panel_y = 132 + + panels = [ + { + "x": margin, + "label": "PT-Post", + "label_color": ORANGE, + "line1": "Trends hold between treated", + "line2": "cohort and comparison group", + "result": "= Callaway-Sant'Anna", + }, + { + "x": margin + panel_w + gap, + "label": "PT-All", + "label_color": CYAN, + "line1": "Trends hold across all", + "line2": "cohorts, treated or not", + "result": "= EfficientDiD", + }, + ] + + for panel in panels: + px = panel["x"] + + # Panel background + self.set_fill_color(*DARK_PANEL) + self.set_draw_color(*panel["label_color"]) + self.set_line_width(1.2) + self.rect(px, panel_y, panel_w, panel_h, "DF") + + # Label badge centered at top edge + badge_w = 70 + badge_h = 18 + badge_x = px + (panel_w - badge_w) / 2 + badge_y = panel_y - badge_h / 2 + self.set_fill_color(*panel["label_color"]) + self.rect(badge_x, badge_y, badge_w, badge_h, "F") + self.set_xy(badge_x, badge_y + 3) + self.set_font("Helvetica", "B", 11) + self.set_text_color(*BG) + self.cell(badge_w, 12, panel["label"], align="C") + + # Description lines + self.set_font("Helvetica", "", 15) + self.set_text_color(*WHITE) + self.set_xy(px + 10, panel_y + 14) + self.cell(panel_w - 20, 10, panel["line1"]) + self.set_xy(px + 10, panel_y + 28) + self.cell(panel_w - 20, 10, panel["line2"]) + + # Result + self.set_xy(px + 10, panel_y + 46) + self.set_font("Helvetica", "B", 14) + self.set_text_color(*panel["label_color"]) + self.cell(panel_w - 20, 10, panel["result"]) + + # "When does PT-All hold?" + section_y = panel_y + panel_h + 16 + self._centered_text(section_y, "When does PT-All hold?", size=20, + bold=True, color=WHITE) + + examples = [ + "Staggered policy rollouts across regions", + "Administrative or geographic phasing", + "Treatment timing unrelated to anticipated effects", + ] + + y_cursor = section_y + 26 + for example in examples: + self.set_xy(50, y_cursor) + self.set_font("Helvetica", "B", 14) + self.set_text_color(*CYAN) + self.cell(10, 10, "-") + self.set_font("Helvetica", "", 14) + self.set_text_color(*GRAY) + self.cell(WIDTH - 100, 10, example) + y_cursor += 18 + + self._add_footer() + + def slide_04_payoff(self): + """Slide 4: The Payoff — tightest possible CIs.""" + self.add_page() + self._add_dark_bg() + + self._centered_text(30, "The Payoff", size=38, color=WHITE) + + # Body text + self._centered_text(78, "Achieves the semiparametric efficiency", + size=18, bold=False, color=GRAY) + self._centered_text(98, "bound -- tightest possible", size=18, + bold=False, color=GRAY) + self._centered_text(118, "confidence intervals.", size=18, + bold=False, color=GRAY) + + # CI comparison + ci_path, cpw, cph = self._render_ci_comparison() + ci_w = WIDTH * 0.82 + ci_aspect = cph / cpw + ci_h = ci_w * ci_aspect + ci_x = (WIDTH - ci_w) / 2 + ci_y = 145 + self.image(ci_path, ci_x, ci_y, ci_w) + + # Annotation + ann_y = ci_y + ci_h + 15 + self.set_xy(0, ann_y) + self.set_font("Helvetica", "I", 16) + self.set_text_color(*GRAY) + self.cell(WIDTH, 10, + '"Often exceeding 40% gains in precision"', + align="C") + + self.set_xy(0, ann_y + 20) + self.set_font("Helvetica", "", 14) + self.set_text_color(*GRAY) + self.cell(WIDTH, 10, + "-- Chen, Sant'Anna & Xie (2025)", + align="C") + + self._add_footer() + + def slide_05_code(self): + """Slide 5: The Code — syntax-highlighted API example.""" + self.add_page() + self._add_dark_bg() + + self._centered_text(30, "The Code", size=38, color=WHITE) + + margin = 28 + code_y = 80 + + token_lines = [ + [("from", CYAN), (" diff_diff ", WHITE), + ("import", CYAN), (" EfficientDiD", GOLD)], + [], # blank line + [("edid", WHITE), (" = ", WHITE), ("EfficientDiD", GOLD), + ("(", WHITE), ("pt_assumption", WHITE), ("=", WHITE), + ('"all"', GREEN), (")", WHITE)], + [("results", WHITE), (" = edid.fit(data, ", WHITE), + ("outcome", WHITE), ("=", WHITE), ('"y"', GREEN), + (",", WHITE)], + [(" ", WHITE), ("unit", WHITE), + ("=", WHITE), ('"id"', GREEN), (", ", WHITE), + ("time", WHITE), ("=", WHITE), ('"t"', GREEN), + (",", WHITE)], + [(" ", WHITE), ("first_treat", WHITE), + ("=", WHITE), ('"g"', GREEN), (",", WHITE)], + [(" ", WHITE), ("aggregate", WHITE), + ("=", WHITE), ('"all"', GREEN), (")", WHITE)], + [("results", WHITE), (".print_summary()", WHITE)], + ] + + code_h = self._add_code_block( + margin, code_y, WIDTH - margin * 2, token_lines, + ) + + # Subtitle + self._centered_text(code_y + code_h + 18, + "sklearn-like API", size=18, bold=False, + color=GRAY) + + self._add_footer() + + def slide_06_safety_net(self): + """Slide 6: Safety Net — PT-Post reduces to CS.""" + self.add_page() + self._add_dark_bg() + + self._centered_text(30, "Safety Net", size=38, color=WHITE) + + # Body text + self._centered_text(78, "Under PT-Post, reduces exactly to", + size=18, bold=False, color=GRAY) + self._centered_text(100, "Callaway-Sant'Anna", size=22, bold=True, + color=CYAN) + + # Comparison table + table_margin = 35 + table_w = WIDTH - table_margin * 2 + table_y = 135 + col_w = table_w / 3 + row_h = 28 + header_h = 30 + + # Table background + total_h = header_h + 3 * row_h + self.set_fill_color(*DARK_PANEL) + self.rect(table_margin, table_y, table_w, total_h, "F") + + # Header row + headers = ["", "CS (PT-Post)", "EDiD (PT-Post)"] + self.set_font("Helvetica", "B", 14) + for j, header in enumerate(headers): + x = table_margin + j * col_w + self.set_xy(x, table_y + 5) + self.set_text_color(*CYAN) + self.cell(col_w, 18, header, align="C") + + # Header rule + self.set_draw_color(*CYAN) + self.set_line_width(0.5) + rule_y = table_y + header_h + self.line(table_margin + 8, rule_y, table_margin + table_w - 8, + rule_y) + + # Data rows + rows = [ + ("ATT estimate", "1.234", "1.234"), + ("Standard error", "0.456", "0.456"), + ("95% CI", "[0.34, 2.13]", "[0.34, 2.13]"), + ] + + for i, (label, cs_val, edid_val) in enumerate(rows): + y = table_y + header_h + i * row_h + 5 + + # Label + self.set_xy(table_margin, y) + self.set_font("Helvetica", "", 15) + self.set_text_color(*GRAY) + self.cell(col_w, 16, " " + label, align="L") + + # CS value + self.set_xy(table_margin + col_w, y) + self.set_text_color(*WHITE) + self.cell(col_w, 16, cs_val, align="C") + + # EDiD value + self.set_xy(table_margin + 2 * col_w, y) + self.set_text_color(*WHITE) + self.cell(col_w, 16, edid_val, align="C") + + # "Identical" badge below table (cyan outline, matching slide 1 style) + badge_y = table_y + total_h + 15 + badge_w = 130 + badge_h = 28 + badge_x = (WIDTH - badge_w) / 2 + self.set_draw_color(*CYAN) + self.set_line_width(1.5) + self.rect(badge_x, badge_y, badge_w, badge_h, "D") + self.set_xy(badge_x, badge_y + 5) + self.set_font("Helvetica", "B", 16) + self.set_text_color(*CYAN) + self.cell(badge_w, 16, "= identical", align="C") + + # Footnote + self.set_xy(0, badge_y + badge_h + 18) + self.set_font("Helvetica", "I", 14) + self.set_text_color(*GRAY) + self.cell(WIDTH, 10, + "Corollary 3.2, Chen, Sant'Anna & Xie (2025)", + align="C") + + self._add_footer() + + def slide_07_cta(self): + """Slide 7: CTA — Get Started.""" + self.add_page() + self._add_dark_bg() + + self._centered_text(55, "Get Started", size=42, color=WHITE) + + # pip install badge + badge_w = 210 + badge_h = 36 + badge_x = (WIDTH - badge_w) / 2 + badge_y = 115 + self.set_fill_color(*CYAN) + self.rect(badge_x, badge_y, badge_w, badge_h, "F") + + self.set_xy(badge_x, badge_y + 9) + self.set_font("Courier", "B", 16) + self.set_text_color(*BG) + self.cell(badge_w, 16, "pip install diff-diff", align="C") + + # Links + self._centered_text(178, "github.com/igerber/diff-diff", + size=18, color=CYAN) + self._centered_text(205, "arXiv:2506.17729", + size=18, color=CYAN) + + # Wordmark + self.set_font("Helvetica", "B", 36) + dd_text = "diff-diff " + v_text = "v2.7" + dd_w = self.get_string_width(dd_text) + v_w = self.get_string_width(v_text) + start_x = (WIDTH - dd_w - v_w) / 2 + + self.set_xy(start_x, 255) + self.set_text_color(*WHITE) + self.cell(dd_w, 20, dd_text) + self.set_text_color(*CYAN) + self.cell(v_w, 20, v_text) + + # Subtitle + self._centered_text(288, "Difference-in-Differences for Python", + size=15, bold=False, color=GRAY) + + self._add_footer() + + +def main(): + pdf = CarouselV27PDF() + + pdf.slide_01_hook() + pdf.slide_02_problem() + pdf.slide_03_insight() + pdf.slide_04_assumption() + pdf.slide_04_payoff() + pdf.slide_05_code() + pdf.slide_06_safety_net() + pdf.slide_07_cta() + + output_path = Path(__file__).parent / "diff-diff-v27-carousel.pdf" + pdf.output(str(output_path)) + print(f"PDF saved to: {output_path}") + + pdf.cleanup() + + +if __name__ == "__main__": + main() From 784f067478bdd2f87bfc0c1b75edb447f99f253e Mon Sep 17 00:00:00 2001 From: igerber Date: Sun, 15 Mar 2026 18:25:08 -0400 Subject: [PATCH 2/2] Address AI review feedback on v2.7 carousel - Narrow PT-Post equivalence claims to post-treatment ATT (P1) - Replace fabricated SE/CI table with scoped equivalence statement - Soften "First & Only" to "First Open-Source" (P3) - Fix slide method numbering to match actual positions (P3) - Fix equation rendering for GLS optimal weight formula - Tighten slide 5 text spacing Co-Authored-By: Claude Opus 4.6 (1M context) --- carousel/diff-diff-v27-carousel.pdf | Bin 93081 -> 96371 bytes carousel/generate_v27_pdf.py | 125 ++++++++-------------------- 2 files changed, 34 insertions(+), 91 deletions(-) diff --git a/carousel/diff-diff-v27-carousel.pdf b/carousel/diff-diff-v27-carousel.pdf index aa4bb448712863b2561d3556cb54ce06326b56e2..dd436b2aba4f8355a46c410989b40b89fb8a008c 100644 GIT binary patch delta 16879 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 diff --git a/carousel/generate_v27_pdf.py b/carousel/generate_v27_pdf.py index c99d70a6..58c7a119 100644 --- a/carousel/generate_v27_pdf.py +++ b/carousel/generate_v27_pdf.py @@ -330,9 +330,8 @@ def slide_01_hook(self): self._centered_text(55, "Efficient DiD", size=52, color=CYAN) # Positioning statement - self._centered_text(118, "First & Only", size=30, color=WHITE) - self._centered_text(150, "Open-Source Implementation", size=30, - color=WHITE) + self._centered_text(118, "First Open-Source", size=30, color=WHITE) + self._centered_text(150, "Implementation", size=30, color=WHITE) # Badge badge_w = 170 @@ -417,8 +416,8 @@ def slide_03_insight(self): # Equation eq_path, epw, eph = self._render_equations( - [r"$w^* = \frac{\mathbf{1}' \Omega^{*-1}" - r"}{\mathbf{1}' \Omega^{*-1} \mathbf{1}}$"], + [r"$w^* = \frac{\mathbf{1}' (\Omega^*)^{-1}" + r"}{\mathbf{1}' (\Omega^*)^{-1} \mathbf{1}}$"], fontsize=34, ) eq_y = fan_y + fan_h + 8 @@ -460,7 +459,7 @@ def slide_04_assumption(self): "label_color": ORANGE, "line1": "Trends hold between treated", "line2": "cohort and comparison group", - "result": "= Callaway-Sant'Anna", + "result": "= CS post-treatment ATT", }, { "x": margin + panel_w + gap, @@ -531,20 +530,18 @@ def slide_04_assumption(self): self._add_footer() - def slide_04_payoff(self): - """Slide 4: The Payoff — tightest possible CIs.""" + def slide_05_payoff(self): + """Slide 5: The Payoff — tightest possible CIs.""" self.add_page() self._add_dark_bg() self._centered_text(30, "The Payoff", size=38, color=WHITE) # Body text - self._centered_text(78, "Achieves the semiparametric efficiency", + self._centered_text(80, "Achieves the semiparametric efficiency bound", + size=18, bold=False, color=GRAY) + self._centered_text(98, "-- tightest possible confidence intervals.", size=18, bold=False, color=GRAY) - self._centered_text(98, "bound -- tightest possible", size=18, - bold=False, color=GRAY) - self._centered_text(118, "confidence intervals.", size=18, - bold=False, color=GRAY) # CI comparison ci_path, cpw, cph = self._render_ci_comparison() @@ -573,8 +570,8 @@ def slide_04_payoff(self): self._add_footer() - def slide_05_code(self): - """Slide 5: The Code — syntax-highlighted API example.""" + def slide_06_code(self): + """Slide 6: The Code — syntax-highlighted API example.""" self.add_page() self._add_dark_bg() @@ -615,89 +612,35 @@ def slide_05_code(self): self._add_footer() - def slide_06_safety_net(self): - """Slide 6: Safety Net — PT-Post reduces to CS.""" + def slide_07_safety_net(self): + """Slide 7: Safety Net — PT-Post post-treatment ATT matches CS.""" self.add_page() self._add_dark_bg() self._centered_text(30, "Safety Net", size=38, color=WHITE) - # Body text - self._centered_text(78, "Under PT-Post, reduces exactly to", + # Body text — scoped to post-treatment ATT + self._centered_text(78, "Under PT-Post, post-treatment ATT(g,t)", size=18, bold=False, color=GRAY) - self._centered_text(100, "Callaway-Sant'Anna", size=22, bold=True, - color=CYAN) - - # Comparison table - table_margin = 35 - table_w = WIDTH - table_margin * 2 - table_y = 135 - col_w = table_w / 3 - row_h = 28 - header_h = 30 - - # Table background - total_h = header_h + 3 * row_h - self.set_fill_color(*DARK_PANEL) - self.rect(table_margin, table_y, table_w, total_h, "F") - - # Header row - headers = ["", "CS (PT-Post)", "EDiD (PT-Post)"] - self.set_font("Helvetica", "B", 14) - for j, header in enumerate(headers): - x = table_margin + j * col_w - self.set_xy(x, table_y + 5) - self.set_text_color(*CYAN) - self.cell(col_w, 18, header, align="C") - - # Header rule - self.set_draw_color(*CYAN) - self.set_line_width(0.5) - rule_y = table_y + header_h - self.line(table_margin + 8, rule_y, table_margin + table_w - 8, - rule_y) - - # Data rows - rows = [ - ("ATT estimate", "1.234", "1.234"), - ("Standard error", "0.456", "0.456"), - ("95% CI", "[0.34, 2.13]", "[0.34, 2.13]"), - ] - - for i, (label, cs_val, edid_val) in enumerate(rows): - y = table_y + header_h + i * row_h + 5 + self._centered_text(100, "matches Callaway-Sant'Anna exactly", + size=22, bold=True, color=CYAN) - # Label - self.set_xy(table_margin, y) - self.set_font("Helvetica", "", 15) - self.set_text_color(*GRAY) - self.cell(col_w, 16, " " + label, align="L") - - # CS value - self.set_xy(table_margin + col_w, y) - self.set_text_color(*WHITE) - self.cell(col_w, 16, cs_val, align="C") - - # EDiD value - self.set_xy(table_margin + 2 * col_w, y) - self.set_text_color(*WHITE) - self.cell(col_w, 16, edid_val, align="C") - - # "Identical" badge below table (cyan outline, matching slide 1 style) - badge_y = table_y + total_h + 15 - badge_w = 130 - badge_h = 28 + # Prominent equivalence badge + badge_w = 200 + badge_h = 36 badge_x = (WIDTH - badge_w) / 2 + badge_y = 150 self.set_draw_color(*CYAN) self.set_line_width(1.5) self.rect(badge_x, badge_y, badge_w, badge_h, "D") - self.set_xy(badge_x, badge_y + 5) - self.set_font("Helvetica", "B", 16) + self.set_xy(badge_x, badge_y + 8) + self.set_font("Helvetica", "B", 18) self.set_text_color(*CYAN) - self.cell(badge_w, 16, "= identical", align="C") + self.cell(badge_w, 18, "ATT point estimates identical", + align="C") - # Footnote - self.set_xy(0, badge_y + badge_h + 18) + # Corollary citation + self.set_xy(0, badge_y + badge_h + 25) self.set_font("Helvetica", "I", 14) self.set_text_color(*GRAY) self.cell(WIDTH, 10, @@ -706,8 +649,8 @@ def slide_06_safety_net(self): self._add_footer() - def slide_07_cta(self): - """Slide 7: CTA — Get Started.""" + def slide_08_cta(self): + """Slide 8: CTA — Get Started.""" self.add_page() self._add_dark_bg() @@ -760,10 +703,10 @@ def main(): pdf.slide_02_problem() pdf.slide_03_insight() pdf.slide_04_assumption() - pdf.slide_04_payoff() - pdf.slide_05_code() - pdf.slide_06_safety_net() - pdf.slide_07_cta() + pdf.slide_05_payoff() + pdf.slide_06_code() + pdf.slide_07_safety_net() + pdf.slide_08_cta() output_path = Path(__file__).parent / "diff-diff-v27-carousel.pdf" pdf.output(str(output_path))