[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"summaries-tag-data-visualization":3,"summaries-facets-categories":4016,"articles-tag-data-visualization":8415},[4,110,167,464,624,739,809,920,1698,1974,2103,2275,2371,2606,2737,2804,2951,3073,3144,3210,3304,3506,3642,3695,3955],{"id":5,"title":6,"ai":7,"body":14,"categories":59,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":64,"navigation":91,"path":92,"published_at":93,"question":61,"scraped_at":94,"seo":95,"sitemap":96,"source_id":97,"source_name":98,"source_type":99,"source_url":100,"stem":101,"tags":102,"thumbnail_url":61,"tldr":107,"tweet":61,"unknown_tags":108,"__hash__":109},"summaries\u002Fsummaries\u002Fdata-centric-design-rules-for-complex-apps-summary.md","Data-Centric Design Rules for Complex Apps",{"provider":8,"model":9,"input_tokens":10,"output_tokens":11,"processing_time_ms":12,"cost_usd":13},"openrouter","x-ai\u002Fgrok-4.1-fast",5842,1772,18063,0.00203175,{"type":15,"value":16,"toc":52},"minimark",[17,22,26,29,33,36,39,43,46,49],[18,19,21],"h2",{"id":20},"acquire-data-intuition-through-skills-and-practice","Acquire Data Intuition Through Skills and Practice",[23,24,25],"p",{},"Designers building data-intensive apps gain edge by learning Python for concise data\u002Flogic description—even if LLMs generate code—enabling direct prototyping over static mocks. Pair this with dogfooding: personally practice and observe users performing their core job on the tool, ensuring every feature ties to real data meaning, value, and relationships. Always prototype with realistic datasets tailored to user profiles; static sketches waste time and miss edge cases, while code-based builds reveal behaviors across states like errors or transitions.",[23,27,28],{},"This hands-on approach uncovers weak designs pre-user testing. For example, in Studymodel.ai, coding cumulative timeseries graphs with confidence intervals exposed native framework strengths\u002Fconstraints across data scenarios.",[18,30,32],{"id":31},"let-data-drive-interface-composition","Let Data Drive Interface Composition",[23,34,35],{},"Treat data as the interface: assemble pages from data-derived building blocks per its logical structure, inverting UI-first design. Maximize data-ink by embedding actions directly on representations (e.g., structured copy-paste in creational flows with data-driven defaults users can override), minimizing chrome so empty pages nearly vanish without data.",[23,37,38],{},"Design empty states explicitly by cause—starting (blank canvas), error, transitional, or success (empty issues list)—questioning if the component should exist at all or be handled upstream. Pre-populate forms intelligently from user history\u002Finferences to cut friction, leveraging deep data understanding. In Studymodel.ai, adapting whisker plots into probabilistic milestone Gantt charts combined familiar conventions, making abstract concepts accessible.",[18,40,42],{"id":41},"bridge-models-with-clear-language-and-navigation","Bridge Models with Clear Language and Navigation",[23,44,45],{},"Align user mental models (domain\u002Fjob-based) and system data models via evolving 'lingua franca': influence both without forcing identity, iterating to resolve contradictions. Use consistent domain terminology where possible, introduce system terms cautiously with tooltips\u002Fcall-outs (never dummy text), synthesizing dynamic strings from numerics, quality, and features for glanceable overviews.",[23,47,48],{},"For navigation in multi-dimensional data, provide explicit transparency on 'where am I': data viewed, recency\u002Fprovenance, filters\u002Fslices, process stage, version changes. Rely on proven patterns like breadcrumbs for nested structures over novel delights—prioritizing predictability\u002Fcontrol. In Studymodel.ai scenarios page, text summaries of plans outperformed heavy visuals for quick switching.",[23,50,51],{},"Adopting these shifts perception: forms become intent expressions, graphs reveal data meaning, visual hierarchy yields to conceptual, interactions target data over app scaffolding—fostering user flow, trust, and task focus.",{"title":53,"searchDepth":54,"depth":54,"links":55},"",2,[56,57,58],{"id":20,"depth":54,"text":21},{"id":31,"depth":54,"text":32},{"id":41,"depth":54,"text":42},[60],"Design & Frontend",null,"md",false,{"content_references":65,"triage":86},[66,72,76,79,83],{"type":67,"title":68,"author":69,"publisher":69,"url":70,"context":71},"book","The Visual Display of Quantitative Information","Edward Tufte","https:\u002F\u002Fwww.edwardtufte.com\u002Fbook\u002Fthe-visual-display-of-quantitative-information\u002F","recommended",{"type":67,"title":73,"author":74,"url":75,"context":71},"Content Design","Sarah Winters and Rachel Edwards","https:\u002F\u002Fcontentdesign.london\u002Fshop\u002Fcontent-design-by-sarah-winters-and-rachel-edwards",{"type":67,"title":77,"url":78,"context":71},"Design Patterns","https:\u002F\u002Fwww.goodreads.com\u002Fen\u002Fbook\u002Fshow\u002F85009.Design_Patterns",{"type":80,"title":81,"url":82,"context":71},"tool","datacamp","https:\u002F\u002Fwww.datacamp.com",{"type":80,"title":84,"url":85,"context":71},"Refactoring Guru","https:\u002F\u002Frefactoring.guru",{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":90},4,3,3.8,"Category: Design & Frontend. The article provides actionable insights on designing data-intensive applications, addressing the pain point of bridging design and engineering for the target audience. It emphasizes practical skills like learning Python for prototyping, which is directly applicable to building AI-powered products.",true,"\u002Fsummaries\u002Fdata-centric-design-rules-for-complex-apps-summary","2026-05-07 22:43:10","2026-05-08 15:33:59",{"title":6,"description":53},{"loc":92},"480b9285d0db8f6b","UX Collective","article","https:\u002F\u002Fuxdesign.cc\u002Fdesigning-data-intensive-applications-advice-for-interaction-designers-d87ec435cb8b?source=rss----138adf9c44c---4","summaries\u002Fdata-centric-design-rules-for-complex-apps-summary",[103,104,105,106],"ui-ux","data-visualization","python","design-frontend","Center interaction design on data landscapes: learn Python and users' jobs, let data structure UIs, strip chrome, design empty states, and bridge mental\u002Fdata models to align interfaces with real-world tasks.",[106],"kCgMlg7W49JvcC67loYsCw31IiNIJSp0V3_-6v9euog",{"id":111,"title":112,"ai":113,"body":118,"categories":146,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":148,"navigation":91,"path":152,"published_at":153,"question":61,"scraped_at":154,"seo":155,"sitemap":156,"source_id":157,"source_name":158,"source_type":99,"source_url":159,"stem":160,"tags":161,"thumbnail_url":61,"tldr":164,"tweet":61,"unknown_tags":165,"__hash__":166},"summaries\u002Fsummaries\u002Ftest-campaign-boosts-profit-but-needs-funnel-fixes-summary.md","Test Campaign Boosts Profit but Needs Funnel Fixes",{"provider":8,"model":9,"input_tokens":114,"output_tokens":115,"processing_time_ms":116,"cost_usd":117},8724,1394,19857,0.00241915,{"type":15,"value":119,"toc":141},[120,124,127,131,134,138],[18,121,123],{"id":122},"prioritize-revenue-over-vanity-metrics-with-full-funnel-analysis","Prioritize Revenue Over Vanity Metrics with Full-Funnel Analysis",[23,125,126],{},"Raw clicks mislead—Test campaign's higher CTR (10.2% vs Control's 5.1%) attracts more traffic from fewer impressions, but mid-funnel reveals issues: lower view rate (30.8% vs 36.5%) and cart rate (47.4% vs 66.9%). It recovers with superior purchase rate (61.8% vs 45.7%), yielding more purchases despite drop-offs. Compute funnel rates as CTR = clicks\u002Fimpressions, view_rate = view_content\u002Fclicks, etc., to spot bottlenecks like view-to-cart, where Test loses users due to potential landing page friction or ad-product mismatch. Statistical validation via proportions_ztest on purchases\u002Fclicks confirms significance (Z-stat 11.84, p~2.46e-32 \u003C0.05), proving Test's edge isn't chance.",[18,128,130],{"id":129},"trade-efficiency-for-scale-financial-metrics-guide-decisions","Trade Efficiency for Scale: Financial Metrics Guide Decisions",[23,132,133],{},"Test generates $781,850 revenue and $704,958 profit vs Control's $758,050 and $691,232, assuming AOV=$50 (revenue = purchases * 50, profit = revenue - spend). Yet Control wins efficiency: higher ROI (10.6 vs 9.3), lower CAC ($4.41 vs $4.92, spend\u002Fpurchases). Break-even favors Control (~2.8 customers vs 3.3). Time trends show Test's inconsistent outperformance, stronger on weekends (60% purchase rate vs Control's 33% drop) and high-reach segments (67.8% vs 48.3%). Use groupby('campaign') on revenue\u002Fspend\u002Fprofit for aggregates; ROI = (revenue - spend)\u002Fspend.",[18,135,137],{"id":136},"scale-strategically-scenarios-prove-tests-resilience","Scale Strategically: Scenarios Prove Test's Resilience",[23,139,140],{},"What-if scaling (20% spend up, 10% revenue up) projects Test at ~$767K profit vs Control's $753K. Scenario analysis (AOV multipliers: 0.95 pessimistic, 1.0 realistic, 1.1 optimistic) shows Test superior in all ($663K-$823K profit range vs Control's $629K-$781K). Recommendation: Scale Test for growth (max profit), retain Control for efficiency benchmark\u002Fhybrid. Fix mid-funnel first (view-to-cart bottleneck) via landing page tweaks; set guardrails like max CAC, min ROI; prioritize high-reach\u002Fweekend segments. Executive dashboard: bar plots of ROI\u002Fprofit\u002FCAC drive one-look decisions—Test justifies higher costs for total value.",{"title":53,"searchDepth":54,"depth":54,"links":142},[143,144,145],{"id":122,"depth":54,"text":123},{"id":129,"depth":54,"text":130},{"id":136,"depth":54,"text":137},[147],"Marketing & Growth",{"content_references":149,"triage":150},[],{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":151},"Category: Marketing & Growth. The article provides actionable insights on optimizing marketing funnels and emphasizes the importance of full-funnel analysis, which addresses the audience's need for practical applications in marketing strategies. It includes specific metrics and recommendations for improving campaign performance, making it relevant for product builders.","\u002Fsummaries\u002Ftest-campaign-boosts-profit-but-needs-funnel-fixes-summary","2026-05-06 13:31:02","2026-05-06 16:13:49",{"title":112,"description":53},{"loc":152},"7b713dd7705ea75d","Learning Data","https:\u002F\u002Fmedium.com\u002Flearning-data\u002Ffrom-clicks-to-revenue-what-a-b-testing-taught-me-about-marketing-performance-97c9ff5078e4?source=rss----eec44e936bf1---4","summaries\u002Ftest-campaign-boosts-profit-but-needs-funnel-fixes-summary",[162,104,163],"data-science","marketing-growth","Test campaign delivers higher revenue ($781,850 vs $758,050) and profit ($704,958 vs $691,232) with stat sig (p~0), higher CTR (10.2% vs 5.1%), but lower ROI (9.3 vs 10.6) and CAC ($4.92 vs $4.41). Scale it while targeting mid-funnel drop-offs.",[163],"2lnYKtNmsURwdrz7fYLFH-H38-MdSU43fUq8E123D24",{"id":168,"title":169,"ai":170,"body":175,"categories":439,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":441,"navigation":91,"path":450,"published_at":451,"question":61,"scraped_at":452,"seo":453,"sitemap":454,"source_id":455,"source_name":456,"source_type":99,"source_url":457,"stem":458,"tags":459,"thumbnail_url":61,"tldr":461,"tweet":61,"unknown_tags":462,"__hash__":463},"summaries\u002Fsummaries\u002Fmomentum-dampens-gd-zigzags-via-gradient-averaging-summary.md","Momentum Dampens GD Zigzags via Gradient Averaging",{"provider":8,"model":9,"input_tokens":171,"output_tokens":172,"processing_time_ms":173,"cost_usd":174},8869,1948,36530,0.0027253,{"type":15,"value":176,"toc":434},[177,181,198,201,255,258,262,268,278,281,333,336,340,347,423,430],[18,178,180],{"id":179},"anisotropic-surfaces-force-gd-zigzags","Anisotropic Surfaces Force GD Zigzags",[23,182,183,184,188,189,193,194,197],{},"Real-world loss surfaces often have uneven curvature—flat in one direction (e.g., 0.05 x²) and steep in another (e.g., 5 y²)—yielding a Hessian with eigenvalues 0.1 and 10 (condition number 100). Gradients are ",[185,186,187],"span",{},"0.1x, 10y",". With learning rate lr=0.18 (near stability limit 2\u002Fλ_max=0.2), steep direction factor |1-10",[190,191,192],"em",{},"0.18|=0.8 causes 20% overshoot per step (oscillations), while flat direction |1-0.1","0.18|=0.982 advances just 1.8% (near-stagnation). Starting at ",[185,195,196],{},"-4,1.5",", vanilla GD: θ ← θ - lr ∇L(θ) zigzags slowly, hitting loss\u003C0.001 in 185 steps (final loss 1.5e-5 after 300 steps).",[23,199,200],{},"Implement as:",[202,203,206],"pre",{"className":204,"code":205,"language":105,"meta":53,"style":53},"language-python shiki shiki-themes github-light github-dark","def grad(x, y): return np.array([0.1 * x, 10 * y])\ndef gradient_descent(start, lr, steps=300):\n    path = [np.array(start, dtype=float)]\n    pos = np.array(start, dtype=float)\n    for _ in range(steps):\n        pos = pos - lr * grad(*pos)\n        path.append(pos.copy())\n    return np.array(path)\n",[207,208,209,216,221,226,231,237,243,249],"code",{"__ignoreMap":53},[185,210,213],{"class":211,"line":212},"line",1,[185,214,215],{},"def grad(x, y): return np.array([0.1 * x, 10 * y])\n",[185,217,218],{"class":211,"line":54},[185,219,220],{},"def gradient_descent(start, lr, steps=300):\n",[185,222,223],{"class":211,"line":88},[185,224,225],{},"    path = [np.array(start, dtype=float)]\n",[185,227,228],{"class":211,"line":87},[185,229,230],{},"    pos = np.array(start, dtype=float)\n",[185,232,234],{"class":211,"line":233},5,[185,235,236],{},"    for _ in range(steps):\n",[185,238,240],{"class":211,"line":239},6,[185,241,242],{},"        pos = pos - lr * grad(*pos)\n",[185,244,246],{"class":211,"line":245},7,[185,247,248],{},"        path.append(pos.copy())\n",[185,250,252],{"class":211,"line":251},8,[185,253,254],{},"    return np.array(path)\n",[23,256,257],{},"High lr speeds flat progress but oscillates steep; low lr stabilizes but crawls flat—core GD trade-off.",[18,259,261],{"id":260},"momentum-velocity-cancels-oscillations-builds-speed","Momentum Velocity Cancels Oscillations, Builds Speed",[23,263,264,265,267],{},"Momentum tracks velocity v (exponential moving average of gradients): v ← β v + (1-β) ∇L(θ); θ ← θ - lr v. Consistent gradients (flat direction) accumulate for larger steps; opposing gradients (steep oscillations) cancel, damping zigzags. From ",[185,266,196],{}," with lr=0.18:",[269,270,271,275],"ul",{},[272,273,274],"li",{},"β=0.9: smooth path, loss\u003C0.001 in 159 steps (final 1e-6).",[272,276,277],{},"β=0.99: excessive accumulation overshoots, final loss 0.487 (circles minimum).",[23,279,280],{},"Code:",[202,282,284],{"className":204,"code":283,"language":105,"meta":53,"style":53},"def momentum_gd(start, lr, beta, steps=300):\n    path = [np.array(start, dtype=float)]\n    pos = np.array(start, dtype=float)\n    v = np.zeros(2)\n    for _ in range(steps):\n        g = grad(*pos)\n        v = beta * v + (1 - beta) * g\n        pos = pos - lr * v\n        path.append(pos.copy())\n    return np.array(path)\n",[207,285,286,291,295,299,304,308,313,318,323,328],{"__ignoreMap":53},[185,287,288],{"class":211,"line":212},[185,289,290],{},"def momentum_gd(start, lr, beta, steps=300):\n",[185,292,293],{"class":211,"line":54},[185,294,225],{},[185,296,297],{"class":211,"line":88},[185,298,230],{},[185,300,301],{"class":211,"line":87},[185,302,303],{},"    v = np.zeros(2)\n",[185,305,306],{"class":211,"line":233},[185,307,236],{},[185,309,310],{"class":211,"line":239},[185,311,312],{},"        g = grad(*pos)\n",[185,314,315],{"class":211,"line":245},[185,316,317],{},"        v = beta * v + (1 - beta) * g\n",[185,319,320],{"class":211,"line":251},[185,321,322],{},"        pos = pos - lr * v\n",[185,324,326],{"class":211,"line":325},9,[185,327,248],{},[185,329,331],{"class":211,"line":330},10,[185,332,254],{},[23,334,335],{},"β weights history: β→0 mimics GD; β=0.9 balances smoothing\u002Fspeed; β→1 risks divergence.",[18,337,339],{"id":338},"β-tuning-via-convergence-sweep","β Tuning via Convergence Sweep",[23,341,342,343,346],{},"Sweep β=",[185,344,345],{},"0.0,0.5,0.7,0.85,0.90,0.95,0.99"," to loss\u003C0.001 (max 500 steps):",[348,349,350,363],"table",{},[351,352,353],"thead",{},[354,355,356,360],"tr",{},[357,358,359],"th",{},"β",[357,361,362],{},"Steps to converge",[364,365,366,375,383,391,399,407,415],"tbody",{},[354,367,368,372],{},[369,370,371],"td",{},"0.00",[369,373,374],{},"185 (vanilla GD)",[354,376,377,380],{},[369,378,379],{},"0.50",[369,381,382],{},"170",[354,384,385,388],{},[369,386,387],{},"0.70",[369,389,390],{},"165",[354,392,393,396],{},[369,394,395],{},"0.85",[369,397,398],{},"161",[354,400,401,404],{},[369,402,403],{},"0.90",[369,405,406],{},"159 (sweet spot)",[354,408,409,412],{},[369,410,411],{},"0.95",[369,413,414],{},"158",[354,416,417,420],{},[369,418,419],{},"0.99",[369,421,422],{},">500 (diverges)",[23,424,425,426,429],{},"Inverted U: β=0.9-0.95 optimal (faster by ~15-20% vs GD); too high prioritizes stale velocity. Visualize trajectories (first 55 steps on contours) and log-loss curves confirm: GD slow\u002Foscillatory, good β direct\u002Ffast, high β bouncy\u002Ffailed. Loss surface: def loss(x,y): return 0.05",[190,427,428],{},"x**2 + 5","y**2.",[431,432,433],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":53,"searchDepth":54,"depth":54,"links":435},[436,437,438],{"id":179,"depth":54,"text":180},{"id":260,"depth":54,"text":261},{"id":338,"depth":54,"text":339},[440],"Data Science & Visualization",{"content_references":442,"triage":448},[443],{"type":444,"title":445,"url":446,"context":447},"other","Momentum_Gradient_Descent.ipynb","https:\u002F\u002Fgithub.com\u002FMarktechpost\u002FAI-Agents-Projects-Tutorials\u002Fblob\u002Fmain\u002FData%20Science\u002FMomentum_Gradient_Descent.ipynb","mentioned",{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":449},"Category: AI & LLMs. The article discusses gradient descent and momentum in machine learning, addressing practical concerns about convergence speed and oscillations, which are relevant to AI developers. It provides actionable Python code examples for implementing gradient descent and momentum, making it useful for practitioners.","\u002Fsummaries\u002Fmomentum-dampens-gd-zigzags-via-gradient-averaging-summary","2026-05-05 07:26:29","2026-05-05 16:09:53",{"title":169,"description":53},{"loc":450},"e3a7d313e4f27d00","MarkTechPost","https:\u002F\u002Fwww.marktechpost.com\u002F2026\u002F05\u002F05\u002Fwhy-gradient-descent-zigzags-and-how-momentum-fixes-it\u002F","summaries\u002Fmomentum-dampens-gd-zigzags-via-gradient-averaging-summary",[460,105,104],"machine-learning","On anisotropic loss surfaces (condition number 100), vanilla GD zigzags and takes 185 steps to converge (loss \u003C0.001); momentum with β=0.9 converges in 159 steps by canceling steep-direction oscillations while accelerating flat directions—but β=0.99 diverges.",[],"IGrfHufwQ5WM4qr--OZVrBLetyNRYdOVdK_X1D660eY",{"id":465,"title":466,"ai":467,"body":472,"categories":599,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":600,"navigation":91,"path":612,"published_at":613,"question":61,"scraped_at":614,"seo":615,"sitemap":616,"source_id":617,"source_name":456,"source_type":99,"source_url":618,"stem":619,"tags":620,"thumbnail_url":61,"tldr":621,"tweet":61,"unknown_tags":622,"__hash__":623},"summaries\u002Fsummaries\u002Fstream-parse-tasktrove-dataset-for-ai-task-insight-summary.md","Stream Parse TaskTrove Dataset for AI Task Insights",{"provider":8,"model":9,"input_tokens":468,"output_tokens":469,"processing_time_ms":470,"cost_usd":471},9713,1943,26130,0.0028916,{"type":15,"value":473,"toc":594},[474,478,533,540,544,551,565,569,576],[18,475,477],{"id":476},"build-streaming-parser-for-compressed-task-binaries","Build Streaming Parser for Compressed Task Binaries",[23,479,480,481,484,485,488,489,492,493,496,497,500,501,504,505,508,509,512,513,516,517,520,521,524,525,528,529,532],{},"Handle TaskTrove's ",[207,482,483],{},"task_binary"," fields—gzip-compressed blobs up to p95= some KB—without downloading the full dataset by using ",[207,486,487],{},"datasets.load_dataset(..., streaming=True)",". Convert blobs to bytes via ",[207,490,491],{},"to_bytes()"," which decodes base64 strings or lists. Decompress if gzip header (",[207,494,495],{},"b'\\x1f\\x8b'","), then auto-detect format in ",[207,498,499],{},"parse_task()",": prioritize ",[207,502,503],{},"tarfile.open()"," for archives (extract files as str\u002Fbytes), fall back to ",[207,506,507],{},"ZipFile",", then ",[207,510,511],{},"json.loads()"," (or JSONL line-by-line), plain text decode, or binary. This yields dicts with ",[207,514,515],{},"format",", ",[207,518,519],{},"files"," (for archives), ",[207,522,523],{},"content",", plus ",[207,526,527],{},"raw_size","\u002F",[207,530,531],{},"compressed_size",". Example: first sample decompresses from compressed bytes to raw, revealing tar with JSON metadata and .py code files.",[23,534,535,536,539],{},"Use ",[207,537,538],{},"show_task()"," to preview: breakdown by extension (e.g., .json, .py), truncate JSON to 1500 chars, code to 600. Trade-off: Streaming processes samples in real-time but requires robust error handling for malformed blobs (e.g., UnicodeDecodeError keeps as bytes).",[18,541,543],{"id":542},"uncover-dataset-structure-via-counters-and-plots","Uncover Dataset Structure via Counters and Plots",[23,545,546,547,550],{},"Extract source from ",[207,548,549],{},"path"," prefix (split on last '-'): top 15 sources dominate test split (e.g., count thousands each). Track compressed sizes: log-scale histogram shows median p50 KB, p95 ~higher KB—most tasks compact, outliers bulkier. Inspect 200 samples: common filenames (e.g., task.json, README.md top counts), JSON keys (e.g., instruction, tests frequent). Full listings reveal 5-10 files per tar\u002Fzip typically.",[23,552,553,554,557,558,516,561,564],{},"Aggregate in ",[207,555,556],{},"TaskTroveExplorer.summary(limit=1000)",": group by source for n tasks, mean compressed\u002Fraw KB (log y-scale bar chart top 12), mean files. Enables quick profiling—e.g., some sources average 10+ KB raw, others leaner. Polars DataFrame slice of 500 tasks captures ",[207,559,560],{},"source",[207,562,563],{},"is_verified",", sizes, instruction preview for downstream modeling.",[18,566,568],{"id":567},"detect-verifiers-and-export-rl-ready-tasks","Detect Verifiers and Export RL-Ready Tasks",[23,570,571,572,575],{},"Flag evaluation-ready tasks with ",[207,573,574],{},"has_verifier()",": scan filenames for 'verifier'\u002F'judge'\u002F'grader', JSON keys like 'verifier_config'\u002F'rubric'\u002F'test_patch', or content strings. Multi-signal boosts recall—e.g., verified tasks have dedicated verifier.py or JSON. Per-source rates vary (bar chart: green high % usable for RL); hunt first verified sample to inspect (e.g., grader JSON with tests).",[23,577,578,581,582,585,586,589,590,593],{},[207,579,580],{},"TaskTroveExplorer"," class unifies: ",[207,583,584],{},"iter()"," filters sources, ",[207,587,588],{},"sample(n=5)"," parses + adds metadata, ",[207,591,592],{},"export()"," writes dirs with files\u002FJSON. Saves Parquet slice (500 rows, ~KB): boosts workflows by filtering verified tasks (sum across sources). Full pipeline scales to validation split; lists HF repo subdirs for all sources (~dozens).",{"title":53,"searchDepth":54,"depth":54,"links":595},[596,597,598],{"id":476,"depth":54,"text":477},{"id":542,"depth":54,"text":543},{"id":567,"depth":54,"text":568},[440],{"content_references":601,"triage":609},[602,606],{"type":603,"title":604,"url":605,"context":447},"dataset","TaskTrove","https:\u002F\u002Fhuggingface.co\u002Fdatasets\u002Fopen-thoughts\u002FTaskTrove",{"type":444,"title":607,"url":608,"context":71},"Full Codes with Notebook","https:\u002F\u002Fgithub.com\u002FMarktechpost\u002FAI-Agents-Projects-Tutorials\u002Fblob\u002Fmain\u002FLLM%20Projects\u002Ftasktrove_exploration_pipeline_marktechpost.py",{"relevance":233,"novelty":87,"quality":87,"actionability":87,"composite":610,"reasoning":611},4.35,"Category: Data Science & Visualization. The article provides a detailed guide on streaming and parsing a specific dataset, which is highly relevant for developers looking to integrate AI features using real-world data. It includes practical code examples and techniques for handling large datasets, making it actionable for the target audience.","\u002Fsummaries\u002Fstream-parse-tasktrove-dataset-for-ai-task-insight-summary","2026-05-03 21:26:42","2026-05-04 16:13:43",{"title":466,"description":53},{"loc":612},"0cdee908eb39d657","https:\u002F\u002Fwww.marktechpost.com\u002F2026\u002F05\u002F03\u002Fa-coding-implementation-to-explore-and-analyze-the-tasktrove-dataset-with-streaming-parsing-visualization-and-verifier-detection\u002F","summaries\u002Fstream-parse-tasktrove-dataset-for-ai-task-insight-summary",[105,162,104],"Stream multi-GB TaskTrove dataset without full download; parse gzip-compressed tar\u002Fzip\u002FJSON binaries to analyze sources, sizes (median  p50 KB compressed), filenames, and detect verifiers for RL-ready tasks via multi-signal heuristics.",[],"H2UpHE2t_KgCOZVQilA6Mdshg2Ol0joqXNDB-_Geixs",{"id":625,"title":626,"ai":627,"body":632,"categories":712,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":714,"navigation":91,"path":726,"published_at":727,"question":61,"scraped_at":728,"seo":729,"sitemap":730,"source_id":731,"source_name":456,"source_type":99,"source_url":732,"stem":733,"tags":734,"thumbnail_url":61,"tldr":736,"tweet":61,"unknown_tags":737,"__hash__":738},"summaries\u002Fsummaries\u002Fparse-analyze-visualize-hermes-agent-traces-for-fi-summary.md","Parse, Analyze, Visualize Hermes Agent Traces for Fine-Tuning",{"provider":8,"model":9,"input_tokens":628,"output_tokens":629,"processing_time_ms":630,"cost_usd":631},9548,2173,36665,0.00297345,{"type":15,"value":633,"toc":707},[634,638,653,680,684,687,693,697,700],[18,635,637],{"id":636},"extracting-thoughts-tool-calls-and-responses-from-traces","Extracting Thoughts, Tool Calls, and Responses from Traces",[23,639,640,641,644,645,648,649,652],{},"Agent conversations in the lambda\u002Fhermes-agent-reasoning-traces dataset (Hugging Face, \"kimi\" config) consist of turns from \"system\", \"human\", \"gpt\", and \"tool\" roles. Use regex to parse gpt messages: ",[207,642,643],{},"THINK_RE = re.compile(r\"\u003Cthink>(.*?)\u003C\u002Fthink>\", re.DOTALL)"," captures internal reasoning; ",[207,646,647],{},"TOOL_CALL_RE = re.compile(r\"\u003Ctool_call>\\s*(\\{.*?\\})\\s*\u003C\u002Ftool_call>\", re.DOTALL)"," grabs JSON tool calls (with json.loads fallback for malformed); remaining text after stripping is the final answer. Tool responses parse via ",[207,650,651],{},"TOOL_RESP_RE"," into JSON or raw. This separates internal reasoning from actions, enabling per-turn analysis. Test on samples reveals thoughts like planning steps, calls like {\"name\": \"search\", \"arguments\": {...}}, and handles parallel calls (multiple per turn).",[23,654,655,656,659,660,663,664,516,667,516,670,516,673,516,676,679],{},"Tool schemas from ",[207,657,658],{},"json.loads(ex[\"tools\"])"," list available functions with names\u002Fdescriptions. Render full traces with ",[207,661,662],{},"render_trace(ex)"," to display ",[185,665,666],{},"USER",[185,668,669],{},"THINK",[185,671,672],{},"CALL",[185,674,675],{},"TOOL_RESPONSE",[185,677,678],{},"ANSWER"," for inspection, shortening long text.",[18,681,683],{"id":682},"quantifying-behaviors-tool-usage-lengths-and-errors","Quantifying Behaviors: Tool Usage, Lengths, and Errors",[23,685,686],{},"Scan 3000 trajectories to aggregate: count tool calls per category\u002Fsubcategory\u002Ftask; track turns per trajectory, thoughts per gpt turn, calls per trajectory, errors (\"error\" in response JSON, exit_code=1, traceback). Compute averages like turns\u002Ftraj, calls\u002Ftraj; % trajectories with errors; % parallel turns (width >1). Top tools via Counter on call names. Length distributions: histogram characters in thoughts, json.dumps(tool_calls), final answers across 500 examples—reveals typical reasoning\u002Ftool\u002Fanswer sizes for token budgeting.",[23,688,689,692],{},[207,690,691],{},"TraceReplayer"," class reconstructs steps: each gpt turn pairs with subsequent tool responses, enabling step-by-step playback: print thoughts, calls with args, responses, final. Identifies patterns like avg 5-10 turns\u002Ftraj (via hist), frequent tools (e.g., search\u002Fbrowse top), low error rates for robust behaviors.",[18,694,696],{"id":695},"visualizing-trends-and-prepping-for-sft","Visualizing Trends and Prepping for SFT",[23,698,699],{},"Four-panel plot: horizontal bar top 15 tools by volume; log-scale bar parallel widths (# calls\u002Fturn); histogram conversation lengths (bins=40); pie category distribution. Highlights: most turns single-tool, skewed long-tail convos, dominant categories.",[23,701,702,703,706],{},"For training, convert to OpenAI messages: map \"gpt\"→\"assistant\", \"tool\"→\"user\". Tokenize with Qwen\u002FQwen2.5-0.5B-Instruct: apply_chat_template per message, encode, mask non-assistant labels (-100). Truncates to 2048\u002F1024 tokens; ~30-50% trainable (assistant only). TRL SFTTrainer demo: map to text field, load model (fp16), train 200 examples (batch=1, accum=4, steps=20, lr=2e-5, seq=1024). Handles tool as \"",[185,704,705],{},"TOOL","\\n\" prefix. Yields production-ready format for fine-tuning tool-use\u002Freasoning.",{"title":53,"searchDepth":54,"depth":54,"links":708},[709,710,711],{"id":636,"depth":54,"text":637},{"id":682,"depth":54,"text":683},{"id":695,"depth":54,"text":696},[713],"AI & LLMs",{"content_references":715,"triage":724},[716,720,722],{"type":603,"title":717,"author":718,"url":719,"context":447},"hermes-agent-reasoning-traces","lambda","https:\u002F\u002Fhuggingface.co\u002Fdatasets\u002Flambda\u002Fhermes-agent-reasoning-traces",{"type":80,"title":721,"context":447},"Qwen\u002FQwen2.5-0.5B-Instruct",{"type":444,"title":607,"url":723,"context":71},"https:\u002F\u002Fgithub.com\u002FMarktechpost\u002FAI-Agents-Projects-Tutorials\u002Fblob\u002Fmain\u002FAgentic%20AI%20Codes\u002Fhermes_agent_reasoning_traces_tutorial_marktechpost.py",{"relevance":233,"novelty":87,"quality":87,"actionability":87,"composite":610,"reasoning":725},"Category: AI & LLMs. The article provides a detailed methodology for parsing and analyzing agent traces, which is directly relevant to AI engineers looking to fine-tune models. It includes specific regex implementations and statistical analysis techniques that can be immediately applied in practice.","\u002Fsummaries\u002Fparse-analyze-visualize-hermes-agent-traces-for-fi-summary","2026-05-02 07:47:46","2026-05-03 17:01:46",{"title":626,"description":53},{"loc":726},"66ab332cafee06ea","https:\u002F\u002Fwww.marktechpost.com\u002F2026\u002F05\u002F02\u002Fa-coding-implementation-to-parsing-analyzing-visualizing-and-fine-tuning-agent-reasoning-traces-using-the-lambda-hermes-agent-reasoning-traces-dataset\u002F","summaries\u002Fparse-analyze-visualize-hermes-agent-traces-for-fi-summary",[735,162,104,105],"agents","Extract thoughts\u002Ftool calls from Hermes agent dataset with regex parsers; compute stats like avg turns per trajectory, tool frequencies, error rates; visualize patterns; tokenize with assistant-only labels for SFT on Qwen models.",[],"FWfJj-bnG9K8c7jGzCH1kGZjMQ_ZSupU0nPflXBQhCM",{"id":740,"title":741,"ai":742,"body":747,"categories":783,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":784,"navigation":91,"path":797,"published_at":798,"question":61,"scraped_at":799,"seo":800,"sitemap":801,"source_id":802,"source_name":158,"source_type":99,"source_url":803,"stem":804,"tags":805,"thumbnail_url":61,"tldr":806,"tweet":61,"unknown_tags":807,"__hash__":808},"summaries\u002Fsummaries\u002Fetl-pipeline-turns-messy-hr-data-into-star-schema--summary.md","ETL Pipeline Turns Messy HR Data into Star Schema Insights",{"provider":8,"model":9,"input_tokens":743,"output_tokens":744,"processing_time_ms":745,"cost_usd":746},7468,1638,25555,0.0022901,{"type":15,"value":748,"toc":777},[749,753,756,760,763,767,770,774],[18,750,752],{"id":751},"restructure-flat-data-into-star-schema-for-efficient-analysis","Restructure Flat Data into Star Schema for Efficient Analysis",[23,754,755],{},"Raw HR datasets arrive as wide, redundant tables that slow queries and complicate scaling. Transform them into a star schema: one central fact table for employee records (EmpID, Age, tenure_years, is_attrition, foreign keys like department_id) surrounded by dimension tables (department, position, salary with qcut-segmented levels: Low\u002FMedium\u002FHigh for equal distribution groups). This reduces redundancy, speeds queries, and adds business meaning—e.g., salary_level enables quick counts of high-salary employees. Use pd.read_csv for extraction, then merge unique values back with surrogate keys (index + 1) to link facts to dimensions, creating maintainable analytical workloads over monolithic tables.",[18,757,759],{"id":758},"clean-and-engineer-features-robustly-from-unreliable-raw-data","Clean and Engineer Features Robustly from Unreliable Raw Data",[23,761,762],{},"Don't trust provided fields—derive them. Strip column whitespace to prevent code breaks. Convert strings to datetime with errors='coerce' for DateofHire, DateofTermination, DOB (format='%m\u002F%d\u002F%y'). Compute Age as (today - DOB).days \u002F\u002F 365, tenure_years as (today - DateofHire).days \u002F 365, is_attrition as DateofTermination.notna(), is_active as opposite. Fill missing Salary and Age with medians (outlier-resistant over means). These steps turn inconsistent inputs into reliable features for downstream analysis and ML, emphasizing derivation over assumption.",[18,764,766],{"id":765},"extract-actionable-hr-insights-post-transformation","Extract Actionable HR Insights Post-Transformation",[23,768,769],{},"Query structured data reveals: Managers show no strong performance impact—most employees rate 'Fully Meets' across leaders, with minor 'Exceeds' variations (e.g., Ketsia Liebig, Brandon Miller) and rare 'PIP\u002FNeeds Improvement'. Diversity: 60% White, 26% Black\u002FAfrican American, 9% Asian; gender balanced at 56.6% female vs. 43.4% male. Recruitment: Diversity Job Fair yields 100% Black hires; Indeed\u002FLinkedIn balanced; Google Search varied but White-dominant; avoid Online Web Application\u002FOther (100% White). Stacked crosstabs and countplots highlight channels driving diversity, prioritizing targeted sources over uniform ones.",[18,771,773],{"id":772},"predict-attrition-at-71-accuracy-with-key-drivers-identified","Predict Attrition at 71% Accuracy with Key Drivers Identified",[23,775,776],{},"Leverage cleaned fact table merges (absences, salary dims) for RandomForestClassifier on age, tenure_years, absences, Salary (filled medians). Train\u002Ftest split (80\u002F20) yields 71% accuracy, 59% precision\u002Frecall for attrition (confusion: 32 true stay, 13 true leave, 9 misses each). Feature importances: tenure (47%), Salary (23%), absences moderate, age lowest—focus retention on long-tenured, low-salary employees with absences to cut churn.",{"title":53,"searchDepth":54,"depth":54,"links":778},[779,780,781,782],{"id":751,"depth":54,"text":752},{"id":758,"depth":54,"text":759},{"id":765,"depth":54,"text":766},{"id":772,"depth":54,"text":773},[440],{"content_references":785,"triage":794},[786,790],{"type":603,"title":787,"author":788,"url":789,"context":447},"Human Resources Data Set","rhuebner","https:\u002F\u002Fwww.kaggle.com\u002Fdatasets\u002Frhuebner\u002Fhuman-resources-data-set",{"type":444,"title":791,"author":792,"url":793,"context":447},"ETL-HR-Analytics-Project","jihanKamilah","https:\u002F\u002Fgithub.com\u002FjihanKamilah\u002FETL-HR-Analytics-Project",{"relevance":233,"novelty":88,"quality":87,"actionability":87,"composite":795,"reasoning":796},4.15,"Category: Data Science & Visualization. The article provides a detailed guide on building an ETL pipeline to transform messy HR data into a star schema, addressing practical applications for data analysis, which is highly relevant for product builders. It includes specific techniques for data cleaning and feature engineering, making it actionable for the audience.","\u002Fsummaries\u002Fetl-pipeline-turns-messy-hr-data-into-star-schema-summary","2026-04-29 17:03:37","2026-05-03 17:01:04",{"title":741,"description":53},{"loc":797},"6e4b4d5944c58d66","https:\u002F\u002Fmedium.com\u002Flearning-data\u002Fthis-is-what-real-data-looks-like-and-how-i-turned-it-into-insights-3d520e7da561?source=rss----eec44e936bf1---4","summaries\u002Fetl-pipeline-turns-messy-hr-data-into-star-schema--summary",[162,460,104,105],"Build a scalable ETL pipeline to restructure flat HR data into a star schema fact\u002Fdimension tables, enabling analysis of manager performance, diversity (60% White, 56.6% female), recruitment channels, and 71% accurate attrition prediction where tenure drives 47% of decisions.",[],"dDvHxRvFYu4TQCvtklxTh_2DodCmMRdw0_om68Uv7uE",{"id":810,"title":811,"ai":812,"body":817,"categories":889,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":890,"navigation":91,"path":907,"published_at":908,"question":61,"scraped_at":909,"seo":910,"sitemap":911,"source_id":912,"source_name":913,"source_type":99,"source_url":914,"stem":915,"tags":916,"thumbnail_url":61,"tldr":917,"tweet":61,"unknown_tags":918,"__hash__":919},"summaries\u002Fsummaries\u002Frule-based-flood-risk-dashboard-beats-ml-on-small--summary.md","Rule-Based Flood Risk Dashboard Beats ML on Small Weather Data",{"provider":8,"model":9,"input_tokens":813,"output_tokens":814,"processing_time_ms":815,"cost_usd":816},6534,1834,13947,0.00171695,{"type":15,"value":818,"toc":884},[819,823,830,834,873,877],[18,820,822],{"id":821},"rule-based-scoring-delivers-stable-interpretable-flood-risk","Rule-Based Scoring Delivers Stable, Interpretable Flood Risk",[23,824,825,826,829],{},"Flood risk emerges from accumulated rainfall over 24 hours, not just instant rates—calculate it with ",[207,827,828],{},"df['rain_24h'] = df['rainfall'].rolling(8).sum()"," since API data arrives every 3 hours (8 points = 24h). Score total risk (0-100) using rainfall as primary driver: \u003C20mm low contribution, 20-55mm moderate, 55-100mm high, >100mm very high; amplify with high humidity and strong winds as supporting factors. Classify final score as LOW (\u003C30), MEDIUM (30-70), HIGH (≥70). This outperforms Random Forest ML on small, imbalanced API datasets lacking stable flood labels—rules stay interpretable (trace exact risk drivers), adjustable via domain knowledge, and immune to training variance. Handle missing rainfall with fallbacks to avoid crashes.",[18,831,833],{"id":832},"interactive-controls-and-visuals-turn-data-into-actionable-insights","Interactive Controls and Visuals Turn Data into Actionable Insights",[23,835,836,837,840,841,844,845,848,849,852,853,856,857,860,861,864,865,868,869,872],{},"Sidebar filters drive everything: ",[207,838,839],{},"st.sidebar.selectbox"," for province (cascades to cities via ",[207,842,843],{},"province_map[selected_province]","), multiselect for risk levels (filter ",[207,846,847],{},"if risk not in risk_filter: continue","), checkboxes for heatmap\u002Fmarkers. Trends reveal dynamics—line charts for rainfall spikes (",[207,850,851],{},"px.line(df, x='datetime', y='rainfall')","), 24h accumulation (catches sustained rain), and risk probability (",[207,854,855],{},"px.line(df, x='datetime', y='ml_proba')"," despite rule basis). Metrics offer instant reads: max 24h rainfall, current humidity\u002Fwind via ",[207,858,859],{},"st.metric",". Maps add spatial context—Folium CircleMarkers color-coded by risk (red >70, orange >40, green), toggleable Province (multi-city compare) vs Single City views with ",[207,862,863],{},"st.radio",", plus HeatMap for risk density (",[207,866,867],{},"HeatMap(heat_data).add_to(m)","). Bottom table previews raw data (",[207,870,871],{},"st.dataframe(df.tail(n))"," with n=5\u002F10\u002F20\u002F30 selectbox) for verification.",[18,874,876],{"id":875},"deploy-securely-on-streamlit-cloud-for-real-time-monitoring","Deploy Securely on Streamlit Cloud for Real-Time Monitoring",[23,878,879,880,883],{},"Fetch multi-city OpenWeather 3-hour forecasts (rainfall, humidity, wind) via API, but separate calls per city slow performance—cache where possible. Use Streamlit secrets (",[207,881,882],{},"API_KEY = st.secrets[\"API_KEY\"]",") to hide keys, push app.py\u002Frequirements.txt to GitHub, link in Streamlit Cloud for auto-deploys. This yields a live dashboard at indonesia-flood-risk-dashboard.streamlit.app\u002F focused on Indonesia's urban flood-prone areas, evolving from basic viz to risk prediction without complex models.",{"title":53,"searchDepth":54,"depth":54,"links":885},[886,887,888],{"id":821,"depth":54,"text":822},{"id":832,"depth":54,"text":833},{"id":875,"depth":54,"text":876},[440],{"content_references":891,"triage":904},[892,894,896,898,901],{"type":80,"title":893,"context":447},"OpenWeather API",{"type":80,"title":895,"context":447},"Streamlit Cloud",{"type":80,"title":897,"context":447},"Folium",{"type":80,"title":899,"url":900,"context":71},"Indonesia Flood Risk Dashboard","https:\u002F\u002Findonesia-flood-risk-dashboard.streamlit.app\u002F",{"type":444,"title":902,"url":903,"context":71},"Indonesia-Flood-Risk-Dashboard","https:\u002F\u002Fgithub.com\u002FjihanKamilah\u002FIndonesia-Flood-Risk-Dashboard",{"relevance":233,"novelty":87,"quality":87,"actionability":233,"composite":905,"reasoning":906},4.55,"Category: Data Science & Visualization. The article provides a practical approach to building a flood risk dashboard using rule-based scoring, which directly addresses the audience's need for actionable insights in data visualization and risk assessment. It includes specific coding examples and techniques that can be implemented immediately, making it highly actionable.","\u002Fsummaries\u002Frule-based-flood-risk-dashboard-beats-ml-on-small-summary","2026-04-27 09:02:15","2026-04-28 15:15:46",{"title":811,"description":53},{"loc":907},"b9f705c3fca30e93","Data and Beyond","https:\u002F\u002Fmedium.com\u002Fdata-and-beyond\u002Fwhen-rain-isnt-just-rain-building-a-flood-risk-dashboard-from-weather-data-794c4fbf0d1e?source=rss----b680b860beb1---4","summaries\u002Frule-based-flood-risk-dashboard-beats-ml-on-small--summary",[162,104,105],"Switch from unstable Random Forest ML to rule-based scoring on OpenWeather rainfall (\u003C20mm low, 55-100mm high), humidity, and wind for stable LOW\u002FMEDIUM\u002FHIGH flood risk; visualize trends, maps, and metrics in interactive Streamlit app.",[],"njAXnM0fiKdFLqt01riqmCDrN3DcVe98ualhKrRGMio",{"id":921,"title":922,"ai":923,"body":928,"categories":1672,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":1673,"navigation":91,"path":1686,"published_at":1687,"question":61,"scraped_at":1688,"seo":1689,"sitemap":1690,"source_id":1691,"source_name":456,"source_type":99,"source_url":1692,"stem":1693,"tags":1694,"thumbnail_url":61,"tldr":1695,"tweet":61,"unknown_tags":1696,"__hash__":1697},"summaries\u002Fsummaries\u002Fdatashader-pipeline-for-massive-data-viz-summary.md","Datashader Pipeline for Massive Data Viz",{"provider":8,"model":9,"input_tokens":924,"output_tokens":925,"processing_time_ms":926,"cost_usd":927},10442,3139,30405,0.0036354,{"type":15,"value":929,"toc":1664},[930,934,937,957,963,1007,1010,1083,1089,1095,1105,1109,1126,1131,1151,1154,1214,1217,1252,1257,1271,1281,1285,1288,1324,1327,1357,1363,1393,1398,1411,1415,1418,1438,1441,1481,1487,1492,1498,1502,1508,1511,1551,1557,1562,1567,1573,1579,1584,1589,1594,1599,1603,1662],[18,931,933],{"id":932},"core-datashader-rendering-pipeline","Core Datashader Rendering Pipeline",[23,935,936],{},"Datashader renders massive datasets by binning data into a fixed canvas grid and applying reductions like count, sum, or mean, producing a raster aggregate independent of data size. This avoids overplotting that cripples tools like Matplotlib on >10k points.",[23,938,939,943,944,516,947,516,950,516,953,956],{},[940,941,942],"strong",{},"Setup prerequisites",": Install ",[207,945,946],{},"datashader",[207,948,949],{},"colorcet",[207,951,952],{},"numba",[207,954,955],{},"scipy"," via pip. Use Pandas DataFrames for points. Assumes intermediate Python\u002Fpandas knowledge; no prior Datashader needed.",[23,958,959,962],{},[940,960,961],{},"Pipeline steps",":",[964,965,966,973,989,996],"ol",{},[272,967,968,969,972],{},"Create ",[207,970,971],{},"ds.Canvas(plot_width=600, plot_height=500, x_range=(-4,4), y_range=(-4,4))","—defines output resolution and bounds.",[272,974,975,976,979,980,516,982,516,985,988],{},"Aggregate: ",[207,977,978],{},"agg = canvas.points(df, 'x', 'y', agg=rd.count())"," for points (similar for ",[207,981,211],{},[207,983,984],{},"raster",[207,986,987],{},"quadmesh",").",[272,990,991,992,995],{},"Shade: ",[207,993,994],{},"img = tf.shade(agg, cmap=cc.fire, how='eq_hist')","—maps aggregates to colors via normalization ('linear', 'log', 'eq_hist').",[272,997,998,999,1002,1003,1006],{},"Display: ",[207,1000,1001],{},"show(img)"," helper converts to PIL for Matplotlib ",[207,1004,1005],{},"imshow",".",[23,1008,1009],{},"For 2M points:",[202,1011,1013],{"className":204,"code":1012,"language":105,"meta":53,"style":53},"import datashader as ds\nimport datashader.transfer_functions as tf\nfrom datashader import reductions as rd\nimport colorcet as cc\nrng = np.random.default_rng(42)\nN = 2_000_000\nx, y = ...  # clustered normals\ndf = pd.DataFrame({'x':x, 'y':y})\ncanvas = ds.Canvas(plot_width=600, plot_height=500, x_range=(-4,4), y_range=(-4,4))\nagg = canvas.points(df, 'x', 'y', agg=rd.count())\nfig, axes = plt.subplots(1,3)\nfor ax, (norm, cmap) in zip(axes, [('linear', cc.blues), ('log', cc.fire), ('eq_hist', cc.bmy)]):\n    tf.shade(agg, cmap=cmap, how=norm)\n",[207,1014,1015,1020,1025,1030,1035,1040,1045,1050,1055,1060,1065,1071,1077],{"__ignoreMap":53},[185,1016,1017],{"class":211,"line":212},[185,1018,1019],{},"import datashader as ds\n",[185,1021,1022],{"class":211,"line":54},[185,1023,1024],{},"import datashader.transfer_functions as tf\n",[185,1026,1027],{"class":211,"line":88},[185,1028,1029],{},"from datashader import reductions as rd\n",[185,1031,1032],{"class":211,"line":87},[185,1033,1034],{},"import colorcet as cc\n",[185,1036,1037],{"class":211,"line":233},[185,1038,1039],{},"rng = np.random.default_rng(42)\n",[185,1041,1042],{"class":211,"line":239},[185,1043,1044],{},"N = 2_000_000\n",[185,1046,1047],{"class":211,"line":245},[185,1048,1049],{},"x, y = ...  # clustered normals\n",[185,1051,1052],{"class":211,"line":251},[185,1053,1054],{},"df = pd.DataFrame({'x':x, 'y':y})\n",[185,1056,1057],{"class":211,"line":325},[185,1058,1059],{},"canvas = ds.Canvas(plot_width=600, plot_height=500, x_range=(-4,4), y_range=(-4,4))\n",[185,1061,1062],{"class":211,"line":330},[185,1063,1064],{},"agg = canvas.points(df, 'x', 'y', agg=rd.count())\n",[185,1066,1068],{"class":211,"line":1067},11,[185,1069,1070],{},"fig, axes = plt.subplots(1,3)\n",[185,1072,1074],{"class":211,"line":1073},12,[185,1075,1076],{},"for ax, (norm, cmap) in zip(axes, [('linear', cc.blues), ('log', cc.fire), ('eq_hist', cc.bmy)]):\n",[185,1078,1080],{"class":211,"line":1079},13,[185,1081,1082],{},"    tf.shade(agg, cmap=cmap, how=norm)\n",[23,1084,1085,1088],{},[940,1086,1087],{},"Principle",": Normalization reveals structure—'eq_hist' equalizes bin visibility for dense clusters; 'log' compresses outliers.",[23,1090,1091,1094],{},[940,1092,1093],{},"Quality criteria",": No pixelation on zoom; uniform color distribution shows balanced revelation of density.",[23,1096,1097,1100,1101,1104],{},[940,1098,1099],{},"Pitfall",": Fixed canvas ignores data extent—always set ",[207,1102,1103],{},"x_range\u002Fy_range"," via quantiles or domain knowledge.",[18,1106,1108],{"id":1107},"reduction-aggregations-and-categorical-rendering","Reduction Aggregations and Categorical Rendering",[23,1110,1111,1112,516,1115,516,1118,1121,1122,1125],{},"Beyond count, use per-pixel reductions on value columns: ",[207,1113,1114],{},"rd.sum('value')",[207,1116,1117],{},"rd.mean('value')",[207,1119,1120],{},"rd.std('value')",", etc. For categories, ",[207,1123,1124],{},"rd.count_cat('label')"," yields multi-channel aggregates.",[23,1127,1128,962],{},[940,1129,1130],{},"Steps for reductions",[269,1132,1133,1139,1144],{},[272,1134,1135,1136],{},"Add columns: ",[207,1137,1138],{},"df['value'] = rng.exponential(2, len(df)); df['label'] = pd.Categorical(...)",[272,1140,975,1141],{},[207,1142,1143],{},"agg = canvas.points(df, 'x', 'y', agg=rd.sum('value'))",[272,1145,1146,1147,1150],{},"Shade with cmap or ",[207,1148,1149],{},"color_key={'A':'#e41a1c', ...}"," for cats.",[23,1152,1153],{},"Example configs:",[348,1155,1156,1169],{},[351,1157,1158],{},[354,1159,1160,1163,1166],{},[357,1161,1162],{},"Reduction",[357,1164,1165],{},"Colormap",[357,1167,1168],{},"Use Case",[364,1170,1171,1186,1200],{},[354,1172,1173,1178,1183],{},[369,1174,1175],{},[207,1176,1177],{},"rd.count()",[369,1179,1180],{},[207,1181,1182],{},"cc.kbc",[369,1184,1185],{},"Density",[354,1187,1188,1192,1197],{},[369,1189,1190],{},[207,1191,1114],{},[369,1193,1194],{},[207,1195,1196],{},"cc.CET_L3",[369,1198,1199],{},"Total intensity",[354,1201,1202,1206,1211],{},[369,1203,1204],{},[207,1205,1124],{},[369,1207,1208],{},[207,1209,1210],{},"color_key",[369,1212,1213],{},"Group separation",[23,1215,1216],{},"For 500k categorical clusters:",[202,1218,1220],{"className":204,"code":1219,"language":105,"meta":53,"style":53},"categories = ['Cluster A', ...]; centers = [(-2,-2), ...]\ndf_cat = pd.concat([pd.DataFrame({'x':rng.normal(cx,0.8,n), 'y':..., 'cat':cat})])\nagg_cat = canvas.points(df_cat, 'x','y', agg=rd.count_cat('cat'))\nimg = tf.shade(agg_cat, color_key=colors)\nimg_spread = tf.spread(img, px=1)  # Anti-alias dots\nimg_bg = tf.set_background(img, 'black')\n",[207,1221,1222,1227,1232,1237,1242,1247],{"__ignoreMap":53},[185,1223,1224],{"class":211,"line":212},[185,1225,1226],{},"categories = ['Cluster A', ...]; centers = [(-2,-2), ...]\n",[185,1228,1229],{"class":211,"line":54},[185,1230,1231],{},"df_cat = pd.concat([pd.DataFrame({'x':rng.normal(cx,0.8,n), 'y':..., 'cat':cat})])\n",[185,1233,1234],{"class":211,"line":88},[185,1235,1236],{},"agg_cat = canvas.points(df_cat, 'x','y', agg=rd.count_cat('cat'))\n",[185,1238,1239],{"class":211,"line":87},[185,1240,1241],{},"img = tf.shade(agg_cat, color_key=colors)\n",[185,1243,1244],{"class":211,"line":233},[185,1245,1246],{},"img_spread = tf.spread(img, px=1)  # Anti-alias dots\n",[185,1248,1249],{"class":211,"line":239},[185,1250,1251],{},"img_bg = tf.set_background(img, 'black')\n",[23,1253,1254,1256],{},[940,1255,1087],{},": Reductions summarize without subsampling; cats enable direct color mapping.",[23,1258,1259,1262,1263,1266,1267,1270],{},[940,1260,1261],{},"Common mistake",": Forgetting ",[207,1264,1265],{},"pd.Categorical","—ensures ordered channels. Avoid ",[207,1268,1269],{},"px=0"," spread on sparse data (dots vanish).",[23,1272,1273,1276,1277,1280],{},[940,1274,1275],{},"Before\u002Fafter",": Raw cat shade shows blocks; ",[207,1278,1279],{},"spread(px=1)"," smooths to clusters; black bg boosts contrast.",[18,1282,1284],{"id":1283},"glyph-types-points-lines-rasters-quadmeshes","Glyph Types: Points, Lines, Rasters, Quadmeshes",[23,1286,1287],{},"Datashader supports diverse geometries:",[269,1289,1290,1296,1306,1315],{},[272,1291,1292,1295],{},[940,1293,1294],{},"Points",": Default for scatter.",[272,1297,1298,1301,1302,1305],{},[940,1299,1300],{},"Lines",": ",[207,1303,1304],{},"canvas.line(df, 'x','y', agg=rd.count(), line_width=1)"," for 5k walks (500 steps each)—renders overlaps as density.",[272,1307,1308,1301,1311,1314],{},[940,1309,1310],{},"Raster",[207,1312,1313],{},"canvas.raster(xarray_da)"," for uniform grids; shade synthetic elevations.",[272,1316,1317,1301,1320,1323],{},[940,1318,1319],{},"Quadmesh",[207,1321,1322],{},"canvas.quadmesh(nonuniform_da)"," for irregular lat\u002Flon grids; handles vortices\u002Fanomalies.",[23,1325,1326],{},"Line example (5k series):",[202,1328,1330],{"className":204,"code":1329,"language":105,"meta":53,"style":53},"t = np.linspace(0,1,500); xs=np.tile(t,5000)\nwalks = np.cumsum(rng.normal(0,0.05,(5000,500)),1).ravel()\ndf_lines = pd.DataFrame({'x':xs,'y':walks,'id':np.repeat(range(5000),500)})\nagg_lines = canvas.line(df_lines,'x','y',agg=rd.count())\ntf.shade(agg_lines, cmap=cc.fire, how='eq_hist')\n",[207,1331,1332,1337,1342,1347,1352],{"__ignoreMap":53},[185,1333,1334],{"class":211,"line":212},[185,1335,1336],{},"t = np.linspace(0,1,500); xs=np.tile(t,5000)\n",[185,1338,1339],{"class":211,"line":54},[185,1340,1341],{},"walks = np.cumsum(rng.normal(0,0.05,(5000,500)),1).ravel()\n",[185,1343,1344],{"class":211,"line":88},[185,1345,1346],{},"df_lines = pd.DataFrame({'x':xs,'y':walks,'id':np.repeat(range(5000),500)})\n",[185,1348,1349],{"class":211,"line":87},[185,1350,1351],{},"agg_lines = canvas.line(df_lines,'x','y',agg=rd.count())\n",[185,1353,1354],{"class":211,"line":233},[185,1355,1356],{},"tf.shade(agg_lines, cmap=cc.fire, how='eq_hist')\n",[23,1358,1359,1360,962],{},"Raster\u002Fquadmesh use ",[207,1361,1362],{},"xarray.DataArray",[202,1364,1366],{"className":204,"code":1365,"language":105,"meta":53,"style":53},"lon=np.linspace(-180,180,1000); lat=np.linspace(-90,90,1000)\nLON,LAT=np.meshgrid(lon,lat)\nz = multivariate_normal.pdf(...)  # Gaussians\n da=xr.DataArray(z, dims=['y','x'], coords={'x':lon,'y':lat})\nagg_raster=canvas.raster(da)\n",[207,1367,1368,1373,1378,1383,1388],{"__ignoreMap":53},[185,1369,1370],{"class":211,"line":212},[185,1371,1372],{},"lon=np.linspace(-180,180,1000); lat=np.linspace(-90,90,1000)\n",[185,1374,1375],{"class":211,"line":54},[185,1376,1377],{},"LON,LAT=np.meshgrid(lon,lat)\n",[185,1379,1380],{"class":211,"line":88},[185,1381,1382],{},"z = multivariate_normal.pdf(...)  # Gaussians\n",[185,1384,1385],{"class":211,"line":87},[185,1386,1387],{}," da=xr.DataArray(z, dims=['y','x'], coords={'x':lon,'y':lat})\n",[185,1389,1390],{"class":211,"line":233},[185,1391,1392],{},"agg_raster=canvas.raster(da)\n",[23,1394,1395,1397],{},[940,1396,1087],{},": Glyph choice matches data structure—lines aggregate paths; quadmesh interpolates irregular grids.",[23,1399,1400,1402,1403,1406,1407,1410],{},[940,1401,1099],{},": Line ",[207,1404,1405],{},"line_width>1"," blurs; use ",[207,1408,1409],{},"how='log'"," for sparse overlaps.",[18,1412,1414],{"id":1413},"compositing-spreading-and-performance-scaling","Compositing, Spreading, and Performance Scaling",[23,1416,1417],{},"Enhance outputs:",[269,1419,1420,1426,1432],{},[272,1421,1422,1425],{},[207,1423,1424],{},"tf.spread(img, px=2)",": Expands pixels for visibility (0-4 tested).",[272,1427,1428,1431],{},[207,1429,1430],{},"tf.stack(bg_shade, fg_shade)",": Layers (alpha=200 for blend).",[272,1433,1434,1437],{},[207,1435,1436],{},"tf.set_background(img, 'black')",": Contrast.",[23,1439,1440],{},"Benchmark: Float32 DataFrames; 20M points → ~500ms on 800x700 canvas (loglog scales linearly).",[202,1442,1444],{"className":204,"code":1443,"language":105,"meta":53,"style":53},"sizes = [10_000, ..., 20_000_000]\nfor n in sizes:\n    dfb=pd.DataFrame({'x':rng.normal(0,1,n).astype(np.float32), 'y':...})\n    cv=ds.Canvas(800,700)\n    t0=time.perf_counter()\n    cv.points(dfb,'x','y',rd.count())\n    print(f'{n:,} → {(time.perf_counter()-t0)*1000:.1f}ms')\n",[207,1445,1446,1451,1456,1461,1466,1471,1476],{"__ignoreMap":53},[185,1447,1448],{"class":211,"line":212},[185,1449,1450],{},"sizes = [10_000, ..., 20_000_000]\n",[185,1452,1453],{"class":211,"line":54},[185,1454,1455],{},"for n in sizes:\n",[185,1457,1458],{"class":211,"line":88},[185,1459,1460],{},"    dfb=pd.DataFrame({'x':rng.normal(0,1,n).astype(np.float32), 'y':...})\n",[185,1462,1463],{"class":211,"line":87},[185,1464,1465],{},"    cv=ds.Canvas(800,700)\n",[185,1467,1468],{"class":211,"line":233},[185,1469,1470],{},"    t0=time.perf_counter()\n",[185,1472,1473],{"class":211,"line":239},[185,1474,1475],{},"    cv.points(dfb,'x','y',rd.count())\n",[185,1477,1478],{"class":211,"line":245},[185,1479,1480],{},"    print(f'{n:,} → {(time.perf_counter()-t0)*1000:.1f}ms')\n",[23,1482,1483,1484,1006],{},"Custom Matplotlib cmaps: ",[207,1485,1486],{},"colours = [mcolors.to_hex(plt.get_cmap('inferno')(i\u002F255)) for i in range(256)]; tf.shade(agg, cmap=colours)",[23,1488,1489,1491],{},[940,1490,1087],{},": Raster ops are O(canvas pixels), not O(data)—scales to billions.",[23,1493,1494,1497],{},[940,1495,1496],{},"Quality",": \u003C1s for 20M ensures interactive zooms.",[18,1499,1501],{"id":1500},"multi-panel-dashboards-and-ecosystem-integration","Multi-Panel Dashboards and Ecosystem Integration",[23,1503,1504,1505,988],{},"Build dashboards: GridSpec panels with quantile ranges (",[207,1506,1507],{},"df[col].quantile([0.001,0.999])",[23,1509,1510],{},"Synthetic trades (1.5M rows):",[202,1512,1514],{"className":204,"code":1513,"language":105,"meta":53,"style":53},"df10=pd.DataFrame({'price':cumsum(normal), 'vol':..., 'ret':diff(price), 'hour':...})\ngs=GridSpec(2,3)\nfor spec, xcol,ycol,title,cmap in panels:\n    xr=(df10[xcol].quantile(0.001), df10[xcol].quantile(0.999))\n    cv=ds.Canvas(300,250, x_range=xr, y_range=yr_)\n    img=tf.shade(cv.points(df10,xcol,ycol,rd.count()), cmap=cmap, how='eq_hist')\n    show(img, title, ax=fig.add_subplot(spec))\n",[207,1515,1516,1521,1526,1531,1536,1541,1546],{"__ignoreMap":53},[185,1517,1518],{"class":211,"line":212},[185,1519,1520],{},"df10=pd.DataFrame({'price':cumsum(normal), 'vol':..., 'ret':diff(price), 'hour':...})\n",[185,1522,1523],{"class":211,"line":54},[185,1524,1525],{},"gs=GridSpec(2,3)\n",[185,1527,1528],{"class":211,"line":88},[185,1529,1530],{},"for spec, xcol,ycol,title,cmap in panels:\n",[185,1532,1533],{"class":211,"line":87},[185,1534,1535],{},"    xr=(df10[xcol].quantile(0.001), df10[xcol].quantile(0.999))\n",[185,1537,1538],{"class":211,"line":233},[185,1539,1540],{},"    cv=ds.Canvas(300,250, x_range=xr, y_range=yr_)\n",[185,1542,1543],{"class":211,"line":239},[185,1544,1545],{},"    img=tf.shade(cv.points(df10,xcol,ycol,rd.count()), cmap=cmap, how='eq_hist')\n",[185,1547,1548],{"class":211,"line":245},[185,1549,1550],{},"    show(img, title, ax=fig.add_subplot(spec))\n",[23,1552,1553,1554,1006],{},"Zoom: New canvas per view—no fidelity loss.\nOverlay: ",[207,1555,1556],{},"ax.imshow(img.to_pil(), extent=[xmin,xmax,ymin,ymax]); ax.contour(kde_grid)",[23,1558,1559,1561],{},[940,1560,1087],{},": Quantile ranges focus 99.8% data; stack with Matplotlib for contours\u002FKDE (sample 20k for KDE).",[23,1563,1564,1566],{},[940,1565,1099],{},": Full data KDE OOMs—subsample.",[23,1568,1569,1572],{},[940,1570,1571],{},"Exercise",": Port your >1M row dataset; benchmark vs scatter; add zoom callback.",[1574,1575,1576],"blockquote",{},[23,1577,1578],{},"\"Datashader transforms raw large-scale data into meaningful visual structure with speed, flexibility, and visual clarity.\"",[1574,1580,1581],{},[23,1582,1583],{},"\"Aggregation-first approach enables preservation of detail, avoidance of overplotting, and zooming into dense regions without losing fidelity.\"",[1574,1585,1586],{},[23,1587,1588],{},"\"Rendering time scales with canvas pixels, not data size—20M points in 500ms.\"",[1574,1590,1591],{},[23,1592,1593],{},"\"Use 'eq_hist' for balanced density revelation in clusters.\"",[1574,1595,1596],{},[23,1597,1598],{},"\"Float32 DataFrames and numba acceleration keep perf high.\"",[18,1600,1602],{"id":1601},"key-takeaways","Key Takeaways",[269,1604,1605,1618,1625,1637,1640,1643,1646,1656,1659],{},[272,1606,1607,1608,1611,1612,1611,1615,1006],{},"Start every plot with ",[207,1609,1610],{},"Canvas"," → ",[207,1613,1614],{},"points\u002Fline\u002Fraster\u002Fquadmesh",[207,1616,1617],{},"shade(how='eq_hist')",[272,1619,1620,1621,1624],{},"Add value\u002Fcats columns for ",[207,1622,1623],{},"rd.sum\u002Fmean\u002Fcount_cat","; pick cmap via colorcet.",[272,1626,1627,516,1630,516,1633,1636],{},[207,1628,1629],{},"spread(px=1-2)",[207,1631,1632],{},"stack(layers)",[207,1634,1635],{},"set_background"," for polish.",[272,1638,1639],{},"Benchmark: Use float32; expect ms for millions on CPU.",[272,1641,1642],{},"Dashboards: Quantile ranges per panel; Matplotlib for overlays.",[272,1644,1645],{},"Zoom arbitrary subregions—re-aggregate on new canvas.",[272,1647,1648,1649,1652,1653,1655],{},"Integrate: ",[207,1650,1651],{},"img.to_pil()"," for ",[207,1654,1005],{},"; sample for KDE contours.",[272,1657,1658],{},"Avoid: Traditional scatters >100k; fixed ranges without quantiles.",[272,1660,1661],{},"Practice: Run Colab notebook; scale your CSV to 10M rows.",[431,1663,433],{},{"title":53,"searchDepth":54,"depth":54,"links":1665},[1666,1667,1668,1669,1670,1671],{"id":932,"depth":54,"text":933},{"id":1107,"depth":54,"text":1108},{"id":1283,"depth":54,"text":1284},{"id":1413,"depth":54,"text":1414},{"id":1500,"depth":54,"text":1501},{"id":1601,"depth":54,"text":1602},[440],{"content_references":1674,"triage":1684},[1675,1678,1681],{"type":80,"title":1676,"url":1677,"context":447},"Datashader","https:\u002F\u002Fgithub.com\u002Fholoviz\u002Fdatashader",{"type":444,"title":1679,"url":1680,"context":71},"datashader_massive_data_visualization_Marktechpost.ipynb","https:\u002F\u002Fgithub.com\u002FMarktechpost\u002FAI-Agents-Projects-Tutorials\u002Fblob\u002Fmain\u002FData%20Science\u002Fdatashader_massive_data_visualization_Marktechpost.ipynb",{"type":444,"title":1682,"url":1683,"context":447},"Machine-learning-Data-science-Tutorials","https:\u002F\u002Fgithub.com\u002FMarktechpost\u002FMachine-learning-Data-science-Tutorials",{"relevance":233,"novelty":88,"quality":87,"actionability":87,"composite":795,"reasoning":1685},"Category: Data Science & Visualization. The article provides a detailed tutorial on using Datashader for visualizing massive datasets, which directly addresses the audience's need for practical applications in data visualization. It includes specific code examples and steps that can be immediately applied, making it actionable for developers looking to implement this in their projects.","\u002Fsummaries\u002Fdatashader-pipeline-for-massive-data-viz-summary","2026-04-26 04:04:15","2026-04-26 17:23:03",{"title":922,"description":53},{"loc":1686},"dfee1262b8c91c14","https:\u002F\u002Fwww.marktechpost.com\u002F2026\u002F04\u002F25\u002Fa-coding-tutorial-on-datashader-on-rendering-massive-datasets-with-high-performance-python-visual-analytics\u002F","summaries\u002Fdatashader-pipeline-for-massive-data-viz-summary",[104,105,162],"Master Datashader's aggregation-first pipeline to render millions of points, lines, grids, and composites scalably with Python, bypassing overplotting in Matplotlib.",[],"lfbDWqAIFEuB_IzZTo_2PZyvLfpOJzVWsaBB_LOcWEQ",{"id":1699,"title":1700,"ai":1701,"body":1706,"categories":1949,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":1950,"navigation":91,"path":1961,"published_at":1962,"question":61,"scraped_at":1963,"seo":1964,"sitemap":1965,"source_id":1966,"source_name":158,"source_type":99,"source_url":1967,"stem":1968,"tags":1969,"thumbnail_url":61,"tldr":1971,"tweet":61,"unknown_tags":1972,"__hash__":1973},"summaries\u002Fsummaries\u002Fautomate-weekly-pdf-reports-with-python-etl-pipeli-summary.md","Automate Weekly PDF Reports with Python ETL Pipeline",{"provider":8,"model":9,"input_tokens":1702,"output_tokens":1703,"processing_time_ms":1704,"cost_usd":1705},8933,2254,17256,0.00289095,{"type":15,"value":1707,"toc":1944},[1708,1712,1715,1765,1780,1796,1806,1809,1813,1816,1861,1864,1867,1870,1874,1877,1880,1935,1938,1941],[18,1709,1711],{"id":1710},"merge-raw-datasets-into-actionable-business-data","Merge Raw Datasets into Actionable Business Data",[23,1713,1714],{},"Start by loading six Olist e-commerce CSVs (orders, customers, items, payments, products, reviews) with pandas.read_csv, then merge on keys like customer_id, order_id, product_id:",[202,1716,1718],{"className":204,"code":1717,"language":105,"meta":53,"style":53},"def load_data():\n    return {\n        \"orders\": pd.read_csv(\"data\u002Folist_orders_dataset.csv\"),\n        # ... other datasets\n    }\n\ndf = data[\"orders\"].merge(data[\"customers\"], on=\"customer_id\", how=\"left\") \\\n    .merge(data[\"items\"], on=\"order_id\", how=\"left\") \\\n    # ... other merges\n",[207,1719,1720,1725,1730,1735,1740,1745,1750,1755,1760],{"__ignoreMap":53},[185,1721,1722],{"class":211,"line":212},[185,1723,1724],{},"def load_data():\n",[185,1726,1727],{"class":211,"line":54},[185,1728,1729],{},"    return {\n",[185,1731,1732],{"class":211,"line":88},[185,1733,1734],{},"        \"orders\": pd.read_csv(\"data\u002Folist_orders_dataset.csv\"),\n",[185,1736,1737],{"class":211,"line":87},[185,1738,1739],{},"        # ... other datasets\n",[185,1741,1742],{"class":211,"line":233},[185,1743,1744],{},"    }\n",[185,1746,1747],{"class":211,"line":239},[185,1748,1749],{"emptyLinePlaceholder":91},"\n",[185,1751,1752],{"class":211,"line":245},[185,1753,1754],{},"df = data[\"orders\"].merge(data[\"customers\"], on=\"customer_id\", how=\"left\") \\\n",[185,1756,1757],{"class":211,"line":251},[185,1758,1759],{},"    .merge(data[\"items\"], on=\"order_id\", how=\"left\") \\\n",[185,1761,1762],{"class":211,"line":325},[185,1763,1764],{},"    # ... other merges\n",[23,1766,1767,1768,1771,1772,1775,1776,1779],{},"Convert timestamps to datetime for time-based calcs: df",[185,1769,1770],{},"\"order_purchase_timestamp\""," = pd.to_datetime(...). Compute delivery delays as (delivered - estimated).dt.days > 0 for is_delayed. Derive revenue = price + freight_value, profit = price - freight_value. Aggregate metrics like revenue_current = df",[185,1773,1774],{},"\"revenue\"",".sum(), orders_current = df",[185,1777,1778],{},"\"order_id\"",".nunique(), AOV = revenue \u002F orders.",[23,1781,1782,1783,1786,1787,1789,1790,1786,1793,1795],{},"Group by month for trends: monthly = df.groupby(\"month\").agg({\"revenue\": \"sum\", \"order_id\": \"nunique\"}); monthly",[185,1784,1785],{},"\"growth\""," = monthly",[185,1788,1774],{},".pct_change() * 100; monthly",[185,1791,1792],{},"\"moving_avg\"",[185,1794,1774],{},".rolling(3).mean().",[23,1797,1798,1799,1805],{},"Simulate weekly reporting with cutoff: df_sim = df",[185,1800,1801,1802,1804],{},"df",[185,1803,1770],{}," \u003C= cutoff_date",", advancing cutoff_date = start_date + pd.Timedelta(days=7 * run_count) via state.txt to mimic live cycles without reprocessing all history.",[23,1807,1808],{},"This standardization ensures consistent metric definitions across runs, turning scattered CSVs into a unified view of who bought what, payment amounts, delivery times, and satisfaction.",[18,1810,1812],{"id":1811},"add-rule-based-insights-and-build-pdf-reports","Add Rule-Based Insights and Build PDF Reports",[23,1814,1815],{},"Metrics alone fail without context—use simple if-conditions to interpret:",[202,1817,1819],{"className":204,"code":1818,"language":105,"meta":53,"style":53},"def generate_insights(metrics):\n    insights = []\n    if metrics[\"profit_current\"] \u003C metrics[\"revenue_current\"]:\n        insights.append(\"Revenue growing but profit margin thin, high logistics costs.\")\n    growth_volatility = metrics[\"monthly\"][\"growth\"].std()\n    if growth_volatility > 50:\n        insights.append(\"Revenue growth highly volatile, unstable performance.\")\n    # ...\n",[207,1820,1821,1826,1831,1836,1841,1846,1851,1856],{"__ignoreMap":53},[185,1822,1823],{"class":211,"line":212},[185,1824,1825],{},"def generate_insights(metrics):\n",[185,1827,1828],{"class":211,"line":54},[185,1829,1830],{},"    insights = []\n",[185,1832,1833],{"class":211,"line":88},[185,1834,1835],{},"    if metrics[\"profit_current\"] \u003C metrics[\"revenue_current\"]:\n",[185,1837,1838],{"class":211,"line":87},[185,1839,1840],{},"        insights.append(\"Revenue growing but profit margin thin, high logistics costs.\")\n",[185,1842,1843],{"class":211,"line":233},[185,1844,1845],{},"    growth_volatility = metrics[\"monthly\"][\"growth\"].std()\n",[185,1847,1848],{"class":211,"line":239},[185,1849,1850],{},"    if growth_volatility > 50:\n",[185,1852,1853],{"class":211,"line":245},[185,1854,1855],{},"        insights.append(\"Revenue growth highly volatile, unstable performance.\")\n",[185,1857,1858],{"class":211,"line":251},[185,1859,1860],{},"    # ...\n",[23,1862,1863],{},"Generate PDF with ReportLab: create executive summary (e.g., 2018 revenue \u003C 2017, orders down, AOV stable, 9.36% delay rate, 3.91 avg review score), KPI trends (Jan 2018 revenue\u002Fprofit >600% over 2017 but slowing; AOV 2-14% lower, driven by transaction volume), top products (relogios_presentes\u002Fbeleza_saude ~510K revenue each), delivery (SE state 33% delays, casa_conforto_2 60%; overall -10.76 avg delay days = early deliveries), payments (credit card 75%, boleto 19.1%), reviews (5-stars dominant, avg 3.91).",[23,1865,1866],{},"Key patterns: thin margins from costs; volatile growth; new-customer reliance; delays hurt scores; SP top region; credit users spend more.",[23,1868,1869],{},"Code charts with matplotlib (plt.savefig(\"revenue_chart.png\")), insert via Image(width=450,height=220), tables via Table(table_data). Central pipeline: data → transform → metrics → insights → generate_report().",[18,1871,1873],{"id":1872},"schedule-email-delivery-with-github-actions","Schedule Email Delivery with GitHub Actions",[23,1875,1876],{},"Automate email: use smtplib.SMTP_SSL('smtp.gmail.com',465), login via os.getenv(\"EMAIL_SENDER\u002FPASSWORD\"), attach PDF, dynamic subject. Secure creds in GitHub Secrets (EMAIL_SENDER, EMAIL_PASSWORD, EMAIL_RECEIVER).",[23,1878,1879],{},"Deploy via .github\u002Fworkflows\u002Fauto-report.yml:",[202,1881,1885],{"className":1882,"code":1883,"language":1884,"meta":53,"style":53},"language-yaml shiki shiki-themes github-light github-dark","on:\n  schedule:\n    - cron: '0 1 * * 1'  # Mondays 1AM UTC\njobs:\n  # setup env, pip install, run main.py\n","yaml",[207,1886,1887,1897,1905,1923,1930],{"__ignoreMap":53},[185,1888,1889,1893],{"class":211,"line":212},[185,1890,1892],{"class":1891},"sj4cs","on",[185,1894,1896],{"class":1895},"sVt8B",":\n",[185,1898,1899,1903],{"class":211,"line":54},[185,1900,1902],{"class":1901},"s9eBZ","  schedule",[185,1904,1896],{"class":1895},[185,1906,1907,1910,1913,1915,1919],{"class":211,"line":88},[185,1908,1909],{"class":1895},"    - ",[185,1911,1912],{"class":1901},"cron",[185,1914,1301],{"class":1895},[185,1916,1918],{"class":1917},"sZZnC","'0 1 * * 1'",[185,1920,1922],{"class":1921},"sJ8bj","  # Mondays 1AM UTC\n",[185,1924,1925,1928],{"class":211,"line":87},[185,1926,1927],{"class":1901},"jobs",[185,1929,1896],{"class":1895},[185,1931,1932],{"class":211,"line":233},[185,1933,1934],{"class":1921},"  # setup env, pip install, run main.py\n",[23,1936,1937],{},"Triggers workflow: installs deps, executes pipeline (advances run_count), generates\u002Fsends report. No local runs—wake to delivered emails. Full loop: cron → ETL → PDF → email → state update for next cutoff.",[23,1939,1940],{},"Trade-offs: Relies on GitHub free tier (2k min\u002Fmonth); Gmail app passwords needed; rule-insights basic (extend with ML if needed). Scales to live data sources by swapping CSVs for APIs\u002FDBs.",[431,1942,1943],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":53,"searchDepth":54,"depth":54,"links":1945},[1946,1947,1948],{"id":1710,"depth":54,"text":1711},{"id":1811,"depth":54,"text":1812},{"id":1872,"depth":54,"text":1873},[440],{"content_references":1951,"triage":1959},[1952,1956],{"type":603,"title":1953,"author":1954,"url":1955,"context":447},"Brazilian Ecommerce Public Dataset by Olist","Olist","https:\u002F\u002Fwww.kaggle.com\u002Fdatasets\u002Folistbr\u002Fbrazilian-ecommerce",{"type":444,"title":1957,"author":792,"url":1958,"context":71},"Weekly-Business-Report-Automation","https:\u002F\u002Fgithub.com\u002FjihanKamilah\u002FWeekly-Business-Report-Automation\u002F",{"relevance":233,"novelty":88,"quality":87,"actionability":233,"composite":610,"reasoning":1960},"Category: AI Automation. The article provides a detailed guide on automating weekly reports using a Python ETL pipeline, which directly addresses the audience's need for practical automation solutions. It includes specific code examples and actionable steps, making it highly relevant and immediately applicable for those building AI-powered products.","\u002Fsummaries\u002Fautomate-weekly-pdf-reports-with-python-etl-pipeli-summary","2026-04-21 13:31:02","2026-04-21 15:26:14",{"title":1700,"description":53},{"loc":1961},"90a024f8fc9fd261","https:\u002F\u002Fmedium.com\u002Flearning-data\u002Fi-was-tired-of-weekly-reports-so-i-automated-the-entire-thing-f63f88de59ce?source=rss----eec44e936bf1---4","summaries\u002Fautomate-weekly-pdf-reports-with-python-etl-pipeli-summary",[105,1970,162,104],"automation","Load\u002Fmerge e-commerce datasets, compute revenue\u002Fprofit\u002FAOV\u002Fgrowth metrics, generate PDF with matplotlib\u002FReportLab charts and rule-based insights, email via smtplib, schedule weekly via GitHub Actions cron.",[],"wPVMuKpmy9CJAslH5PL2NWioIIRjCaeH167YEBeAQJQ",{"id":1975,"title":1976,"ai":1977,"body":1982,"categories":2060,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":2061,"navigation":91,"path":2090,"published_at":2091,"question":61,"scraped_at":2091,"seo":2092,"sitemap":2093,"source_id":2094,"source_name":2095,"source_type":99,"source_url":2096,"stem":2097,"tags":2098,"thumbnail_url":61,"tldr":2100,"tweet":61,"unknown_tags":2101,"__hash__":2102},"summaries\u002Fsummaries\u002Fdatasette-instant-data-exploration-and-publishing--summary.md","Datasette: Instant Data Exploration and Publishing Tool",{"provider":8,"model":9,"input_tokens":1978,"output_tokens":1979,"processing_time_ms":1980,"cost_usd":1981},8497,2085,17396,0.0027194,{"type":15,"value":1983,"toc":2055},[1984,1988,1995,1998,2002,2029,2044,2048],[18,1985,1987],{"id":1986},"transform-any-data-into-explorables-and-apis","Transform Any Data into Explorables and APIs",[23,1989,1990,1991,1994],{},"Load CSVs, JSON, or database files into SQLite and instantly get a faceted, searchable web interface plus JSON API endpoints. Patterns emerge automatically: filter\u002Fsort by facets, expand foreign keys into linked pages, and export subsets via CSV\u002FSQL. Publish with ",[207,1992,1993],{},"datasette publish"," to Heroku, Vercel, or Cloud Run in one command—no servers needed. Demo: explore 33,000 global power plants at datasette.io\u002Fglobal-power-plants\u002Fglobal-power-plants, revealing distributions by country\u002Ffuel without code.",[23,1996,1997],{},"Trade-offs: Excels for read-heavy sharing (journalists, scientists, governments) but alphas introduce breaking changes like metadata shifts or permission overhauls—check upgrade guides. Desktop app runs locally on macOS for offline prototyping.",[18,1999,2001],{"id":2000},"accelerate-workflows-analysis-prototyping-enrichment","Accelerate Workflows: Analysis, Prototyping, Enrichment",[23,2003,2004,2005,516,2008,516,2011,2014,2015,2018,2019,516,2022,516,2025,2028],{},"For exploratory data analysis, import data and share live views with colleagues—faceted search surfaces outliers fast. Prototype APIs in minutes: spin up ",[207,2006,2007],{},"\u002F-\u002Frows",[207,2009,2010],{},"\u002F-\u002Ffacet",[207,2012,2013],{},"\u002F-\u002Fupsert"," endpoints for any table, proving ideas before full backends. Recent alphas add ",[207,2016,2017],{},"column_types"," (e.g., ",[207,2020,2021],{},"url",[207,2023,2024],{},"email",[207,2026,2027],{},"json",") for custom rendering\u002Fvalidation—plugins like datasette-files leverage this for smarter displays.",[23,2030,2031,2032,2035,2036,2039,2040,2043],{},"Enrichments run custom code per row (e.g., GPT-4 geocoding\u002Fimages), comments enable collaboration, write-ui adds insert\u002Fedit\u002Fdelete. New CSRF uses ",[207,2033,2034],{},"Sec-Fetch-Site","\u002FOrigin headers (no tokens needed, modern-browser only). Rename tables trigger ",[207,2037,2038],{},"RenameTableEvent"," for plugin reactions; ",[207,2041,2042],{},"actor="," param tests permissions.",[18,2045,2047],{"id":2046},"ecosystem-powers-productivity","Ecosystem Powers Productivity",[23,2049,2050,2051,2054],{},"154 plugins extend facets (e.g., GraphQL, Atom feeds, gzip), 44 companion tools handle extraction\u002Findexing. Alphas target 1.0: SQL permissions, transaction wrappers, file uploads via ",[207,2052,2053],{},"request.form(files=True)",", mobile column actions, startup hooks post-metadata. Security fixes patched open redirects\u002Fexposed privates—always upgrade. Newsletter tracks monthly progress; Discord\u002FMastodon for community.",{"title":53,"searchDepth":54,"depth":54,"links":2056},[2057,2058,2059],{"id":1986,"depth":54,"text":1987},{"id":2000,"depth":54,"text":2001},{"id":2046,"depth":54,"text":2047},[440],{"content_references":2062,"triage":2088},[2063,2066,2070,2075,2079,2082,2085],{"type":80,"title":2064,"url":2065,"context":71},"Datasette Desktop","https:\u002F\u002Fdatasette.io\u002Fdesktop",{"type":444,"title":2067,"author":2068,"url":2069,"context":71},"Annotated version of introductory video","Simon Willison","https:\u002F\u002Fsimonwillison.net\u002F2021\u002FFeb\u002F7\u002Fvideo\u002F",{"type":444,"title":2071,"author":2072,"url":2073,"context":2074},"CSRF protection without tokens","Filippo Valsorda","https:\u002F\u002Fwords.filippo.io\u002Fcsrf\u002F","cited",{"type":2076,"title":2077,"url":2078,"context":2074},"report","GHSA-w832-gg5g-x44m","https:\u002F\u002Fgithub.com\u002Fsimonw\u002Fdatasette\u002Fsecurity\u002Fadvisories\u002FGHSA-w832-gg5g-x44m",{"type":80,"title":2080,"url":2081,"context":447},"Datasette Enrichments","https:\u002F\u002Fenrichments.datasette.io\u002F",{"type":80,"title":2083,"url":2084,"context":447},"datasette-comments","https:\u002F\u002Fdatasette.io\u002Fplugins\u002Fdatasette-comments",{"type":444,"title":2086,"author":2068,"url":2087,"context":2074},"A new SQL-powered permissions system in Datasette 1.0a20","https:\u002F\u002Fsimonwillison.net\u002F2025\u002FNov\u002F4\u002Fdatasette-10a20\u002F",{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":2089},"Category: Data Science & Visualization. The article provides a practical tool for data exploration and API creation, addressing the audience's need for actionable data visualization solutions. It details how to use Datasette for quick prototyping and analysis, which is directly applicable to building AI-powered products.","\u002Fsummaries\u002Fdatasette-instant-data-exploration-and-publishing-summary","2026-04-19 14:53:06",{"title":1976,"description":53},{"loc":2090},"55c6803638ff6a49","__oneoff__","https:\u002F\u002Fdatasette.io\u002F","summaries\u002Fdatasette-instant-data-exploration-and-publishing--summary",[105,162,104,2099],"open-source","Datasette turns SQLite data from CSVs\u002FJSON into interactive websites and JSON APIs, enabling quick analysis, sharing, and prototyping without custom backends—backed by 44 tools and 154 plugins.",[],"ZwgGSmI6QOmeVUxgnl-WMHqB3-Ty4aLo3jw4nazpBqk",{"id":2104,"title":2105,"ai":2106,"body":2111,"categories":2241,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":2242,"navigation":91,"path":2260,"published_at":2261,"question":61,"scraped_at":2262,"seo":2263,"sitemap":2264,"source_id":2265,"source_name":2266,"source_type":99,"source_url":2267,"stem":2268,"tags":2269,"thumbnail_url":61,"tldr":2272,"tweet":61,"unknown_tags":2273,"__hash__":2274},"summaries\u002Fsummaries\u002Fai-chart-code-gen-halves-on-complex-real-data-benc-summary.md","AI Chart Code Gen Halves on Complex Real Data Benchmarks",{"provider":8,"model":9,"input_tokens":2107,"output_tokens":2108,"processing_time_ms":2109,"cost_usd":2110},7475,2662,21912,0.0028035,{"type":15,"value":2112,"toc":2236},[2113,2117,2120,2123,2143,2146,2150,2153,2203,2206,2209,2213,2216,2230,2233],[18,2114,2116],{"id":2115},"benchmark-exposes-complexity-gap-in-chart-to-code-generation","Benchmark Exposes Complexity Gap in Chart-to-Code Generation",[23,2118,2119],{},"RealChart2Code tests AI models' ability to generate Matplotlib code for complex visualizations from real Kaggle datasets totaling 1,036 sources and 860 million rows, creating 2,800+ cases across 50 chart types and composite layouts. Unlike prior synthetic-data benchmarks like Plot2Code and ChartMimic, it reveals a 'complexity gap' where models ace simple charts (e.g., Gemini 3 Pro Preview at 96% normalized on ChartMimic) but collapse to ~50% on real-world complexity. Use this to evaluate LLMs for production data viz pipelines: expect proprietary models to lead but still fail half the time on multi-panel grids or large datasets.",[23,2121,2122],{},"Three tasks measure distinct skills:",[269,2124,2125,2131,2137],{},[272,2126,2127,2130],{},[940,2128,2129],{},"Chart Replication",": Image to code only—tests visual parsing (Gemini 3 Pro Preview tops at 9.0 score across 8 criteria: type, layout, axes, colors, etc.).",[272,2132,2133,2136],{},[940,2134,2135],{},"Chart Reproduction",": Image + raw data CSV—verifies data-code alignment (drops scores further due to scale).",[272,2138,2139,2142],{},[940,2140,2141],{},"Chart Refinement",": Iterative dialog to fix broken code—simulates dev workflows but triggers 'regressive editing' where fixes break prior correct sections.",[23,2144,2145],{},"Automated multi-agent scoring (Cohen's Kappa 0.83 vs humans, Fleiss' Kappa 0.82 inter-agent) flags failures in layout, data mapping, and syntax, making it reliable for your own evals.",[18,2147,2149],{"id":2148},"proprietary-models-outperform-but-data-mixing-persists","Proprietary Models Outperform but Data Mixing Persists",[23,2151,2152],{},"Among 14 tested models, proprietary leaders shine on basics but falter overall:",[348,2154,2155,2168],{},[351,2156,2157],{},[354,2158,2159,2162,2165],{},[357,2160,2161],{},"Model",[357,2163,2164],{},"Avg Score (8 criteria)",[357,2166,2167],{},"Replication Pass Rate",[364,2169,2170,2181,2192],{},[354,2171,2172,2175,2178],{},[369,2173,2174],{},"Claude 4.5 Opus",[369,2176,2177],{},"8.2",[369,2179,2180],{},"High",[354,2182,2183,2186,2189],{},[369,2184,2185],{},"Gemini 3 Pro Preview",[369,2187,2188],{},"8.1",[369,2190,2191],{},"9.0 (top)",[354,2193,2194,2197,2200],{},[369,2195,2196],{},"GPT-5.1",[369,2198,2199],{},"5.4",[369,2201,2202],{},"Mid",[23,2204,2205],{},"Open-weight trail: Qwen3-VL-235B (3.6), Intern-VL-3.5-241B (3.4), DeepSeek-VL-7B (9.7% pass rate, >90% code fails to run). All models plot below the equal-performance diagonal vs prior benchmarks, with open-weight dropping steepest (Qwen3-VL from 85% to \u003C25%).",[23,2207,2208],{},"To build robust viz tools, prioritize proprietary for syntax\u002Flayout but verify data assignments—proprietaries rarely hallucinate code but swap series to wrong axes or mismatch attributes 20-30% of cases.",[18,2210,2212],{"id":2211},"failure-modes-block-production-use","Failure Modes Block Production Use",[23,2214,2215],{},"Error patterns differ by model type, limiting reliability:",[269,2217,2218,2224],{},[272,2219,2220,2223],{},[940,2221,2222],{},"Open-weight",": Hallucinate non-existent libraries\u002Ffunctions (e.g., Qwen3-VL invents Matplotlib params in 20% cases), cause runtime fails, or botch layouts (overlapping subplots, broken grids).",[272,2225,2226,2229],{},[940,2227,2228],{},"Proprietary",": Generate runnable code with correct structure but wrong data binding—visuals look similar but axes\u002Fcolors misalign.",[23,2231,2232],{},"Refinement worsens issues: models over-edit, breaking fixed parts for 'local consistency' over global. Radar charts confirm leaders dominate 8 criteria but gap widens on data-heavy tasks.",[23,2234,2235],{},"Limitations: Matplotlib-only; auto-eval misses subtle overlaps\u002Fcolors. Download from GitHub\u002FHugging Face to test your workflows—pair with projects like PaperBanana (45.8% fidelity via 5 agents + Matplotlib fallback, preferred 73% over pure image gen).",{"title":53,"searchDepth":54,"depth":54,"links":2237},[2238,2239,2240],{"id":2115,"depth":54,"text":2116},{"id":2148,"depth":54,"text":2149},{"id":2211,"depth":54,"text":2212},[],{"content_references":2243,"triage":2257},[2244,2248,2252,2254],{"type":2245,"title":2246,"author":2247,"context":2074},"paper","RealChart2Code: Advancing Chart-to-Code Generation with Real Data and Multi-Task Evaluation","Zhang et al.",{"type":603,"title":2249,"author":2250,"url":2251,"context":447},"RealChart2Code","zjj1233","https:\u002F\u002Fhuggingface.co\u002Fdatasets\u002Fzjj1233\u002FRealChart2Code",{"type":80,"title":2249,"url":2253,"context":447},"https:\u002F\u002Fgithub.com\u002FSpeakn0w\u002FRealChart2Code",{"type":444,"title":2255,"url":2256,"context":447},"Google's PaperBanana research project","https:\u002F\u002Fthe-decoder.com\u002Fgoogles-paperbanana-uses-five-ai-agents-to-auto-generate-scientific-diagrams\u002F",{"relevance":87,"novelty":88,"quality":87,"actionability":88,"composite":2258,"reasoning":2259},3.6,"Category: Data Science & Visualization. The article provides insights into the performance of AI models in generating code for complex data visualizations, addressing a specific pain point for product builders evaluating AI tools for data visualization tasks. It offers a benchmark that can help developers assess model capabilities, though it lacks detailed actionable steps for implementation.","\u002Fsummaries\u002Fai-chart-code-gen-halves-on-complex-real-data-benc-summary","2026-04-19 08:35:10","2026-04-19 14:56:55",{"title":2105,"description":53},{"loc":2260},"eb21650039c15d43","The Decoder","https:\u002F\u002Fthe-decoder.com\u002Feven-the-best-ai-models-lose-about-half-their-performance-when-charts-get-complicated-new-benchmark-finds\u002F","summaries\u002Fai-chart-code-gen-halves-on-complex-real-data-benc-summary",[2270,104,2271],"llm","research","RealChart2Code benchmark exposes 'complexity gap': top proprietary LLMs like Claude 4.5 Opus (8.2 score) and Gemini 3 Pro Preview (8.1) drop ~50% performance vs simple tests on 2,800+ real-data chart tasks; open-weight models score under 4.",[],"EAhXq3--7vWHHo7hlZNGEu4qCU4xNGR3Q4dSNrj-amY",{"id":2276,"title":2277,"ai":2278,"body":2283,"categories":2343,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":2345,"navigation":91,"path":2360,"published_at":2261,"question":61,"scraped_at":2361,"seo":2362,"sitemap":2363,"source_id":2265,"source_name":2266,"source_type":99,"source_url":2267,"stem":2364,"tags":2365,"thumbnail_url":61,"tldr":2368,"tweet":61,"unknown_tags":2369,"__hash__":2370},"summaries\u002Fsummaries\u002Fai-chart-generation-halves-on-complex-real-data-vi-summary.md","AI Chart Generation Halves on Complex Real-Data Viz",{"provider":8,"model":9,"input_tokens":2279,"output_tokens":2280,"processing_time_ms":2281,"cost_usd":2282},5315,1868,16269,0.00149015,{"type":15,"value":2284,"toc":2338},[2285,2289,2292,2295,2312,2315,2319,2322,2325,2328,2332,2335],[18,2286,2288],{"id":2287},"realchart2code-exposes-50-performance-drop-on-complex-charts","RealChart2Code Exposes 50% Performance Drop on Complex Charts",[23,2290,2291],{},"Use RealChart2Code to test AI models realistically: it draws from 1,036 Kaggle datasets (860M rows) for 2,800+ cases spanning 50 chart types and composite layouts, unlike synthetic benchmarks like Plot2Code or ChartMimic. This uncovers the 'complexity gap'—models normalized at 96% on ChartMimic plummet to 50% here because real data demands precise data assignment, layout handling, and library calls. For production, prioritize models bridging this gap to avoid rebuilding viz from scratch.",[23,2293,2294],{},"Three tasks benchmark end-to-end skills:",[269,2296,2297,2302,2307],{},[272,2298,2299,2301],{},[940,2300,2129],{},": Code from image only—Gemini 3 Pro Preview leads at 9.0 score across 8 criteria (type, layout, axes, colors).",[272,2303,2304,2306],{},[940,2305,2135],{},": Image + raw data—tests data-to-viz fidelity.",[272,2308,2309,2311],{},[940,2310,2141],{},": Fix broken code via dialog, mimicking dev workflows; models suffer 'regressive editing' by breaking fixed parts.",[23,2313,2314],{},"Automated scoring via multi-agent system aligns with humans (Cohen's Kappa 0.83), evaluating structure, text, and visuals on Matplotlib output.",[18,2316,2318],{"id":2317},"proprietary-models-outpace-open-weight-by-2x-but-all-fail-layout-and-data","Proprietary Models Outpace Open-Weight by 2x, But All Fail Layout and Data",[23,2320,2321],{},"Claude 4.5 Opus tops at 8.2 average score, Gemini 3 Pro Preview at 8.1; GPT-5.1 trails at 5.4. Open-weight like Qwen3-VL-235B (3.6) and Intern-VL-3.5-241B (3.4) collapse hardest—DeepSeek-VL-7B passes just 9.7% on replication due to hallucinated libraries (e.g., fake Matplotlib params in 20% cases) and invalid functions.",[23,2323,2324],{},"Proprietary errors shift to semantics: correct syntax but wrong data series on axes or mismatched attributes. Layout fails universally—overlapping subplots, broken grids—dropping pass rates below diagonal of simple benchmarks. Open-weight execution fails 90%+; refinement worsens code consistency.",[23,2326,2327],{},"To build reliable AI viz tools, combine proprietary for structure with rule-based checks for data\u002Flayout, as pure generation fidelity hits 45-50% max.",[18,2329,2331],{"id":2330},"limitations-highlight-path-to-robust-viz-ai","Limitations Highlight Path to Robust Viz AI",[23,2333,2334],{},"Benchmark sticks to Matplotlib, missing nuances like color shades or minor overlaps; no multi-library support yet. Still, it outperforms human prefs in related work like PaperBanana (45.8% fidelity but 73% preference over images via 5 agents + Matplotlib fallback).",[23,2336,2337],{},"Access at GitHub\u002FHugging Face to fine-tune models—focus training on real-data composites and iterative fixes to close the gap for agentic workflows.",{"title":53,"searchDepth":54,"depth":54,"links":2339},[2340,2341,2342],{"id":2287,"depth":54,"text":2288},{"id":2317,"depth":54,"text":2318},{"id":2330,"depth":54,"text":2331},[2344],"AI News & Trends",{"content_references":2346,"triage":2358},[2347,2348,2350,2352,2355,2356],{"type":2245,"title":2246,"author":2247,"context":2074},{"type":444,"title":2349,"context":447},"Plot2Code",{"type":444,"title":2351,"context":447},"ChartMimic",{"type":444,"title":2353,"author":2354,"url":2256,"context":447},"PaperBanana","Google",{"type":603,"title":2249,"url":2251,"context":447},{"type":80,"title":2357,"url":2253,"context":447},"RealChart2Code GitHub Repo",{"relevance":87,"novelty":88,"quality":87,"actionability":88,"composite":2258,"reasoning":2359},"Category: Data Science & Visualization. The article discusses a new benchmark for AI models in generating complex data visualizations, addressing a specific pain point for product builders who need reliable AI tools for visualization. It provides insights into model performance but lacks detailed actionable steps for implementation.","\u002Fsummaries\u002Fai-chart-generation-halves-on-complex-real-data-vi-summary","2026-04-20 16:57:28",{"title":2277,"description":53},{"loc":2360},"summaries\u002Fai-chart-generation-halves-on-complex-real-data-vi-summary",[104,2366,2367],"ai-llms","ai-news","RealChart2Code benchmark reveals top models like Claude 4.5 Opus score 8.2\u002F10 on simple charts but drop ~50% on complex real-data tasks with 2,800 cases from 860M rows, exposing a 'complexity gap' vs. synthetic benchmarks.",[2366,2367],"7AXzRoB1CNk_KUN7p6mwMl--k65a9MpdmU8RNyeKgbc",{"id":2372,"title":2373,"ai":2374,"body":2379,"categories":2568,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":2569,"navigation":91,"path":2593,"published_at":2594,"question":61,"scraped_at":2595,"seo":2596,"sitemap":2597,"source_id":2598,"source_name":913,"source_type":99,"source_url":2599,"stem":2600,"tags":2601,"thumbnail_url":61,"tldr":2603,"tweet":61,"unknown_tags":2604,"__hash__":2605},"summaries\u002Fsummaries\u002Fcohort-analysis-exposes-donor-retention-risks-summary.md","Cohort Analysis Exposes Donor Retention Risks",{"provider":8,"model":9,"input_tokens":2375,"output_tokens":2376,"processing_time_ms":2377,"cost_usd":2378},9176,2970,20956,0.00281335,{"type":15,"value":2380,"toc":2562},[2381,2385,2388,2433,2436,2440,2443,2478,2481,2485,2488,2533,2536,2540,2560],[18,2382,2384],{"id":2383},"aggregate-retention-masks-leaky-bathtub-dynamics","Aggregate Retention Masks Leaky Bathtub Dynamics",[23,2386,2387],{},"Standard donor retention—proportion of last year's donors giving again—rises from 26.7% in 2017 to 42.2% in 2025, with total donors doubling from 646 to 1,261. But it's a lagging indicator, sustained by long-time supporters while new donor conversion thins, creating a 'leaky bathtub' where losses outpace retention despite stable water levels. Filter out regular giving first to avoid inflation:",[202,2389,2391],{"className":204,"code":2390,"language":105,"meta":53,"style":53},"import pandas as pd\ndf_opps_filtered = df_opps[df_opps['campaign'] != 'Regular Giving'].copy()\ndf_years = df_opps_filtered[['contact_id', 'year']].drop_duplicates()\ndf_years['prev_year'] = df_years.groupby('contact_id')['year'].shift(1)\ndf_years['is_retained'] = (df_years['year'] == df_years['prev_year'] + 1)\nresults = df_years.groupby('year').agg(total_donors=('contact_id', 'count'), retained_donors=('is_retained', 'sum')).reset_index()\nresults['donors_last_year'] = results['total_donors'].shift(1)\nresults['retention_rate'] = results['retained_donors'] \u002F results['donors_last_year']\n",[207,2392,2393,2398,2403,2408,2413,2418,2423,2428],{"__ignoreMap":53},[185,2394,2395],{"class":211,"line":212},[185,2396,2397],{},"import pandas as pd\n",[185,2399,2400],{"class":211,"line":54},[185,2401,2402],{},"df_opps_filtered = df_opps[df_opps['campaign'] != 'Regular Giving'].copy()\n",[185,2404,2405],{"class":211,"line":88},[185,2406,2407],{},"df_years = df_opps_filtered[['contact_id', 'year']].drop_duplicates()\n",[185,2409,2410],{"class":211,"line":87},[185,2411,2412],{},"df_years['prev_year'] = df_years.groupby('contact_id')['year'].shift(1)\n",[185,2414,2415],{"class":211,"line":233},[185,2416,2417],{},"df_years['is_retained'] = (df_years['year'] == df_years['prev_year'] + 1)\n",[185,2419,2420],{"class":211,"line":239},[185,2421,2422],{},"results = df_years.groupby('year').agg(total_donors=('contact_id', 'count'), retained_donors=('is_retained', 'sum')).reset_index()\n",[185,2424,2425],{"class":211,"line":245},[185,2426,2427],{},"results['donors_last_year'] = results['total_donors'].shift(1)\n",[185,2429,2430],{"class":211,"line":251},[185,2431,2432],{},"results['retention_rate'] = results['retained_donors'] \u002F results['donors_last_year']\n",[23,2434,2435],{},"This yields healthy-looking trends but ignores cohort composition.",[18,2437,2439],{"id":2438},"second-gift-rate-flags-early-conversion-failures","Second-Gift Rate Flags Early Conversion Failures",[23,2441,2442],{},"Track first-time donors making a second gift within 12 months: rates hover 29-35% (e.g., 31.2% for 2016 cohort, 33.0% for 2024), stable but below industry benchmarks. This threshold turns one-offs into supporters, predicting long-term loyalty. Compute via:",[202,2444,2446],{"className":204,"code":2445,"language":105,"meta":53,"style":53},"df_sorted = df_opps_filtered.sort_values(['contact_id', 'close_date'])\nfirst_and_second_gifts = df_sorted.groupby('contact_id')['close_date'].agg(['first', lambda x: x.iloc[1] if len(x)>1 else pd.NaT])\nfirst_and_second_gifts['months_lapsed'] = (first_and_second_gifts['second_gift_date'] - first_and_second_gifts['first_gift_date']).dt.days \u002F 30.4375\nfirst_and_second_gifts['is_converted'] = first_and_second_gifts['months_lapsed'] \u003C= 12\ngrouped = first_and_second_gifts.groupby('first_gift_year').agg(total_new_donors=('is_converted', 'count'), second_gift_conversions=('is_converted', 'sum'))\ngrouped['conversion_rate'] = (grouped['second_gift_conversions'] \u002F grouped['total_new_donors']) * 100\n",[207,2447,2448,2453,2458,2463,2468,2473],{"__ignoreMap":53},[185,2449,2450],{"class":211,"line":212},[185,2451,2452],{},"df_sorted = df_opps_filtered.sort_values(['contact_id', 'close_date'])\n",[185,2454,2455],{"class":211,"line":54},[185,2456,2457],{},"first_and_second_gifts = df_sorted.groupby('contact_id')['close_date'].agg(['first', lambda x: x.iloc[1] if len(x)>1 else pd.NaT])\n",[185,2459,2460],{"class":211,"line":88},[185,2461,2462],{},"first_and_second_gifts['months_lapsed'] = (first_and_second_gifts['second_gift_date'] - first_and_second_gifts['first_gift_date']).dt.days \u002F 30.4375\n",[185,2464,2465],{"class":211,"line":87},[185,2466,2467],{},"first_and_second_gifts['is_converted'] = first_and_second_gifts['months_lapsed'] \u003C= 12\n",[185,2469,2470],{"class":211,"line":233},[185,2471,2472],{},"grouped = first_and_second_gifts.groupby('first_gift_year').agg(total_new_donors=('is_converted', 'count'), second_gift_conversions=('is_converted', 'sum'))\n",[185,2474,2475],{"class":211,"line":239},[185,2476,2477],{},"grouped['conversion_rate'] = (grouped['second_gift_conversions'] \u002F grouped['total_new_donors']) * 100\n",[23,2479,2480],{},"Stable rates suggest no immediate alarm, but don't reveal multi-year trajectories.",[18,2482,2484],{"id":2483},"cohort-heatmaps-reveal-declining-longevity","Cohort Heatmaps Reveal Declining Longevity",[23,2486,2487],{},"Full cohort analysis groups by first-gift year (cohort_year), tracks retention as years elapsed (year_number) relative to original size. Year 1 retention improves from 27% (2016) to 34% (2023), but all cohorts drop sharply post-Year 1 (e.g., 2016: 27% → 15% → 10%), stabilizing low at 8-11%. Occasional upticks reflect lapsed-then-returning donors. Build via:",[202,2489,2491],{"className":204,"code":2490,"language":105,"meta":53,"style":53},"cohort_map = first_and_second_gifts['first_gift_year'].to_dict()\ndf_opps_filtered_summary = df_opps_filtered.groupby(['year', 'contact_id']).agg(total_amount=('amount', 'sum')).reset_index()\ndf_opps_filtered_summary['cohort_year'] = df_opps_filtered_summary['contact_id'].map(cohort_map)\ndf_opps_filtered_summary['year_number'] = df_opps_filtered_summary['year'] - df_opps_filtered_summary['cohort_year']\ncohort_counts = df_opps_filtered_summary.groupby(['cohort_year', 'year_number']).agg(retained_donors=('contact_id', 'count'), total_amount=('total_amount', 'sum')).reset_index()\ncohort_sizes = cohort_counts[cohort_counts['year_number']==0][['cohort_year', 'retained_donors']].rename(columns={'retained_donors': 'original_cohort_size'})\ndf_cohorts = cohort_counts.merge(cohort_sizes, on='cohort_year')\ndf_cohorts['retention_rate'] = df_cohorts['retained_donors'] \u002F df_cohorts['original_cohort_size']\n",[207,2492,2493,2498,2503,2508,2513,2518,2523,2528],{"__ignoreMap":53},[185,2494,2495],{"class":211,"line":212},[185,2496,2497],{},"cohort_map = first_and_second_gifts['first_gift_year'].to_dict()\n",[185,2499,2500],{"class":211,"line":54},[185,2501,2502],{},"df_opps_filtered_summary = df_opps_filtered.groupby(['year', 'contact_id']).agg(total_amount=('amount', 'sum')).reset_index()\n",[185,2504,2505],{"class":211,"line":88},[185,2506,2507],{},"df_opps_filtered_summary['cohort_year'] = df_opps_filtered_summary['contact_id'].map(cohort_map)\n",[185,2509,2510],{"class":211,"line":87},[185,2511,2512],{},"df_opps_filtered_summary['year_number'] = df_opps_filtered_summary['year'] - df_opps_filtered_summary['cohort_year']\n",[185,2514,2515],{"class":211,"line":233},[185,2516,2517],{},"cohort_counts = df_opps_filtered_summary.groupby(['cohort_year', 'year_number']).agg(retained_donors=('contact_id', 'count'), total_amount=('total_amount', 'sum')).reset_index()\n",[185,2519,2520],{"class":211,"line":239},[185,2521,2522],{},"cohort_sizes = cohort_counts[cohort_counts['year_number']==0][['cohort_year', 'retained_donors']].rename(columns={'retained_donors': 'original_cohort_size'})\n",[185,2524,2525],{"class":211,"line":245},[185,2526,2527],{},"df_cohorts = cohort_counts.merge(cohort_sizes, on='cohort_year')\n",[185,2529,2530],{"class":211,"line":251},[185,2531,2532],{},"df_cohorts['retention_rate'] = df_cohorts['retained_donors'] \u002F df_cohorts['original_cohort_size']\n",[23,2534,2535],{},"Visualize with seaborn heatmap (cohort_year rows, year_number columns, retention_rate values) to compare trajectories.",[18,2537,2539],{"id":2538},"revenue-mix-exposes-over-reliance-on-new-cohorts","Revenue Mix Exposes Over-Reliance on New Cohorts",[23,2541,2542,2543,2547,2548,2551,2552,2555,2556,2559],{},"In 2025, 75% revenue from 2024-2025 cohorts (each ",[2544,2545,2546],"del",{},"37-38%), while 2016-2019 cohorts contribute \u003C2% each despite loyalty. No major gift skew: average gifts similar across cohorts (","$500-700). Filter ",[207,2549,2550],{},"df_cohorts[cohort_year + year_number == 2025]",", compute ",[207,2553,2554],{},"pct_of_total = (total_amount \u002F total_2025_amt) * 100"," and ",[207,2557,2558],{},"avg_gift = total_amount \u002F retained_donors",". This recency bias means no fallback depth—economic shocks could crater budgets, as older cohorts aren't scaling to stabilize base.",[431,2561,433],{},{"title":53,"searchDepth":54,"depth":54,"links":2563},[2564,2565,2566,2567],{"id":2383,"depth":54,"text":2384},{"id":2438,"depth":54,"text":2439},{"id":2483,"depth":54,"text":2484},{"id":2538,"depth":54,"text":2539},[440],{"content_references":2570,"triage":2590},[2571,2574,2577,2580,2583,2587],{"type":444,"title":2572,"url":2573,"context":2074},"Benchmarking Project","https:\u002F\u002Fwww.benchmarkingproject.org\u002F",{"type":444,"title":2575,"url":2576,"context":2074},"Fundraisers face squeeze as donor pool shrinks","https:\u002F\u002Fwww.communitydirectors.com.au\u002Farticles\u002Ffundraisers-face-squeeze-as-donor-pool-shrinks#:~:text=While%20cautious%20about%20attributing%20donation,financial%20pressure%20on%20younger%20donors.",{"type":444,"title":2578,"url":2579,"context":2074},"Donor retention first 90 days","https:\u002F\u002Ffandp.com.au\u002Fdonor-retention-first-90-days-406859\u002F#:~:text=metrics%20that%20matter:-,Second%20gift%20rate%20The%20most%20reliable%20predictor%20of%20long%2Dterm,of%20donor%20engagement%20and%20loyalty.",{"type":444,"title":2581,"url":2582,"context":447},"How to improve donor retention: data insights, trends & strategies for nonprofits","https:\u002F\u002Fdataro.io\u002Fblog\u002Fhow-to-improve-donor-retention-data-insights-trends-strategies-for-nonprofits",{"type":444,"title":2584,"author":2585,"url":2586,"context":447},"How I Built a Synthetic Charity Dataset That Behaves Like the Real Thing","Kay E.","https:\u002F\u002Fmedium.com\u002Fdata-and-beyond\u002Fhow-i-built-a-synthetic-charity-dataset-that-behaves-like-the-real-thing-f19af0cf548d",{"type":444,"title":2588,"author":2585,"url":2589,"context":447},"The Day My Synthetic Donors Didn’t Pass for Human","https:\u002F\u002Fmedium.com\u002Fdata-and-beyond\u002Fthe-day-my-synthetic-donors-didnt-pass-for-human-e67fb52f928f",{"relevance":88,"novelty":88,"quality":87,"actionability":88,"composite":2591,"reasoning":2592},3.25,"Category: Data Science & Visualization. The article discusses cohort analysis and donor retention, which is relevant to understanding data-driven decision-making in product strategy. It provides Python code snippets for analysis, but the focus is more on donor retention in a nonprofit context rather than directly applicable to building AI-powered products.","\u002Fsummaries\u002Fcohort-analysis-exposes-donor-retention-risks-summary","2026-04-16 04:02:38","2026-04-19 01:22:24",{"title":2373,"description":53},{"loc":2593},"4436e5e687a42c9f","https:\u002F\u002Fmedium.com\u002Fdata-and-beyond\u002Fyour-retention-rate-is-lying-to-you-214ea371561f?source=rss----b680b860beb1---4","summaries\u002Fcohort-analysis-exposes-donor-retention-risks-summary",[162,104,105,2602],"cohort-analysis","Rising aggregate retention (27% to 42%) hides leaky bathtub: 75% of 2025 revenue from 2024-2025 cohorts, with older cohorts contributing \u003C2% each, risking collapse without long-term base.",[2602],"R8qLcduwrc2pjit-KSUQgYng__9SoDYu6dBAWPc3imY",{"id":2607,"title":2608,"ai":2609,"body":2614,"categories":2712,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":2713,"navigation":91,"path":2723,"published_at":2724,"question":61,"scraped_at":2725,"seo":2726,"sitemap":2727,"source_id":2728,"source_name":2729,"source_type":99,"source_url":2730,"stem":2731,"tags":2732,"thumbnail_url":61,"tldr":2734,"tweet":61,"unknown_tags":2735,"__hash__":2736},"summaries\u002Fsummaries\u002Fredash-sql-first-open-source-bi-for-dev-dashboards-summary.md","Redash: SQL-First Open-Source BI for Dev Dashboards",{"provider":8,"model":9,"input_tokens":2610,"output_tokens":2611,"processing_time_ms":2612,"cost_usd":2613},5206,1447,11033,0.00125785,{"type":15,"value":2615,"toc":2707},[2616,2620,2623,2626,2630,2637,2640,2690,2693,2697,2704],[18,2617,2619],{"id":2618},"replace-csv-exports-with-unified-sql-workflows","Replace CSV Exports with Unified SQL Workflows",[23,2621,2622],{},"Redash eliminates repetitive tasks like exporting CSVs or scripting ad-hoc reports by combining a SQL editor with dashboarding in one self-hosted tool. Connect to Postgres, MySQL, BigQuery, Snowflake, APIs, or MongoDB, then write queries with autocomplete and schema browser to avoid guessing table names. For example, query events data grouped by day, add date-range parameters, and one-click convert to line charts. Drop charts into dashboards, schedule hourly refreshes, and share links—achieving pipeline monitoring or metrics tracking without spreadsheets. This reduces redundancy across databases, as queries remix easily and cache results for speed.",[23,2624,2625],{},"The workflow stays dev-friendly: write complex SQL without tool friction, unlike no-code alternatives that bog down on joins or aggregations. With 28,000+ GitHub stars and active maintenance, it scales for internal dev-facing analytics, including joining API data with DB queries.",[18,2627,2629],{"id":2628},"outperforms-no-code-tools-for-sql-heavy-teams","Outperforms No-Code Tools for SQL-Heavy Teams",[23,2631,2632,2633,2636],{},"Redash prioritizes SQL speed over visual polish, making it ideal when teams know SQL but need quick sharing. Pros include simple Docker self-hosting (one ",[207,2634,2635],{},"docker-compose"," command), broad data source support, reusable query snippets, API access for embedding in tools, and alerts\u002Fscheduling. It feels like an enhanced SQL editor that serves non-devs without lock-in or costs.",[23,2638,2639],{},"Trade-offs are clear: visualizations are functional but not highly customizable—skip for fancy UIs. Self-hosting shifts ops burden (updates, scaling, maintenance) to you. Search lacks depth, mobile support is weak, and non-SQL users struggle. Compared to alternatives:",[348,2641,2642,2655],{},[351,2643,2644],{},[354,2645,2646,2649,2652],{},[357,2647,2648],{},"Tool",[357,2650,2651],{},"Strengths",[357,2653,2654],{},"Weaknesses vs Redash",[364,2656,2657,2668,2679],{},[354,2658,2659,2662,2665],{},[369,2660,2661],{},"Metabase",[369,2663,2664],{},"No-code friendly",[369,2666,2667],{},"Slows on complex queries",[354,2669,2670,2673,2676],{},[369,2671,2672],{},"Superset",[369,2674,2675],{},"Visual power, scale",[369,2677,2678],{},"Heavier setup, less query-focused",[354,2680,2681,2684,2687],{},[369,2682,2683],{},"Tableau\u002FPower BI",[369,2685,2686],{},"Polished, enterprise-ready",[369,2688,2689],{},"Expensive, overkill for internal use",[23,2691,2692],{},"Redash wins for dev teams with multiple DBs wanting free, fast internal dashboards.",[18,2694,2696],{"id":2695},"docker-setup-and-practical-use-cases","Docker Setup and Practical Use Cases",[23,2698,2699,2700,2703],{},"Clone the GitHub repo and run ",[207,2701,2702],{},"docker-compose up"," for a local instance in minutes. Add data sources via UI, query with schema exploration, visualize, and dashboard instantly. Use for dev ops like tracking metrics\u002Fupdates, monitoring pipelines, or blending API\u002FDB data—removing daily pains without vendor costs.",[23,2705,2706],{},"Verdict: Adopt if SQL-fluent and self-hosting fits; otherwise, Metabase for no-code or Tableau for pro dashboards. Test via quick install to verify workflow gains.",{"title":53,"searchDepth":54,"depth":54,"links":2708},[2709,2710,2711],{"id":2618,"depth":54,"text":2619},{"id":2628,"depth":54,"text":2629},{"id":2695,"depth":54,"text":2696},[440],{"content_references":2714,"triage":2721},[2715,2718],{"type":80,"title":2716,"url":2717,"context":71},"Redash","https:\u002F\u002Fredash.io\u002F",{"type":80,"title":2719,"url":2720,"context":447},"Redash Repo","https:\u002F\u002Fgithub.com\u002Fgetredash\u002Fredash",{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":2722},"Category: Data Science & Visualization. The article discusses how Redash can streamline data visualization and querying for developers, addressing the pain point of repetitive tasks in data handling. It provides specific examples of features like SQL querying and dashboard creation that developers can implement immediately.","\u002Fsummaries\u002Fredash-sql-first-open-source-bi-for-dev-dashboards-summary","2026-04-15 12:01:37","2026-04-19 03:29:55",{"title":2608,"description":53},{"loc":2723},"3009bd919b0a58a8","Better Stack","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ouKwtFoT1ZY","summaries\u002Fredash-sql-first-open-source-bi-for-dev-dashboards-summary",[104,2099,2733],"dev-productivity","SQL-proficient devs use Redash to query multiple sources (Postgres, BigQuery, etc.), visualize results, and build shareable dashboards in minutes via self-hosted Docker—no CSVs or pricey tools needed.",[2733],"pe6KvOqxyP3pyMPBJCyd6ce8DepXzY5fFprBMfIRT_k",{"id":2738,"title":2739,"ai":2740,"body":2745,"categories":2780,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":2781,"navigation":91,"path":2791,"published_at":2792,"question":61,"scraped_at":2793,"seo":2794,"sitemap":2795,"source_id":2796,"source_name":2797,"source_type":99,"source_url":2798,"stem":2799,"tags":2800,"thumbnail_url":61,"tldr":2801,"tweet":61,"unknown_tags":2802,"__hash__":2803},"summaries\u002Fsummaries\u002Fcleveland-s-enduring-impact-on-data-viz-and-scienc-summary.md","Cleveland's Enduring Impact on Data Viz and Science",{"provider":8,"model":9,"input_tokens":2741,"output_tokens":2742,"processing_time_ms":2743,"cost_usd":2744},3898,1125,10916,0.00083525,{"type":15,"value":2746,"toc":2775},[2747,2751,2761,2765,2768,2772],[18,2748,2750],{"id":2749},"graphical-methods-as-scientific-foundation","Graphical Methods as Scientific Foundation",[23,2752,2753,2754,2555,2757,2760],{},"Cleveland transformed data visualization from ad-hoc charting into a rigorous field by emphasizing graphical perception—studies showing how humans accurately judge position and length over area or volume in charts. This research directly informs defaults in tools like Tableau and ggplot2, ensuring data workers build effective visuals without guesswork. His books, ",[190,2755,2756],{},"The Elements of Graphing Data",[190,2758,2759],{},"Visualizing Data",", provide hands-on principles: prioritize data-driven scales, avoid distorting transformations, and integrate graphics with statistical analysis for deeper insights from real datasets.",[18,2762,2764],{"id":2763},"data-sciences-intellectual-roots","Data Science's Intellectual Roots",[23,2766,2767],{},"In 2001, Cleveland articulated data science as statistics expanded by computation, subject-matter expertise, and analytic thinking—shifting focus from pure math theory to practical data learning. At Bell Labs, collaborating with John Tukey and John Chambers, he fostered hands-on innovation, producing methods that scale to massive datasets. This framework underpins modern pipelines: combine code (e.g., R\u002FS-Plus precursors), domain knowledge, and iterative visualization to extract actionable signals.",[18,2769,2771],{"id":2770},"practical-legacy-for-builders","Practical Legacy for Builders",[23,2773,2774],{},"Cleveland's influence permeates everyday tools; if you select bar charts over pies or use log scales judiciously, you're applying his perception hierarchies. His mentorship and generosity amplified impact, inspiring generations to center products on empirical data analysis over hype. Trade-off: his methods demand rigorous testing but yield trustworthy visuals that communicate findings to non-experts without overwhelming.",{"title":53,"searchDepth":54,"depth":54,"links":2776},[2777,2778,2779],{"id":2749,"depth":54,"text":2750},{"id":2763,"depth":54,"text":2764},{"id":2770,"depth":54,"text":2771},[440],{"content_references":2782,"triage":2789},[2783,2786,2788],{"type":444,"title":2784,"url":2785,"context":2074},"Obituary for William S. Cleveland","https:\u002F\u002Fwww.dignitymemorial.com\u002Fobituaries\u002Fchicago-il\u002Fwilliam-cleveland-12806860",{"type":67,"title":2756,"author":2787,"context":447},"William S. Cleveland",{"type":67,"title":2759,"author":2787,"context":447},{"relevance":87,"novelty":88,"quality":87,"actionability":88,"composite":2258,"reasoning":2790},"Category: Data Science & Visualization. The article discusses William Cleveland's foundational work in data visualization and its practical implications for modern tools, addressing a specific audience pain point about effective data communication. It provides insights into Cleveland's principles that can be applied in practice, though it lacks a step-by-step guide for implementation.","\u002Fsummaries\u002Fcleveland-s-enduring-impact-on-data-viz-and-scienc-summary","2026-04-14 07:01:35","2026-04-14 14:38:03",{"title":2739,"description":53},{"loc":2791},"9bc96c1fc27da5f2","FlowingData","https:\u002F\u002Fflowingdata.com\u002F2026\u002F04\u002F14\u002Fwilliam-s-cleveland-rip\u002F","summaries\u002Fcleveland-s-enduring-impact-on-data-viz-and-scienc-summary",[104,162,2271],"William Cleveland pioneered data visualization as a rigorous discipline via graphical perception studies and books like The Elements of Graphing Data, while outlining data science's foundations in 2001, shaping tools data workers use today.",[],"KRfkrWSK3XSfXkeeL4o68zls4Fl849WlfS0Hm6SUkL0",{"id":2805,"title":2806,"ai":2807,"body":2812,"categories":2932,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":2934,"navigation":91,"path":2938,"published_at":2939,"question":61,"scraped_at":2940,"seo":2941,"sitemap":2942,"source_id":2943,"source_name":2944,"source_type":99,"source_url":2945,"stem":2946,"tags":2947,"thumbnail_url":61,"tldr":2948,"tweet":61,"unknown_tags":2949,"__hash__":2950},"summaries\u002Fsummaries\u002F8-python-scripts-cut-power-bi-tasks-from-15h-to-3h-summary.md","8 Python Scripts Cut Power BI Tasks from 15h to 3h Weekly",{"provider":8,"model":9,"input_tokens":2808,"output_tokens":2809,"processing_time_ms":2810,"cost_usd":2811},3885,1598,14309,0.00155335,{"type":15,"value":2813,"toc":2927},[2814,2818,2821,2825,2840,2913,2916,2920],[18,2815,2817],{"id":2816},"replace-manual-checklists-with-scripted-monitoring","Replace Manual Checklists with Scripted Monitoring",[23,2819,2820],{},"Power BI teams waste 15+ hours weekly on repetitive Monday rituals: opening Power BI Service to verify overnight refreshes for 14 datasets (15 minutes), diagnosing failures via gateway status, connectivity, and logs (20-45 minutes), and manually re-triggering failed refreshes. Deepak's \"Checklist\" exemplifies this—colleagues dread it for its time sink and unreliability. Automate this by scripting API calls to Power BI endpoints: poll dataset refresh histories, parse error logs for common issues like gateway offline or source timeouts, and queue retries only for fixable failures. This eliminates 60-90 minutes per cycle, preventing overlooked issues that cascade into stakeholder escalations.",[18,2822,2824],{"id":2823},"core-8-scripts-target-high-impact-tasks","Core 8 Scripts Target High-Impact Tasks",[23,2826,2827,2828,2831,2832,2835,2836,2839],{},"Build a pipeline of 8 interconnected Python scripts using libraries like ",[207,2829,2830],{},"requests"," for Power BI REST APIs, ",[207,2833,2834],{},"pandas"," for data handling, and ",[207,2837,2838],{},"smtplib"," for notifications:",[964,2841,2842,2852,2862,2872,2881,2891,2901,2907],{},[272,2843,2844,2847,2848,2851],{},[940,2845,2846],{},"Refresh Status Checker",": Queries ",[207,2849,2850],{},"\u002Fdatasets\u002F{id}\u002Frefreshes"," for all 14 datasets, flags failures, and logs details—runs in \u003C1 minute vs. 15+ manual.",[272,2853,2854,2857,2858,2861],{},[940,2855,2856],{},"Failure Investigator",": Automates log parsing and gateway checks via ",[207,2859,2860],{},"\u002Fgateways",", categorizing errors (e.g., 70% gateway-related).",[272,2863,2864,2867,2868,2871],{},[940,2865,2866],{},"Auto-Retriggers",": POSTs to ",[207,2869,2870],{},"\u002Frefreshes"," for non-critical failures, respecting rate limits.",[272,2873,2874,2877,2878,1006],{},[940,2875,2876],{},"Dataset Documenter",": Extracts metadata (tables, measures, relationships) into Markdown\u002FPDF reports via ",[207,2879,2880],{},"\u002Fdatasets\u002F{id}\u002Ftables",[272,2882,2883,2886,2887,2890],{},[940,2884,2885],{},"Data Quality Validator",": Samples rows post-refresh, runs SQL-like checks for nulls\u002Fduplicates using ",[207,2888,2889],{},"pyodbc"," or DAX queries.",[272,2892,2893,2896,2897,2900],{},[940,2894,2895],{},"Report Exporter",": Downloads PBIX\u002FPDFs via ",[207,2898,2899],{},"\u002Freports\u002F{id}\u002FExport",", schedules for weekly stakeholder packs.",[272,2902,2903,2906],{},[940,2904,2905],{},"Stakeholder Updater",": Compiles summary email with pass\u002Ffail stats, attachments—sent via SMTP.",[272,2908,2909,2912],{},[940,2910,2911],{},"Orchestrator",": Cron-scheduled master script sequences the above, with logging to Slack\u002FTeams.",[23,2914,2915],{},"Scripts are copy-paste ready; authenticate via service principal (app registration in Azure AD) for unattended runs. Trade-off: Initial setup takes 4-6 hours for API permissions, but pays back in week 1.",[18,2917,2919],{"id":2918},"workflow-integration-yields-80-time-savings","Workflow Integration Yields 80% Time Savings",[23,2921,2922,2923,2926],{},"Chain scripts in a GitHub Actions or Airflow DAG: Trigger at 7 AM Mondays post-overnight refresh window. Output: Automated Slack dashboard shows 14\u002F14 green, auto-sent PDF reports to 20 stakeholders, zero manual intervention unless critical alert. For Ravi's 4-person team, 15 hours dropped to 3 (oversight only), freeing capacity for analysis over maintenance. Scale by parameterizing dataset IDs in ",[207,2924,2925],{},"config.yaml",". Pitfall: API quotas (200 calls\u002Fhour)—batch requests cut this risk. Result: 80% automation without custom dev, using open Power BI APIs directly.",{"title":53,"searchDepth":54,"depth":54,"links":2928},[2929,2930,2931],{"id":2816,"depth":54,"text":2817},{"id":2823,"depth":54,"text":2824},{"id":2918,"depth":54,"text":2919},[2933],"Developer Productivity",{"content_references":2935,"triage":2936},[],{"relevance":233,"novelty":87,"quality":87,"actionability":233,"composite":905,"reasoning":2937},"Category: AI Automation. The article provides a detailed guide on automating Power BI tasks using Python scripts, directly addressing the pain points of developers looking to optimize their workflows. It includes specific scripts and practical applications that can be immediately implemented, making it highly actionable.","\u002Fsummaries\u002F8-python-scripts-cut-power-bi-tasks-from-15h-to-3h-summary","2026-04-13 12:31:02","2026-04-13 17:53:09",{"title":2806,"description":53},{"loc":2938},"0085b3ca372682be","Towards AI","https:\u002F\u002Fpub.towardsai.net\u002Fhow-i-use-python-to-automate-80-of-my-power-bi-workflow-full-scripts-included-d04b23fe5fd5?source=rss----98111c9905da---4","summaries\u002F8-python-scripts-cut-power-bi-tasks-from-15h-to-3h-summary",[105,1970,104,2733],"Replace manual Power BI checklist (15+ hours\u002Fweek) with 8 copy-paste Python scripts that automate refreshes, data quality checks, exports, and stakeholder updates—saving a 4-person team a full workday.",[2733],"YKJPHPB3mFlCM3eXM8VS2EPRj23cRBsUL5c3Arau8Kg",{"id":2952,"title":2953,"ai":2954,"body":2959,"categories":3060,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3061,"navigation":91,"path":3062,"published_at":3063,"question":61,"scraped_at":61,"seo":3064,"sitemap":3065,"source_id":3066,"source_name":158,"source_type":99,"source_url":3067,"stem":3068,"tags":3069,"thumbnail_url":61,"tldr":3070,"tweet":61,"unknown_tags":3071,"__hash__":3072},"summaries\u002Fsummaries\u002Fbreak-into-analytics-from-data-entry-and-self-taug-summary.md","Break into Analytics from Data Entry and Self-Taught SQL",{"provider":8,"model":9,"input_tokens":2955,"output_tokens":2956,"processing_time_ms":2957,"cost_usd":2958},4900,1485,15892,0.00169985,{"type":15,"value":2960,"toc":3054},[2961,2965,2968,2971,2975,2978,2998,3001,3004,3008,3015,3018,3021,3025,3028,3048,3051],[18,2962,2964],{"id":2963},"take-data-adjacent-jobs-to-build-hands-on-experience","Take Data-Adjacent Jobs to Build Hands-On Experience",[23,2966,2967],{},"Economics grads often chase banking or finance, but avoid them if uninterested—opt for unglamorous entry points like data entry at startups. Neal started scraping URLs and cleaning spreadsheets for Nestlé, which evolved into account management. This gave access to data warehouses without needing a Math\u002FStats\u002FCS degree. By job's end, he had concrete stories for interviews: real datasets handled, stakeholder communication built, outperforming pure-academic juniors who lack practical examples.",[23,2969,2970],{},"Impact: Turns 'data-adjacent' into 'data-proven,' making you hireable when formal analyst roles demand experience you don't have.",[18,2972,2974],{"id":2973},"master-sql-through-stubborn-practice-and-core-concepts","Master SQL Through Stubborn Practice and Core Concepts",[23,2976,2977],{},"Self-teach SQL with late-night queries after a manager's crash course—focus on essentials that trip beginners:",[269,2979,2980,2986,2992],{},[272,2981,2982,2985],{},[940,2983,2984],{},"Primary keys",": Identify the unique column linking tables.",[272,2987,2988,2991],{},[940,2989,2990],{},"Data types",": Fix issues like dates stored as text.",[272,2993,2994,2997],{},[940,2995,2996],{},"Joins",": Debug exploding row counts from wrong matches.",[23,2999,3000],{},"Expect mistakes: deleted commas, typos wasting 45 minutes, wrong joins. But successful queries deliver validating results. Pair with data warehouse access for rapid iteration.",[23,3002,3003],{},"Impact: Transforms you from manual entry to querying analyst, with 'aha' moments accelerating learning.",[18,3005,3007],{"id":3006},"prioritize-clarity-in-dashboards-and-learn-from-messy-data","Prioritize Clarity in Dashboards and Learn from Messy Data",[23,3009,3010,3011,3014],{},"Build dashboards proactively—even without client requests—to track product performance and grasp decision-support. Core lesson: ",[940,3012,3013],{},"clarity beats complexity","; simple visuals reveal insights faster than overbuilt ones.",[23,3016,3017],{},"Messy data destroys credibility: Neal once reported £100K revenue from one affiliate link due to missing decimals (actual: £10K), forcing awkward client corrections. Always validate decimals, formats, and sources.",[23,3019,3020],{},"Impact: Proactive visuals build decision-making proof; clean data prevents humiliation and ensures trustworthy analysis.",[18,3022,3024],{"id":3023},"analyze-data-in-your-current-role-for-immediate-wins","Analyze Data in Your Current Role for Immediate Wins",[23,3026,3027],{},"No perfect start needed—leverage any job's data:",[269,3029,3030,3036,3042],{},[272,3031,3032,3035],{},[940,3033,3034],{},"Marketing",": Track month-over-month campaign changes and seasonal patterns.",[272,3037,3038,3041],{},[940,3039,3040],{},"Operations",": Quantify efficiency losses, estimate savings from process A to B.",[272,3043,3044,3047],{},[940,3045,3046],{},"Customer Success",": Identify repeating client questions, craft stories driving decisions over raw charts.",[23,3049,3050],{},"Automate small tasks, ask sharper questions, visualize for speed. Curiosity plus initiative bridges to analytics careers.",[23,3052,3053],{},"Impact: Builds foundation without switching jobs first; turns 'behind' feeling into portfolio-ready skills.",{"title":53,"searchDepth":54,"depth":54,"links":3055},[3056,3057,3058,3059],{"id":2963,"depth":54,"text":2964},{"id":2973,"depth":54,"text":2974},{"id":3006,"depth":54,"text":3007},{"id":3023,"depth":54,"text":3024},[440],{},"\u002Fsummaries\u002Fbreak-into-analytics-from-data-entry-and-self-taug-summary","2026-04-08 21:21:19",{"title":2953,"description":53},{"loc":3062},"95571d162c294bb3","https:\u002F\u002Funknown","summaries\u002Fbreak-into-analytics-from-data-entry-and-self-taug-summary",[162,104],"Take any data-adjacent job like entry-level scraping, self-teach SQL via trial-and-error queries, build unasked dashboards for clarity, and analyze your current role's data to gain real experience before landing an analyst title.",[],"oujhUds8_aaTHJPWH1yoxxtJW3E3klFEw9OqOcaddpA",{"id":3074,"title":3075,"ai":3076,"body":3081,"categories":3132,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3133,"navigation":91,"path":3134,"published_at":3135,"question":61,"scraped_at":61,"seo":3136,"sitemap":3137,"source_id":3138,"source_name":158,"source_type":99,"source_url":3067,"stem":3139,"tags":3140,"thumbnail_url":61,"tldr":3141,"tweet":61,"unknown_tags":3142,"__hash__":3143},"summaries\u002Fsummaries\u002Fpie-charts-mask-trends-fueling-strategic-complacen-summary.md","Pie Charts Mask Trends, Fueling Strategic Complacency",{"provider":8,"model":9,"input_tokens":3077,"output_tokens":3078,"processing_time_ms":3079,"cost_usd":3080},5238,1105,14399,0.00157745,{"type":15,"value":3082,"toc":3127},[3083,3087,3090,3094,3097,3101,3104,3124],[18,3084,3086],{"id":3085},"pie-charts-create-false-clarity-by-ignoring-momentum","Pie Charts Create False Clarity by Ignoring Momentum",[23,3088,3089],{},"Pie charts reduce complex data to intuitive slices, but they fail strategically because humans struggle to compare angles or areas accurately—small differences blur, and more than a few categories overwhelm cognition. This static snapshot emphasizes current proportions over critical dynamics like growth, shrinkage, or risks, soothing leaders into complacency. Instead of revealing vulnerabilities (e.g., a leading share eroding), pies anchor focus on size alone, reducing urgency to probe past trends or future shifts. Strategic decisions demand distinguishing relative changes and trajectories, which pies cannot deliver without additional context.",[18,3091,3093],{"id":3092},"market-share-example-snapshot-vs-trend-reveals-hidden-pressures","Market Share Example: Snapshot vs. Trend Reveals Hidden Pressures",[23,3095,3096],{},"A pie chart of market shares (Company A largest, B close, C and Others smaller) looks balanced and stable at first glance. But it conceals direction: Company A might have dropped from 45% last year, B accelerating aggressively, C holding profitably, and Others fading. Replotting as a stacked bar chart across time periods exposes this—A shrinks steadily, B expands, C softens slightly, Others erode—transforming a \"stable\" view into one of pressure and consequence. Stacked bars preserve proportions while adding comparability over time, shifting questions from \"Who's biggest now?\" to \"Who's gaining\u002Flosing, and what if trends continue?\" This cognitive upgrade makes trends actionable for resource allocation and risk detection.",[18,3098,3100],{"id":3099},"pie-rule-ensures-charts-support-decisions-not-aesthetics","PIE Rule Ensures Charts Support Decisions, Not Aesthetics",[23,3102,3103],{},"Before deploying a pie, apply the PIE Check to prioritize decision quality:",[269,3105,3106,3112,3118],{},[272,3107,3108,3111],{},[940,3109,3110],{},"Purpose",": Confirm if the goal is a narrow 'now' snapshot (acceptable) or ranking, prioritization, or trends (use alternatives like bars).",[272,3113,3114,3117],{},[940,3115,3116],{},"Integrity",": Verify it captures the full truth—e.g., no hidden baselines, unstable categories lumped as 'Other,' or omitted shifts.",[272,3119,3120,3123],{},[940,3121,3122],{},"Execution",": Design to minimize misreads—avoid excess slices, weak labels, similar sizes, or fiddly legends that add friction.",[23,3125,3126],{},"This framework rejects pies when they obscure movement, forcing choices that expose direction over comfort. Leaders succeed by detecting early decline via trends, not admiring symmetry—direction trumps proportion for wise action.",{"title":53,"searchDepth":54,"depth":54,"links":3128},[3129,3130,3131],{"id":3085,"depth":54,"text":3086},{"id":3092,"depth":54,"text":3093},{"id":3099,"depth":54,"text":3100},[440],{},"\u002Fsummaries\u002Fpie-charts-mask-trends-fueling-strategic-complacen-summary","2026-04-08 21:21:18",{"title":3075,"description":53},{"loc":3134},"6737c400a0936657","summaries\u002Fpie-charts-mask-trends-fueling-strategic-complacen-summary",[104,162],"Pie charts show static proportions that hide momentum like shrinking market share, creating false stability—stacked bars reveal growth\u002Fdecline to drive better decisions.",[],"OV9ZFzGhG0KEuxNgmGuj-zLOWgNS6qETJzTUipl-PXQ",{"id":3145,"title":3146,"ai":3147,"body":3152,"categories":3198,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3199,"navigation":91,"path":3200,"published_at":3201,"question":61,"scraped_at":61,"seo":3202,"sitemap":3203,"source_id":3204,"source_name":158,"source_type":99,"source_url":3067,"stem":3205,"tags":3206,"thumbnail_url":61,"tldr":3207,"tweet":61,"unknown_tags":3208,"__hash__":3209},"summaries\u002Fsummaries\u002Fquestion-data-patterns-most-are-just-noise-summary.md","Question Data Patterns: Most Are Just Noise",{"provider":8,"model":9,"input_tokens":3148,"output_tokens":3149,"processing_time_ms":3150,"cost_usd":3151},4226,947,10624,0.00084815,{"type":15,"value":3153,"toc":3193},[3154,3158,3161,3167,3171,3174,3180,3184,3187],[18,3155,3157],{"id":3156},"why-patterns-fool-even-experts","Why Patterns Fool Even Experts",[23,3159,3160],{},"Data analysis traps you by making random noise look like truth. A spike isn't a trend unless consistent; a coincidence isn't insight without evidence. This stems from human psychology—craving closure to avoid uncertainty—and visuals that sell stories, like clean charts implying reliability. Tools worsen it: endless slicing guarantees fake patterns via multiple comparisons (p-hacking), turning noise into 'discoveries' you trust because they feel right.",[23,3162,3163,3166],{},[940,3164,3165],{},"Outcome",": You build narratives on illusions, skipping validation.",[18,3168,3170],{"id":3169},"costs-of-unquestioned-insights","Costs of Unquestioned 'Insights'",[23,3172,3173],{},"Fake patterns drive real damage. Decisions chase nonexistent trends, dashboards mislead stakeholders, and time wastes on ghosts. Worst: false confidence halts scrutiny—'it looks good, ship it.' This scales from solo analysis to org-wide errors, where 'insightful' reports justify wrong strategies.",[23,3175,3176,3179],{},[940,3177,3178],{},"Fix the root",": Treat every pattern as suspect until proven, avoiding overconfident conclusions.",[18,3181,3183],{"id":3182},"validate-like-pros-slow-down-and-bet","Validate Like Pros: Slow Down and Bet",[23,3185,3186],{},"Top analysts question ruthlessly: Is this random variation? Does it hold over time, not just one slice? They prioritize consistency across datasets and admit insufficient evidence with 'I don't know yet'—a skill separating signal from noise.",[23,3188,3189,3192],{},[940,3190,3191],{},"One rule to rule them all",": Before trusting, ask 'Would I bet money on this being real?' Uncertainty means more work needed. Data whispers truths amid noise; ignore the hype, chase evidence. Finding patterns is easy—knowing which to discard builds real skill.",{"title":53,"searchDepth":54,"depth":54,"links":3194},[3195,3196,3197],{"id":3156,"depth":54,"text":3157},{"id":3169,"depth":54,"text":3170},{"id":3182,"depth":54,"text":3183},[440],{},"\u002Fsummaries\u002Fquestion-data-patterns-most-are-just-noise-summary","2026-04-08 21:21:17",{"title":3146,"description":53},{"loc":3200},"7a2bd955c413003e","summaries\u002Fquestion-data-patterns-most-are-just-noise-summary",[162,104],"Confusing random noise for real insights leads to bad decisions—strong analysts test patterns by asking 'Would I bet on this being real?' and embrace 'I don't know yet.'",[],"gIXXQdh5IHcT07SunAFOLKisYokBrxEmCKvN5wgVzEQ",{"id":3211,"title":3212,"ai":3213,"body":3218,"categories":3292,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3293,"navigation":91,"path":3294,"published_at":3201,"question":61,"scraped_at":61,"seo":3295,"sitemap":3296,"source_id":3297,"source_name":158,"source_type":99,"source_url":3067,"stem":3298,"tags":3299,"thumbnail_url":61,"tldr":3301,"tweet":61,"unknown_tags":3302,"__hash__":3303},"summaries\u002Fsummaries\u002Frising-charts-often-hide-margin-erosion-and-decay-summary.md","Rising Charts Often Hide Margin Erosion and Decay",{"provider":8,"model":9,"input_tokens":3214,"output_tokens":3215,"processing_time_ms":3216,"cost_usd":3217},5241,1312,16401,0.00123365,{"type":15,"value":3219,"toc":3286},[3220,3224,3227,3230,3234,3237,3240,3244,3247,3273,3276,3280,3283],[18,3221,3223],{"id":3222},"mistaking-volume-growth-for-profitability","Mistaking Volume Growth for Profitability",[23,3225,3226],{},"Businesses celebrate line charts showing rising activity—such as monthly deliveries climbing from 4,000 to 7,200—without spotting hidden decay. These visuals report raw increases accurately but omit critical declines: revenue per delivery falling, fuel costs rising, and profit per kilometer shrinking. The result? Leaders optimize for more work (activity) instead of value per unit (performance), eroding margins while pursuing expansion or bonuses. Aggregates and averages compound this by burying weak segments in strong ones, turning incomplete stories into false momentum.",[23,3228,3229],{},"The five most-used charts amplify risks: line charts track trends without goodness checks; pie charts mask strategic imbalances in proportions; averages hide top-vs-bottom performer gaps; dashboards flood with KPIs creating noise; forecasts imply predictability from single lines. Without segmentation or drivers, they persuade visually rather than inform.",[18,3231,3233],{"id":3232},"visual-psychology-anchors-decisions-emotionally","Visual Psychology Anchors Decisions Emotionally",[23,3235,3236],{},"Humans process chart shapes emotionally before analytically: upward slopes signal momentum, flats stability, downs anxiety—all before axis scrutiny. This anchors interpretations instantly. Subtle tweaks weaponize it—stretch y-axes for drama, compress timelines to smooth volatility, aggregate to vanish declines. Numbers stay identical, but perceived stories shift dramatically.",[23,3238,3239],{},"In data-flooded \"data-driven\" firms, charts replace questioning with certainty. Debates quiet, dissent fades as visuals seem objective. Yet they embed unasked assumptions: Compared to what baseline? Over what timeframe? Which metrics are absent? Alternative views suppressed? This illusion of confidence distorts strategy, prioritizing appearance over reality.",[18,3241,3243],{"id":3242},"four-questions-to-expose-chart-deceptions","Four Questions to Expose Chart Deceptions",[23,3245,3246],{},"Leaders govern by skepticism: probe every visual with these:",[269,3248,3249,3255,3261,3267],{},[272,3250,3251,3254],{},[940,3252,3253],{},"Compared to what?"," Last year, budget, or arbitrary line?",[272,3256,3257,3260],{},[940,3258,3259],{},"What is missing?"," Revenue without margins? Totals sans costs?",[272,3262,3263,3266],{},[940,3264,3265],{},"What if segmented?"," Averages often conceal divergent trends.",[272,3268,3269,3272],{},[940,3270,3271],{},"What behavior does it nudge?"," Subtly pushes actions like expansion amid decay.",[23,3274,3275],{},"Answering reveals if charts encourage surface success or true performance, preventing activity traps.",[18,3277,3279],{"id":3278},"design-truthful-visuals-as-decision-frameworks","Design Truthful Visuals as Decision Frameworks",[23,3281,3282],{},"Fix by embedding context, drivers, variation, and scenarios: pair sales lines with margins; plot performance distributions over averages; show forecast ranges not single lines. These traits transform persuasion into tools that spark better questions, aligning visuals with reality.",[23,3284,3285],{},"Visual literacy—questioning presentation—is a leadership skill, not just analyst craft. It ensures charts reveal decay early, drive preparedness via multi-scenario forecasts, and foster alignment over confusion. Shift from \"Is the line up?\" to \"What belief does this encourage?\" elevates organizational decisions.",{"title":53,"searchDepth":54,"depth":54,"links":3287},[3288,3289,3290,3291],{"id":3222,"depth":54,"text":3223},{"id":3232,"depth":54,"text":3233},{"id":3242,"depth":54,"text":3243},{"id":3278,"depth":54,"text":3279},[440],{},"\u002Fsummaries\u002Frising-charts-often-hide-margin-erosion-and-decay-summary",{"title":3212,"description":53},{"loc":3294},"3d7c01346f7bca6a","summaries\u002Frising-charts-often-hide-margin-erosion-and-decay-summary",[104,162,3300],"business","Upward-trending charts like deliveries rising from 4,000 to 7,200 can mask falling revenue per delivery, rising costs, and shrinking profits—always question context, omissions, and comparisons to avoid mistaking activity for performance.",[3300],"Bw3kLys8Hph1zvHTL89DrPxmzLRyrFjiVaOds_f7K0U",{"id":3305,"title":3306,"ai":3307,"body":3312,"categories":3495,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3496,"navigation":91,"path":3497,"published_at":3201,"question":61,"scraped_at":61,"seo":3498,"sitemap":3499,"source_id":3500,"source_name":158,"source_type":99,"source_url":3067,"stem":3501,"tags":3502,"thumbnail_url":61,"tldr":3503,"tweet":61,"unknown_tags":3504,"__hash__":3505},"summaries\u002Fsummaries\u002Fstreamlit-dashboard-prophet-vs-arima-stock-forecas-summary.md","Streamlit Dashboard: Prophet vs ARIMA Stock Forecasts",{"provider":8,"model":9,"input_tokens":3308,"output_tokens":3309,"processing_time_ms":3310,"cost_usd":3311},6934,1754,14065,0.0022413,{"type":15,"value":3313,"toc":3489},[3314,3318,3339,3353,3381,3388,3392,3399,3406,3427,3431,3445,3459,3469,3472,3476],[18,3315,3317],{"id":3316},"interactive-dashboard-setup-speeds-exploration","Interactive Dashboard Setup Speeds Exploration",[23,3319,3320,3321,2555,3324,3327,3328,3331,3332,3334,3335,3338],{},"Start with ",[207,3322,3323],{},"st.set_page_config(layout=\"wide\")",[207,3325,3326],{},"st.title(\"📊 Stock Forecast Dashboard\")"," for a clean interface. Use sidebar controls for dynamic input: ",[207,3329,3330],{},"st.sidebar.date_input"," sets start_date (default 2020-01-01) and end_date (default 2021-01-01); ",[207,3333,839],{}," from a CSV-loaded ticker_list (e.g., index to \"AA\"); ",[207,3336,3337],{},"st.sidebar.slider(\"Forecast Days\", 1, 60, 7)"," for n_day periods.",[23,3340,3341,3342,3345,3346,3349,3350,1006],{},"Cache data fetches with ",[207,3343,3344],{},"@st.cache_data def load_data(ticker): data = yf.download(ticker, start=start_date, end=end_date); data.reset_index(inplace=True)"," to avoid slow API repeats. Handle MultiIndex columns via ",[207,3347,3348],{},"if isinstance(data.columns, pd.MultiIndex): data.columns = data.columns.get_level_values(0)",". Guard against empty data or \u003C10 rows with ",[207,3351,3352],{},"if data.empty or df.shape[0] \u003C 10: st.stop()",[23,3354,3355,3356,3359,3360,3363,3364,3359,3366,3369,3370,3373,3374,2555,3377,3380],{},"Add KPI cards in columns: compute last_price = data",[185,3357,3358],{},"'Close'",".iloc",[185,3361,3362],{},"-1",", first_price = data",[185,3365,3358],{},[185,3367,3368],{},"0",", change = last_price - first_price, pct_change = (change \u002F first_price) * 100; display via ",[207,3371,3372],{},"col1.metric(\"Last Price\", f\"{last_price:.2f}\")",", etc. For raw data, use ",[207,3375,3376],{},"st.number_input(\"Rows\", min_value=5, max_value=len(data), value=20)",[207,3378,3379],{},"st.dataframe(data.tail(int(show_last)), use_container_width=True)"," to inspect latest rows interactively.",[23,3382,3383,3384,3387],{},"Prep for models: ",[207,3385,3386],{},"df = data[['Date','Close']].copy(); df.columns = ['ds','y']; df.dropna()"," ensures Prophet format—missing 'ds'\u002F'y' causes failures.",[18,3389,3391],{"id":3390},"prophet-and-arima-deliver-complementary-forecasts","Prophet and ARIMA Deliver Complementary Forecasts",[23,3393,3394,3395,3398],{},"Prophet auto-detects trends and seasonality (weekly\u002Fyearly): ",[207,3396,3397],{},"prophet_model = Prophet(); prophet_model.fit(df); future = prophet_model.make_future_dataframe(periods=n_day); forecast_prophet = prophet_model.predict(future)",". Ideal for patterned time series without manual tuning.",[23,3400,3401,3402,3405],{},"ARIMA uses autoregression, differencing (d=1), moving averages (order=(5,1,0)): ",[207,3403,3404],{},"model = ARIMA(df['y'], order=(5,1,0)); model_fit = model.fit()",". Suited for stable, consistent data needing statistical rigor—requires more data insight than Prophet.",[23,3407,3408,3409,3412,3413,3416,3417,516,3420,516,3423,3426],{},"Visualize in one Plotly ",[207,3410,3411],{},"go.Figure()",": add actuals ",[207,3414,3415],{},"go.Scatter(x=df['ds'], y=df['y'], name='Actual')",", overlay Prophet\u002FARIMA forecasts. Add toggles: ",[207,3418,3419],{},"st.selectbox(\"Select Model\", [\"All\", \"Prophet Only\", \"ARIMA Only\"])",[207,3421,3422],{},"show_ci = st.checkbox(\"Show Confidence Interval\")",[207,3424,3425],{},"highlight_forecast = st.checkbox(\"Highlight Forecast Area\")"," for interactive exploration.",[18,3428,3430],{"id":3429},"metrics-and-rules-pinpoint-better-model-per-stock","Metrics and Rules Pinpoint Better Model Per Stock",[23,3432,3433,3434,3437,3438,3441,3442,3444],{},"Split 80\u002F20: ",[207,3435,3436],{},"split = int(len(df) * 0.8); train = df.iloc[:split]; test = df.iloc[split:]",". Compute MAE = mean_absolute_error(test",[185,3439,3440],{},"'y'",", pred), RMSE = sqrt(mean_squared_error(test",[185,3443,3440],{},", pred)), MAPE similarly.",[23,3446,3447,3448,3451,3452,3455,3456,1006],{},"Display side-by-side in columns: ",[207,3449,3450],{},"with col1: st.markdown(\"### Prophet\"); st.metric(\"MAE\", f\"{mae_prophet:.4f}\")"," etc. for both models. Pick winner by RMSE (penalizes large errors): ",[207,3453,3454],{},"if rmse_prophet \u003C rmse_arima: winner = \"Prophet\"",". Show ",[207,3457,3458],{},"st.success(f\"{winner} performs better based on RMSE\")",[23,3460,3461,3462,3465,3466,3468],{},"Interpret MAPE: ",[207,3463,3464],{},"def interpret_mape(mape): if mape \u003C 10: \"✅ Good Model\"; elif mape \u003C 20: \"⚠️ Acceptable Model\"; else: \"❌ Poor Model\"",". Normalize error: avg_price = test",[185,3467,3440],{},".mean(); relative_rmse = (best_rmse \u002F avg_price) * 100 to contextualize against price scale.",[23,3470,3471],{},"Performance varies—Prophet better for \"AA\", ARIMA for \"GOOGL\" with smaller RMSE. No universal winner; evaluate per stock across metrics.",[18,3473,3475],{"id":3474},"deploy-fast-streamlit-cloud-over-ngrok","Deploy Fast: Streamlit Cloud Over Ngrok",[23,3477,3478,3479,3482,3483,1006],{},"Push to GitHub for Streamlit Cloud deployment—generates stable public link. For local testing, ",[207,3480,3481],{},"from pyngrok import ngrok; ngrok.connect(8501)"," provides temp URL, but unstable long-term. Full code at ",[3484,3485,3486],"a",{"href":3486,"rel":3487},"https:\u002F\u002Fgithub.com\u002FjihanKamilah\u002FMarketPulse-Stock-Forecast-App",[3488],"nofollow",{"title":53,"searchDepth":54,"depth":54,"links":3490},[3491,3492,3493,3494],{"id":3316,"depth":54,"text":3317},{"id":3390,"depth":54,"text":3391},{"id":3429,"depth":54,"text":3430},{"id":3474,"depth":54,"text":3475},[440],{},"\u002Fsummaries\u002Fstreamlit-dashboard-prophet-vs-arima-stock-forecas-summary",{"title":3306,"description":53},{"loc":3497},"3e2aa6c9cf742867","summaries\u002Fstreamlit-dashboard-prophet-vs-arima-stock-forecas-summary",[162,104,105,460],"Build an interactive Streamlit app to load stock data, forecast with Prophet (auto-trend\u002Fseasonality) and ARIMA (order=5,1,0), compare via side-by-side MAE\u002FRMSE\u002FMAPE metrics, declare RMSE winner, and interpret MAPE (\u003C10% good, \u003C20% acceptable). Use caching to speed up yf.download, 80\u002F20 train\u002Ftest split.",[],"wtTd2VwQ5rOZn_VWzzoJM55_nwR7HPP6D3iNrnS1KBU",{"id":3507,"title":3508,"ai":3509,"body":3514,"categories":3624,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3625,"navigation":91,"path":3626,"published_at":3627,"question":61,"scraped_at":3628,"seo":3629,"sitemap":3630,"source_id":3631,"source_name":3632,"source_type":3633,"source_url":3634,"stem":3635,"tags":3636,"thumbnail_url":61,"tldr":3639,"tweet":61,"unknown_tags":3640,"__hash__":3641},"summaries\u002Fsummaries\u002Fevolving-visa-s-data-viz-library-into-an-insight-l-summary.md","Evolving Visa's Data Viz Library into an Insight Language",{"provider":8,"model":9,"input_tokens":3510,"output_tokens":3511,"processing_time_ms":3512,"cost_usd":3513},9085,2506,21545,0.00304735,{"type":15,"value":3515,"toc":3617},[3516,3520,3523,3526,3529,3532,3536,3539,3542,3545,3548,3551,3555,3558,3561,3564,3567,3571,3574,3577,3580,3583,3585],[18,3517,3519],{"id":3518},"from-chart-components-to-team-acceleration","From Chart Components to Team Acceleration",[23,3521,3522],{},"Layla Laurio and Frank Elavsky from Visa's data experience team shared their progression from a basic chart library to a comprehensive design language. Initially, the goal was simple: speed up product teams building data visualizations across Visa's diverse products, from merchant analytics and fraud detection to government economic tools. They targeted 'better' viz defined as useful (drives decisions), usable (easy to read\u002Finterpret), and accessible.",[23,3524,3525],{},"The first release in 2018 delivered 12 core chart types (lines, bars, etc.) plus exotics like alluvial and circle packing, bundled with 90+ recipes—pre-configured variants like highlighted lines or interactions. As Visa's first open-source library, it included utility functions usable standalone. Key decision: web components for framework agnosticism (React, Angular, R, Python, Svelte, Vue), supporting legacy and future stacks without lock-in. Tradeoff: Web components were nascent then, risking adoption hurdles, but enabled broad reuse.",[23,3527,3528],{},"Engineering tackled hard basics out-of-the-box: intelligent axis labeling (truncation, spacing, date formatting), non-overlapping data labels, flexible annotations API (text\u002Fshapes anywhere, often abused for decoration), hover\u002Fselection states with internal strokes, and smooth animations for data updates (entering\u002Fexiting elements, stack growth). For live dashboards, transitions communicate changes without full re-renders, aiding exploratory analysis.",[23,3530,3531],{},"\"Making visualizations is hard. Even the basics are hard. So, making a really good axis is no easy feat.\" — Frank Elavsky, highlighting why they automated low-level pains like drawing lines or spacing labels, freeing users for higher-level work.",[18,3533,3535],{"id":3534},"accessibility-as-a-non-negotiable-pillar","Accessibility as a Non-Negotiable Pillar",[23,3537,3538],{},"Accessibility was the first principle, led by Frank. They rejected common pitfalls: screen readers announcing charts as mere \"Image\" or endless \"Graphic symbol\" loops (painful with thousands of points). Instead, charts offer hierarchical navigation—group levels (e.g., line groups), drill-down (product\u002Fdate\u002Fvalue, with position like \"point 6 of 12\"), lateral comparison (across lines on same date), skippable sections, data tables for analysts, and semantic \"alternative documents\" (not just alt text) auto-generated from data, overrideable via props.",[23,3540,3541],{},"Enforced WCAG AA: Auto-boosts low-contrast inputs to 4.5:1 ratios; redundant encodings prevent color-alone reliance (line patterns like long-short-long, fill textures, scatter shapes like stars). Their public design system (released months ago, open-source) showcases 20 live accessible charts.",[23,3543,3544],{},"\"We did not want people... to have to slog through a thousand points. We actually structured and grouped all of our data in ways that are meaningful.\" — Frank Elavsky, on navigation design, a turning point that made Visa an early leader in accessible viz systems.",[23,3546,3547],{},"\"Visualizations can have thousands of data points. If you can't skip it, very painful.\" — Frank Elavsky, contrasting bad ARIA graphics APIs (navigable but unusable) with their grouped, skip-friendly approach.",[23,3549,3550],{},"Team proximity to product squads provided real-time feedback, refining via observed pains in design\u002Fdev workflows.",[18,3552,3554],{"id":3553},"real-world-data-demands-design-judgment","Real-World Data Demands Design Judgment",[23,3556,3557],{},"Components alone faltered with messy data. Same line chart component yielded dense, unreadable spaghetti or sparse clarity—context drove quality. Pie charts with dozens of categories exposed limits: no single prop fixes it. Solutions required viz expertise: aggregate tails into \"Others\" (top 3 + rest), hierarchical grouping (merchants → industries), or extreme simplification (one category vs. rest).",[23,3559,3560],{},"This revealed gaps: Components enable accessibility\u002Feffectiveness but can't enforce optimal designs for varied data\u002Fuser contexts. Line charts suit trends but fail dense overlaps without tweaks; pies tempt but rarely scale.",[23,3562,3563],{},"\"Is it possible to make charts, and chart components, accessible and effective out of the box? My answer would be probably not.\" — Layla Laurio, on why specialized knowledge bridges component capabilities to real products, prompting evolution beyond library.",[23,3565,3566],{},"Frank favored versatile lines; Layla leaned boring bars. Exotic types like GitHub commit calendars, dumbbells (dual trends), or alluvials shone in niches but reinforced: No universal chart—user\u002Fdata context rules.",[18,3568,3570],{"id":3569},"scaling-to-a-communication-language","Scaling to a Communication Language",[23,3572,3573],{},"Act 1 built the library for speed. Act 2 broadened to a system accelerating teams with opinionated, tool-agnostic tools. Act 3: A language for insights, as usage revealed needs beyond components—unified patterns for consistent, insightful communication across Visa.",[23,3575,3576],{},"Mixed system\u002Fproduct work yielded advantages: Direct observation of wins\u002Fpains. Open-sourcing invited external validation. Tradeoffs named: Opinionated defaults guide but allow overrides; accessibility-first adds engineering overhead but prevents regressions.",[23,3578,3579],{},"Their system now lives in Visa's public design system, fully navigable\u002Fopen-source. Evolution continues, guided by core principles.",[23,3581,3582],{},"\"We weren't just gonna make 12 components. But we were also gonna push towards open source... web components... allowed us to support any... projects.\" — Frank Elavsky, on early bets enabling wide adoption despite web components' novelty in 2018.",[18,3584,1602],{"id":1601},[269,3586,3587,3590,3593,3596,3599,3602,3605,3608,3611,3614],{},[272,3588,3589],{},"Prioritize accessibility-first: Enforce contrast, redundant encodings, semantic navigation, and data tables out-of-the-box to avoid common screen reader failures.",[272,3591,3592],{},"Use web components for framework freedom: Supports React\u002FAngular\u002Fetc. without rewriting, ideal for diverse enterprise stacks.",[272,3594,3595],{},"Bundle recipes (90+ variants) with cores (12 charts): Lowers barrier for non-experts while allowing customization.",[272,3597,3598],{},"Automate viz basics (axes, labels, animations): Frees teams for data\u002Fcontext decisions, not low-level drawing.",[272,3600,3601],{},"Design for real data mess: Aggregate\u002Fgroup\u002Fsimplify beyond props—components enable, judgment delivers.",[272,3603,3604],{},"Evolve library → system → language: Observe product usage to expand from speed to insights.",[272,3606,3607],{},"Open-source early: Visa's first gained utilities\u002Ffeedback; makes enforcement (e.g., contrast) a gift to users.",[272,3609,3610],{},"Test extremes: Dense lines, many pie slices, thousands of points—expose component limits.",[272,3612,3613],{},"Mix system\u002Fproduct roles: Real-time feedback accelerates iteration over siloed design.",[272,3615,3616],{},"No universal charts: Lines\u002Fbars for trends, but context (user\u002Fdata) dictates; avoid pie overuse.",{"title":53,"searchDepth":54,"depth":54,"links":3618},[3619,3620,3621,3622,3623],{"id":3518,"depth":54,"text":3519},{"id":3534,"depth":54,"text":3535},{"id":3553,"depth":54,"text":3554},{"id":3569,"depth":54,"text":3570},{"id":1601,"depth":54,"text":1602},[60],{},"\u002Fsummaries\u002Fevolving-visa-s-data-viz-library-into-an-insight-l-summary","2026-04-07 11:53:31","2026-04-08 14:48:55",{"title":3508,"description":53},{"loc":3626},"2b23d23c3a8fefcd","Smashing Magazine","video","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=atVtiKCALY8","summaries\u002Fevolving-visa-s-data-viz-library-into-an-insight-l-summary",[3637,104,2099,3638],"design-systems","accessibility","Visa data team built an accessible web components chart library, then iterated to a design system handling messy real-world data, enforcing best practices for faster, better visualizations across teams.",[3638],"3yyB1vWMHbhCP-aNCDjj7o2gRW0z94VCYnCo8qSnr_U",{"id":3643,"title":3644,"ai":3645,"body":3650,"categories":3678,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3679,"navigation":91,"path":3683,"published_at":61,"question":61,"scraped_at":3684,"seo":3685,"sitemap":3686,"source_id":3687,"source_name":2095,"source_type":99,"source_url":3688,"stem":3689,"tags":3690,"thumbnail_url":61,"tldr":3692,"tweet":61,"unknown_tags":3693,"__hash__":3694},"summaries\u002Fsummaries\u002Fdata-first-charting-tools-and-techniques-that-work-summary.md","Data-First Charting: Tools and Techniques That Work",{"provider":8,"model":9,"input_tokens":3646,"output_tokens":3647,"processing_time_ms":3648,"cost_usd":3649},4365,899,6988,0.0013,{"type":15,"value":3651,"toc":3673},[3652,3656,3659,3663,3666,3670],[18,3653,3655],{"id":3654},"reject-templates-begin-with-data-exploration","Reject Templates: Begin with Data Exploration",[23,3657,3658],{},"Mechanical chart templates fail because datasets rarely reveal insights automatically—you often don't know what to look for upfront. Instead, ask questions about the data and learn its structure first. This purpose-driven approach, shaped by audience needs, ensures charts communicate effectively rather than just displaying numbers. Nathan Yau's process turns raw datasets into graphics by prioritizing exploration over plug-and-play software.",[18,3660,3662],{"id":3661},"build-a-flexible-toolset-for-any-dataset","Build a Flexible Toolset for Any Dataset",[23,3664,3665],{},"No single tool dominates; select based on your situation, potentially mixing R for stats, Python for scripting, Illustrator for polish, and web tools for interactivity. Yau's examples demonstrate step-by-step workflows across these, letting you test and choose what fits your projects. This avoids tool obsession, focusing on outcomes like finished, publication-ready visuals from real-world data.",[18,3667,3669],{"id":3668},"master-visualization-by-data-type-and-purpose","Master Visualization by Data Type and Purpose",[23,3671,3672],{},"Follow a structured progression: handle data cleaning, then visualize time series (trends over periods), categories (group comparisons), relationships (correlations via scatterplots or heatmaps), and space (geographic mappings). Analyze visually for patterns, and design with intent—considering layout, color, and form to tell stories. Updated for 2024 with new tools, datasets, and methods since the 2011 first edition, this covers nine chapters from storytelling basics to purposeful design, using Yau's FlowingData projects as concrete examples.",{"title":53,"searchDepth":54,"depth":54,"links":3674},[3675,3676,3677],{"id":3654,"depth":54,"text":3655},{"id":3661,"depth":54,"text":3662},{"id":3668,"depth":54,"text":3669},[440],{"content_references":3680,"triage":3681},[],{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":3682},"Category: Data Science & Visualization. The article provides a structured approach to data visualization that addresses the audience's need for practical techniques in creating effective charts. It emphasizes the importance of data exploration and flexible tool selection, which are actionable insights for product builders.","\u002Fsummaries\u002Fdata-first-charting-tools-and-techniques-that-work-summary","2026-04-15 15:35:49",{"title":3644,"description":53},{"loc":3683},"bb218028fbecee75","https:\u002F\u002Fbook.flowingdata.com\u002F","summaries\u002Fdata-first-charting-tools-and-techniques-that-work-summary",[104,105,162,3691],"r","Start with data questions to drive purposeful charts, using flexible tools like R and Python over rigid templates, covering time, categories, relationships, space, and design.",[3691],"s6jM_ZffaB8g-KvsQFD1Nz6mwH_JmLSXujCBM77fTR0",{"id":3696,"title":3697,"ai":3698,"body":3703,"categories":3935,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3937,"navigation":91,"path":3943,"published_at":61,"question":61,"scraped_at":3944,"seo":3945,"sitemap":3946,"source_id":3947,"source_name":2095,"source_type":99,"source_url":3948,"stem":3949,"tags":3950,"thumbnail_url":61,"tldr":3952,"tweet":61,"unknown_tags":3953,"__hash__":3954},"summaries\u002Fsummaries\u002Fon-device-vision-swift-code-for-ocr-poses-barcodes-summary.md","On-Device Vision: Swift Code for OCR, Poses, Barcodes",{"provider":8,"model":9,"input_tokens":3699,"output_tokens":3700,"processing_time_ms":3701,"cost_usd":3702},10209,1747,10640,0.0028928,{"type":15,"value":3704,"toc":3929},[3705,3709,3712,3744,3751,3755,3761,3804,3810,3816,3822,3825,3829,3832,3861,3864,3912,3915,3919,3927],[18,3706,3708],{"id":3707},"reusable-pattern-for-all-vision-requests","Reusable Pattern for All Vision Requests",[23,3710,3711],{},"Apple's Vision framework processes images offline using VNImageRequestHandler and specific request types. Start with a UIImage, convert to CGImage, then perform requests asynchronously:",[202,3713,3717],{"className":3714,"code":3715,"language":3716,"meta":53,"style":53},"language-swift shiki shiki-themes github-light github-dark","func processImage(from image: UIImage, with request: VNRequest) {\n    guard let cgImage = image.cgImage else { return }\n    let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])\n    try? handler.perform([request])\n}\n","swift",[207,3718,3719,3724,3729,3734,3739],{"__ignoreMap":53},[185,3720,3721],{"class":211,"line":212},[185,3722,3723],{},"func processImage(from image: UIImage, with request: VNRequest) {\n",[185,3725,3726],{"class":211,"line":54},[185,3727,3728],{},"    guard let cgImage = image.cgImage else { return }\n",[185,3730,3731],{"class":211,"line":88},[185,3732,3733],{},"    let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])\n",[185,3735,3736],{"class":211,"line":87},[185,3737,3738],{},"    try? handler.perform([request])\n",[185,3740,3741],{"class":211,"line":233},[185,3742,3743],{},"}\n",[23,3745,3746,3747,3750],{},"Handle results in the request's completion block by casting to the observation type (e.g., ",[185,3748,3749],{},"VNRecognizedTextObservation","). This pattern supports live camera feeds for real-time detection, avoiding cloud latency.",[18,3752,3754],{"id":3753},"text-rectangle-barcode-and-pose-detection-examples","Text, Rectangle, Barcode, and Pose Detection Examples",[23,3756,3757,3760],{},[940,3758,3759],{},"Text Recognition (OCR):"," Detects printed\u002Fhandwritten text. Use VNRecognizeTextRequest; extract topCandidate.string and confidence from VNRecognizedTextObservation.",[202,3762,3764],{"className":3714,"code":3763,"language":3716,"meta":53,"style":53},"let request = VNRecognizeTextRequest { request, error in\n    guard let observations = request.results as? [VNRecognizedTextObservation] else { return }\n    for observation in observations {\n        if let topCandidate = observation.topCandidates(1).first {\n            print(\"Detected text: \\(topCandidate.string)\")\n        }\n    }\n}\n",[207,3765,3766,3771,3776,3781,3786,3791,3796,3800],{"__ignoreMap":53},[185,3767,3768],{"class":211,"line":212},[185,3769,3770],{},"let request = VNRecognizeTextRequest { request, error in\n",[185,3772,3773],{"class":211,"line":54},[185,3774,3775],{},"    guard let observations = request.results as? [VNRecognizedTextObservation] else { return }\n",[185,3777,3778],{"class":211,"line":88},[185,3779,3780],{},"    for observation in observations {\n",[185,3782,3783],{"class":211,"line":87},[185,3784,3785],{},"        if let topCandidate = observation.topCandidates(1).first {\n",[185,3787,3788],{"class":211,"line":233},[185,3789,3790],{},"            print(\"Detected text: \\(topCandidate.string)\")\n",[185,3792,3793],{"class":211,"line":239},[185,3794,3795],{},"        }\n",[185,3797,3798],{"class":211,"line":245},[185,3799,1744],{},[185,3801,3802],{"class":211,"line":251},[185,3803,3743],{},[23,3805,3806,3809],{},[940,3807,3808],{},"Rectangle Detection:"," For document scanning. VNDetectRectanglesRequest yields VNRectangleObservation.boundingBox.",[23,3811,3812,3815],{},[940,3813,3814],{},"Barcode Detection:"," Supports QR, UPC, EAN. VNDetectBarcodesRequest provides VNBarcodeObservation.payloadStringValue.",[23,3817,3818,3821],{},[940,3819,3820],{},"Human Body Pose:"," Tracks 14+ joints for fitness\u002FAR. VNDetectHumanBodyPoseRequest returns VNHumanBodyPoseObservation; query points like .leftWrist.location via recognizedPoint(.leftWrist).",[23,3823,3824],{},"Each prints results (e.g., coordinates, strings); integrate into SwiftUI\u002FUIKit for overlays.",[18,3826,3828],{"id":3827},"visualize-detection-confidence-with-swift-charts","Visualize Detection Confidence with Swift Charts",[23,3830,3831],{},"Pair Vision outputs with SwiftUI Charts for dashboards. Model data:",[202,3833,3835],{"className":3714,"code":3834,"language":3716,"meta":53,"style":53},"struct TextConfidence: Identifiable {\n    let id = UUID()\n    let text: String\n    let confidence: Double\n}\n",[207,3836,3837,3842,3847,3852,3857],{"__ignoreMap":53},[185,3838,3839],{"class":211,"line":212},[185,3840,3841],{},"struct TextConfidence: Identifiable {\n",[185,3843,3844],{"class":211,"line":54},[185,3845,3846],{},"    let id = UUID()\n",[185,3848,3849],{"class":211,"line":88},[185,3850,3851],{},"    let text: String\n",[185,3853,3854],{"class":211,"line":87},[185,3855,3856],{},"    let confidence: Double\n",[185,3858,3859],{"class":211,"line":233},[185,3860,3743],{},[23,3862,3863],{},"Chart view:",[202,3865,3867],{"className":3714,"code":3866,"language":3716,"meta":53,"style":53},"import Charts\nstruct ConfidenceChart: View {\n    var data: [TextConfidence]\n    var body: some View {\n        Chart(data) {\n            BarMark(x: .value(\"Text\", $0.text), y: .value(\"Confidence\", $0.confidence))\n        }.frame(height: 300).padding()\n    }\n}\n",[207,3868,3869,3874,3879,3884,3889,3894,3899,3904,3908],{"__ignoreMap":53},[185,3870,3871],{"class":211,"line":212},[185,3872,3873],{},"import Charts\n",[185,3875,3876],{"class":211,"line":54},[185,3877,3878],{},"struct ConfidenceChart: View {\n",[185,3880,3881],{"class":211,"line":88},[185,3882,3883],{},"    var data: [TextConfidence]\n",[185,3885,3886],{"class":211,"line":87},[185,3887,3888],{},"    var body: some View {\n",[185,3890,3891],{"class":211,"line":233},[185,3892,3893],{},"        Chart(data) {\n",[185,3895,3896],{"class":211,"line":239},[185,3897,3898],{},"            BarMark(x: .value(\"Text\", $0.text), y: .value(\"Confidence\", $0.confidence))\n",[185,3900,3901],{"class":211,"line":245},[185,3902,3903],{},"        }.frame(height: 300).padding()\n",[185,3905,3906],{"class":211,"line":251},[185,3907,1744],{},[185,3909,3910],{"class":211,"line":325},[185,3911,3743],{},[23,3913,3914],{},"Populate from OCR: append TextConfidence(text: candidate.string, confidence: candidate.confidence) for each observation. This turns raw detections into actionable, visual insights without external libraries.",[18,3916,3918],{"id":3917},"trade-offs-favor-vision-over-cloud-apis","Trade-offs Favor Vision Over Cloud APIs",[23,3920,3921,3922,3926],{},"Vision excels in speed (no network), privacy (on-device), and cost (free) versus OpenAI\u002FGoogle Cloud Vision. Drawbacks: limited to Apple's models (extend via Core ML); iOS\u002FiPadOS only. Ideal for production apps needing reliability—no rate limits or tokens. GitHub repo at ",[3484,3923,3924],{"href":3924,"rel":3925},"https:\u002F\u002Fgithub.com\u002Fsanjaynela\u002FvisionApiProject.git",[3488]," expands these into a full project.",[431,3928,433],{},{"title":53,"searchDepth":54,"depth":54,"links":3930},[3931,3932,3933,3934],{"id":3707,"depth":54,"text":3708},{"id":3753,"depth":54,"text":3754},{"id":3827,"depth":54,"text":3828},{"id":3917,"depth":54,"text":3918},[3936],"Software Engineering",{"content_references":3938,"triage":3941},[3939],{"type":80,"title":3940,"url":3924,"context":447},"visionApiProject",{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":3942},"Category: AI & LLMs. The article provides practical examples of using Apple's Vision framework for various computer vision tasks, addressing the audience's need for actionable content. It includes specific Swift code snippets that developers can implement directly, enhancing its relevance and actionability.","\u002Fsummaries\u002Fon-device-vision-swift-code-for-ocr-poses-barcodes-summary","2026-04-16 02:56:09",{"title":3697,"description":53},{"loc":3943},"a0c73df99c5b6892","https:\u002F\u002Fmedium.com\u002Fdata-science-collective\u002Fhow-i-taught-my-iphone-to-see-like-a-human-a-deep-dive-into-apples-vision-api-a272272f4c5e","summaries\u002Fon-device-vision-swift-code-for-ocr-poses-barcodes-summary",[3951,460,104],"coding","Apple's Vision framework enables fast, private computer vision on iOS—text recognition, rectangle detection, body pose tracking, and barcode scanning—with reusable Swift request handlers and SwiftUI Charts for visualization.",[],"_e9PNRLwCOdTXPhLQqsbKce7W8Fl3XsxmT1uIXb2U_c",{"id":3956,"title":3957,"ai":3958,"body":3963,"categories":3991,"created_at":61,"date_modified":61,"description":53,"extension":62,"faq":61,"featured":63,"kicker_label":61,"meta":3992,"navigation":91,"path":4004,"published_at":61,"question":61,"scraped_at":4005,"seo":4006,"sitemap":4007,"source_id":4008,"source_name":2095,"source_type":99,"source_url":4009,"stem":4010,"tags":4011,"thumbnail_url":61,"tldr":4013,"tweet":61,"unknown_tags":4014,"__hash__":4015},"summaries\u002Fsummaries\u002Fus-oct-ecommerce-88-7b-spend-8-2-yoy-summary.md","US Oct Ecommerce: $88.7B Spend, +8.2% YoY",{"provider":8,"model":9,"input_tokens":3959,"output_tokens":3960,"processing_time_ms":3961,"cost_usd":3962},4764,2064,17374,0.0019623,{"type":15,"value":3964,"toc":3986},[3965,3969,3972,3976,3979,3983],[18,3966,3968],{"id":3967},"ecommerce-spend-surges-with-mobile-dominance","Ecommerce Spend Surges with Mobile Dominance",[23,3970,3971],{},"US consumers drove $88.7 billion in online spending in October, marking 8.2% year-over-year growth. This data draws from over one trillion retail site visits, 100 million SKUs, and 18 product categories. Mobile commerce captured 51.4% of revenue share on average, reflecting sustained comfort with small-screen transactions—Adobe projects this trend persisting into 2025. Year-over-year growth charts show consistent upward momentum from October 2024 to 2025, with cumulative spend from January to October 2025 highlighting the scale.",[18,3973,3975],{"id":3974},"bnpl-fuels-flexible-purchasing","BNPL Fuels Flexible Purchasing",[23,3977,3978],{},"Buy-now-pay-later options saw $7.1 billion in October spend, up 7.6% year-over-year. Monthly BNPL trends from October 2024-2025 indicate steady adoption, while total BNPL spend and growth from January to October 2025 underscore its role in easing consumer purchases. These figures reveal BNPL as a key driver in expanding accessible ecommerce amid rising totals.",[18,3980,3982],{"id":3981},"actionable-insights-via-adobe-analytics","Actionable Insights via Adobe Analytics",[23,3984,3985],{},"85% of the top 100 US internet retailers use Adobe Analytics for measurement and personalization, per the 2021 Digital Commerce 360 Top 500 report. This positions Adobe's tools as the benchmark for tracking market dynamics. Access deeper data through the downloadable 2024 Quarterly Forecast report, Digital Price Index for inflation tracking, and holiday shopping trends for seasonal planning—equipping builders with consumer behavior signals to refine pricing, mobile UX, and payment integrations.",{"title":53,"searchDepth":54,"depth":54,"links":3987},[3988,3989,3990],{"id":3967,"depth":54,"text":3968},{"id":3974,"depth":54,"text":3975},{"id":3981,"depth":54,"text":3982},[440],{"content_references":3993,"triage":4002},[3994,3997,4000],{"type":2076,"title":3995,"url":3996,"context":71},"2024 US ADI Report Adobe Quarterly Report","https:\u002F\u002Fbusiness.adobe.com\u002Fcontent\u002Fdam\u002Fdx\u002Fus\u002Fen\u002Fresources\u002Fdigital-economy-index\u002F2024-US-ADI-Report-Adobe-Quarterly-Report.pdf",{"type":2076,"title":3998,"publisher":3999,"context":2074},"Digital Commerce 360 Top 500","Digital Commerce 360",{"type":80,"title":4001,"context":447},"Adobe Analytics",{"relevance":87,"novelty":88,"quality":87,"actionability":87,"composite":89,"reasoning":4003},"Category: Marketing & Growth. The article provides valuable insights into ecommerce trends and consumer behavior, which are crucial for product builders focused on growth strategies. It offers actionable insights on using Adobe Analytics for measurement and personalization, which can directly inform product decisions.","\u002Fsummaries\u002Fus-oct-ecommerce-88-7b-spend-8-2-yoy-summary","2026-04-14 14:32:01",{"title":3957,"description":53},{"loc":4004},"f6c167d3950bc0ae","https:\u002F\u002Fbusiness.adobe.com\u002Fresources\u002Fdigital-economy-index.html","summaries\u002Fus-oct-ecommerce-88-7b-spend-8-2-yoy-summary",[104,163,4012],"analytics","US online spending hit $88.7B in October (up 8.2% YoY), mobile share reached 51.4%, BNPL totaled $7.1B (up 7.6% YoY), based on 1T+ retail visits across 100M SKUs.",[163,4012],"KOiW9pA2V-o09lCnOSzj8gpVTSoLVBhtYqRDqGHWwtI",[4017,4020,4022,4024,4026,4029,4031,4033,4035,4037,4039,4041,4043,4045,4047,4049,4051,4053,4055,4057,4059,4061,4063,4065,4067,4069,4071,4073,4075,4077,4079,4081,4083,4085,4087,4089,4091,4093,4095,4097,4099,4101,4103,4105,4107,4109,4111,4113,4115,4117,4119,4121,4123,4125,4127,4129,4131,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175,4177,4179,4181,4183,4185,4187,4189,4191,4193,4195,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219,4221,4223,4225,4227,4229,4231,4233,4235,4237,4239,4241,4243,4245,4247,4249,4251,4253,4255,4257,4259,4261,4263,4265,4267,4269,4271,4273,4275,4277,4279,4281,4283,4285,4287,4289,4291,4293,4295,4297,4299,4301,4303,4305,4307,4309,4311,4313,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4357,4359,4361,4363,4365,4367,4369,4371,4374,4376,4378,4380,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402,4404,4406,4408,4410,4412,4414,4416,4418,4420,4422,4424,4426,4428,4430,4432,4434,4436,4438,4440,4442,4444,4446,4448,4450,4452,4454,4456,4458,4461,4463,4465,4467,4469,4471,4473,4475,4477,4479,4481,4483,4485,4487,4489,4491,4493,4495,4497,4499,4501,4503,4505,4507,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529,4531,4533,4535,4537,4539,4541,4543,4545,4547,4549,4551,4553,4555,4557,4559,4561,4563,4565,4567,4569,4571,4573,4575,4577,4579,4581,4583,4585,4587,4589,4591,4593,4595,4597,4599,4601,4603,4605,4607,4609,4611,4613,4615,4617,4619,4621,4623,4625,4627,4629,4631,4633,4635,4637,4639,4641,4643,4645,4647,4649,4651,4653,4655,4657,4659,4661,4663,4665,4667,4669,4671,4673,4675,4677,4679,4681,4683,4685,4687,4689,4691,4693,4695,4697,4699,4701,4703,4705,4707,4709,4711,4713,4715,4717,4719,4721,4723,4725,4727,4729,4731,4733,4735,4737,4739,4741,4743,4745,4747,4749,4751,4753,4755,4757,4759,4761,4763,4765,4767,4769,4771,4773,4775,4777,4779,4781,4783,4785,4787,4789,4791,4793,4795,4797,4799,4801,4803,4805,4807,4809,4811,4813,4815,4817,4819,4821,4823,4825,4827,4829,4831,4833,4835,4837,4839,4841,4843,4845,4847,4849,4851,4853,4855,4857,4859,4861,4863,4865,4867,4869,4871,4873,4875,4877,4879,4881,4883,4885,4887,4889,4891,4893,4895,4897,4899,4901,4903,4905,4907,4909,4911,4913,4915,4917,4919,4921,4923,4925,4927,4929,4931,4933,4935,4937,4939,4941,4943,4945,4947,4949,4951,4953,4955,4957,4959,4961,4963,4965,4967,4969,4971,4973,4975,4977,4979,4981,4983,4985,4987,4989,4991,4993,4995,4997,4999,5001,5003,5005,5007,5009,5011,5013,5015,5017,5019,5021,5023,5025,5027,5029,5031,5033,5035,5037,5039,5041,5043,5045,5047,5049,5051,5053,5055,5057,5059,5061,5063,5065,5067,5069,5071,5073,5075,5077,5079,5081,5083,5085,5087,5089,5091,5093,5095,5097,5099,5101,5103,5105,5107,5109,5111,5113,5115,5117,5119,5121,5123,5125,5127,5129,5131,5133,5135,5137,5139,5141,5143,5145,5147,5149,5151,5153,5155,5157,5159,5161,5163,5165,5167,5169,5171,5173,5175,5177,5179,5181,5183,5185,5187,5189,5191,5193,5195,5197,5199,5201,5203,5205,5207,5209,5211,5213,5215,5217,5219,5221,5223,5225,5227,5229,5231,5233,5235,5237,5239,5241,5243,5245,5247,5249,5251,5253,5255,5257,5259,5261,5263,5265,5267,5269,5271,5273,5275,5277,5279,5281,5283,5285,5287,5289,5291,5293,5295,5297,5299,5301,5303,5305,5307,5309,5311,5313,5315,5317,5319,5321,5323,5325,5327,5329,5331,5333,5335,5337,5339,5341,5343,5345,5347,5349,5351,5353,5355,5357,5359,5361,5363,5365,5367,5369,5371,5373,5375,5377,5379,5381,5383,5385,5387,5389,5391,5393,5395,5397,5399,5401,5403,5405,5407,5409,5411,5413,5415,5417,5419,5421,5423,5425,5427,5429,5431,5433,5435,5437,5439,5441,5443,5445,5447,5449,5451,5453,5455,5457,5459,5461,5463,5465,5467,5469,5471,5473,5475,5477,5479,5481,5483,5485,5487,5489,5491,5493,5495,5497,5499,5501,5503,5505,5507,5509,5511,5513,5515,5517,5519,5521,5523,5525,5527,5529,5531,5533,5535,5537,5539,5541,5543,5545,5547,5549,5551,5553,5555,5557,5559,5561,5563,5565,5567,5569,5571,5573,5575,5577,5579,5581,5583,5585,5587,5589,5591,5593,5595,5597,5599,5601,5603,5605,5607,5609,5611,5613,5615,5617,5619,5621,5623,5625,5627,5629,5631,5633,5635,5637,5639,5641,5643,5645,5647,5649,5651,5653,5655,5657,5659,5661,5663,5665,5667,5669,5671,5673,5675,5677,5679,5681,5683,5685,5687,5689,5691,5693,5695,5697,5699,5701,5703,5705,5707,5709,5711,5713,5715,5717,5719,5721,5723,5725,5727,5729,5731,5733,5735,5737,5739,5741,5743,5745,5747,5749,5751,5753,5755,5757,5759,5761,5763,5765,5767,5769,5771,5773,5775,5777,5779,5781,5783,5785,5787,5789,5791,5793,5795,5797,5799,5801,5803,5805,5807,5809,5811,5813,5815,5817,5819,5821,5823,5825,5827,5829,5831,5833,5835,5837,5839,5841,5843,5845,5847,5849,5851,5853,5855,5857,5859,5861,5863,5865,5867,5869,5871,5873,5875,5877,5879,5881,5883,5885,5887,5889,5891,5893,5895,5897,5899,5901,5903,5905,5907,5909,5911,5913,5915,5917,5919,5921,5923,5925,5927,5929,5931,5933,5935,5937,5939,5941,5943,5945,5947,5949,5951,5953,5955,5957,5959,5961,5963,5965,5967,5969,5971,5973,5975,5977,5979,5981,5983,5985,5987,5989,5991,5993,5995,5997,5999,6001,6003,6005,6007,6009,6011,6013,6015,6017,6019,6021,6023,6025,6027,6029,6031,6033,6035,6037,6039,6041,6043,6045,6047,6049,6051,6053,6055,6057,6059,6061,6063,6065,6067,6069,6071,6073,6075,6077,6079,6081,6083,6085,6087,6089,6091,6093,6095,6097,6099,6101,6103,6105,6107,6109,6111,6113,6115,6117,6119,6121,6123,6125,6127,6129,6131,6133,6135,6137,6139,6141,6143,6145,6147,6149,6151,6153,6155,6157,6159,6161,6163,6165,6167,6169,6171,6173,6175,6177,6179,6181,6183,6185,6187,6189,6191,6193,6195,6197,6199,6201,6203,6205,6207,6209,6211,6213,6215,6217,6219,6221,6223,6225,6227,6229,6231,6233,6235,6237,6239,6241,6243,6245,6247,6249,6251,6253,6255,6257,6259,6261,6263,6265,6267,6269,6271,6273,6275,6277,6279,6281,6283,6285,6287,6289,6291,6293,6295,6297,6299,6301,6303,6305,6307,6309,6311,6313,6315,6317,6319,6321,6323,6325,6327,6329,6331,6333,6335,6337,6339,6341,6343,6345,6347,6349,6351,6353,6355,6357,6359,6361,6363,6365,6367,6369,6371,6373,6375,6377,6379,6381,6383,6385,6387,6389,6391,6393,6395,6397,6399,6401,6403,6405,6407,6409,6411,6413,6415,6417,6419,6421,6423,6425,6427,6429,6431,6433,6435,6437,6439,6441,6443,6445,6447,6449,6451,6453,6455,6457,6459,6461,6463,6465,6467,6469,6471,6473,6475,6477,6479,6481,6483,6485,6487,6489,6491,6493,6495,6497,6499,6501,6503,6505,6507,6509,6511,6513,6515,6517,6519,6521,6523,6525,6527,6529,6531,6533,6535,6537,6539,6541,6543,6545,6547,6549,6551,6553,6555,6557,6559,6561,6563,6565,6567,6569,6571,6573,6575,6577,6579,6581,6583,6585,6587,6589,6591,6593,6595,6597,6599,6601,6603,6605,6607,6609,6611,6613,6615,6617,6619,6621,6623,6625,6627,6629,6631,6633,6635,6637,6639,6641,6643,6645,6647,6649,6651,6653,6655,6657,6659,6661,6663,6665,6667,6669,6671,6673,6675,6677,6679,6681,6683,6685,6687,6689,6691,6693,6695,6697,6699,6701,6703,6705,6707,6709,6711,6713,6715,6717,6719,6721,6723,6725,6727,6729,6731,6733,6735,6737,6739,6741,6743,6745,6747,6749,6751,6753,6755,6757,6759,6761,6763,6765,6767,6769,6771,6773,6775,6777,6779,6781,6783,6785,6787,6789,6791,6793,6795,6797,6799,6801,6803,6805,6807,6809,6811,6813,6815,6817,6819,6821,6823,6825,6827,6829,6831,6833,6835,6837,6839,6841,6843,6845,6847,6849,6851,6853,6855,6857,6859,6861,6863,6865,6867,6869,6871,6873,6875,6877,6879,6881,6883,6885,6887,6889,6891,6893,6895,6897,6899,6901,6903,6905,6907,6909,6911,6913,6915,6917,6919,6921,6923,6925,6927,6929,6931,6933,6935,6937,6939,6941,6943,6945,6947,6949,6951,6953,6955,6957,6959,6961,6963,6965,6967,6969,6971,6973,6975,6977,6979,6981,6983,6985,6987,6989,6991,6993,6995,6997,6999,7001,7003,7005,7007,7009,7011,7013,7015,7017,7019,7021,7023,7025,7027,7029,7031,7033,7035,7037,7039,7041,7043,7045,7047,7049,7051,7053,7055,7057,7059,7061,7063,7065,7067,7069,7071,7073,7075,7077,7079,7081,7083,7085,7087,7089,7091,7093,7095,7097,7099,7101,7103,7105,7107,7109,7111,7113,7115,7117,7119,7121,7123,7125,7127,7129,7131,7133,7135,7137,7139,7141,7143,7145,7147,7149,7151,7153,7155,7157,7159,7161,7163,7165,7167,7169,7171,7173,7175,7177,7179,7181,7183,7185,7187,7189,7191,7193,7195,7197,7199,7201,7203,7205,7207,7209,7211,7213,7215,7217,7219,7221,7223,7225,7227,7229,7231,7233,7235,7237,7239,7241,7243,7245,7247,7249,7251,7253,7255,7257,7259,7261,7263,7265,7267,7269,7271,7273,7275,7277,7279,7281,7283,7285,7287,7289,7291,7293,7295,7297,7299,7301,7303,7305,7307,7309,7311,7313,7315,7317,7319,7321,7323,7325,7327,7329,7331,7333,7335,7337,7339,7341,7343,7345,7347,7349,7351,7353,7355,7357,7359,7361,7363,7365,7367,7369,7371,7373,7375,7377,7379,7381,7383,7385,7387,7389,7391,7393,7395,7397,7399,7401,7403,7405,7407,7409,7411,7413,7415,7417,7419,7421,7423,7425,7427,7429,7431,7433,7435,7437,7439,7441,7443,7445,7447,7449,7451,7453,7455,7457,7459,7461,7463,7465,7467,7469,7471,7473,7475,7477,7479,7481,7483,7485,7487,7489,7491,7493,7495,7497,7499,7501,7503,7505,7507,7509,7511,7513,7515,7517,7519,7521,7523,7525,7527,7529,7531,7533,7535,7537,7539,7541,7543,7545,7547,7549,7551,7553,7555,7557,7559,7561,7563,7565,7567,7569,7571,7573,7575,7577,7579,7581,7583,7585,7587,7589,7591,7593,7595,7597,7599,7601,7603,7605,7607,7609,7611,7613,7615,7617,7619,7621,7623,7625,7627,7629,7631,7633,7635,7637,7639,7641,7643,7645,7647,7649,7651,7653,7655,7657,7659,7661,7663,7665,7667,7669,7671,7673,7675,7677,7679,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749,7751,7753,7755,7757,7759,7761,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781,7783,7785,7787,7789,7791,7793,7795,7797,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823,7825,7827,7829,7831,7833,7835,7837,7839,7841,7843,7845,7847,7849,7851,7853,7855,7857,7859,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7889,7891,7893,7895,7897,7899,7901,7903,7905,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931,7933,7935,7937,7939,7941,7943,7945,7947,7949,7951,7953,7955,7957,7959,7961,7963,7965,7967,7969,7971,7973,7975,7977,7979,7981,7983,7985,7987,7989,7991,7993,7995,7997,7999,8001,8003,8005,8007,8009,8011,8013,8015,8017,8019,8021,8023,8025,8027,8029,8031,8033,8035,8037,8039,8041,8043,8045,8047,8049,8051,8053,8055,8057,8059,8061,8063,8065,8067,8069,8071,8073,8075,8077,8079,8081,8083,8085,8087,8089,8091,8093,8095,8097,8099,8101,8103,8105,8107,8109,8111,8113,8115,8117,8119,8121,8123,8125,8127,8129,8131,8133,8135,8137,8139,8141,8143,8145,8147,8149,8151,8153,8155,8157,8159,8161,8163,8165,8167,8169,8171,8173,8175,8177,8179,8181,8183,8185,8187,8189,8191,8193,8195,8197,8199,8201,8203,8205,8207,8209,8211,8213,8215,8217,8219,8221,8223,8225,8227,8229,8231,8233,8235,8237,8239,8241,8243,8245,8247,8249,8251,8253,8255,8257,8259,8261,8263,8265,8267,8269,8271,8273,8275,8277,8279,8281,8283,8285,8287,8289,8291,8293,8295,8297,8299,8301,8303,8305,8307,8309,8311,8313,8315,8317,8319,8321,8323,8325,8327,8329,8331,8333,8335,8337,8339,8341,8343,8345,8347,8349,8351,8353,8355,8357,8359,8361,8363,8365,8367,8369,8371,8373,8375,8377,8379,8381,8383,8385,8387,8389,8391,8393,8395,8397,8399,8401,8403,8405,8407,8409,8411,8413],{"categories":4018},[4019],"Business & SaaS",{"categories":4021},[4019],{"categories":4023},[2344],{"categories":4025},[],{"categories":4027},[4028],"AI Automation",{"categories":4030},[147],{"categories":4032},[60],{"categories":4034},[3936],{"categories":4036},[4028],{"categories":4038},[],{"categories":4040},[60],{"categories":4042},[60],{"categories":4044},[4028],{"categories":4046},[60],{"categories":4048},[60],{"categories":4050},[713],{"categories":4052},[60],{"categories":4054},[60],{"categories":4056},[],{"categories":4058},[60],{"categories":4060},[60],{"categories":4062},[713],{"categories":4064},[2933],{"categories":4066},[713],{"categories":4068},[713],{"categories":4070},[713],{"categories":4072},[2344],{"categories":4074},[713],{"categories":4076},[4028],{"categories":4078},[4019],{"categories":4080},[2344],{"categories":4082},[147],{"categories":4084},[],{"categories":4086},[],{"categories":4088},[4028],{"categories":4090},[4028],{"categories":4092},[4028],{"categories":4094},[147],{"categories":4096},[713],{"categories":4098},[2933],{"categories":4100},[2344],{"categories":4102},[],{"categories":4104},[],{"categories":4106},[],{"categories":4108},[440],{"categories":4110},[],{"categories":4112},[4028],{"categories":4114},[3936],{"categories":4116},[4028],{"categories":4118},[4028],{"categories":4120},[713],{"categories":4122},[147],{"categories":4124},[4028],{"categories":4126},[],{"categories":4128},[],{"categories":4130},[],{"categories":4132},[60],{"categories":4134},[60],{"categories":4136},[4028],{"categories":4138},[147],{"categories":4140},[2933],{"categories":4142},[60],{"categories":4144},[713],{"categories":4146},[3936],{"categories":4148},[713],{"categories":4150},[],{"categories":4152},[4028],{"categories":4154},[713],{"categories":4156},[2933],{"categories":4158},[2933],{"categories":4160},[],{"categories":4162},[147],{"categories":4164},[4019],{"categories":4166},[713],{"categories":4168},[4019],{"categories":4170},[4019],{"categories":4172},[4028],{"categories":4174},[147],{"categories":4176},[4028],{"categories":4178},[4019],{"categories":4180},[4028],{"categories":4182},[60],{"categories":4184},[713],{"categories":4186},[60],{"categories":4188},[713],{"categories":4190},[4019],{"categories":4192},[713],{"categories":4194},[147],{"categories":4196},[],{"categories":4198},[713],{"categories":4200},[4019],{"categories":4202},[],{"categories":4204},[2344],{"categories":4206},[3936],{"categories":4208},[],{"categories":4210},[713],{"categories":4212},[60],{"categories":4214},[713],{"categories":4216},[60],{"categories":4218},[],{"categories":4220},[4028],{"categories":4222},[],{"categories":4224},[],{"categories":4226},[],{"categories":4228},[713],{"categories":4230},[],{"categories":4232},[713],{"categories":4234},[713],{"categories":4236},[60],{"categories":4238},[713],{"categories":4240},[2933],{"categories":4242},[4028],{"categories":4244},[147],{"categories":4246},[2933],{"categories":4248},[2933],{"categories":4250},[2933],{"categories":4252},[147],{"categories":4254},[147],{"categories":4256},[713],{"categories":4258},[713],{"categories":4260},[60],{"categories":4262},[4019],{"categories":4264},[60],{"categories":4266},[3936],{"categories":4268},[4019],{"categories":4270},[4019],{"categories":4272},[4019],{"categories":4274},[60],{"categories":4276},[],{"categories":4278},[],{"categories":4280},[713],{"categories":4282},[713],{"categories":4284},[3936],{"categories":4286},[713],{"categories":4288},[713],{"categories":4290},[],{"categories":4292},[713],{"categories":4294},[713],{"categories":4296},[],{"categories":4298},[713],{"categories":4300},[2344],{"categories":4302},[2344],{"categories":4304},[],{"categories":4306},[],{"categories":4308},[147],{"categories":4310},[147],{"categories":4312},[3936],{"categories":4314},[713],{"categories":4316},[],{"categories":4318},[],{"categories":4320},[4028],{"categories":4322},[713],{"categories":4324},[713],{"categories":4326},[],{"categories":4328},[713,4019],{"categories":4330},[713],{"categories":4332},[],{"categories":4334},[713],{"categories":4336},[713],{"categories":4338},[],{"categories":4340},[],{"categories":4342},[4028],{"categories":4344},[713],{"categories":4346},[713],{"categories":4348},[4028],{"categories":4350},[713],{"categories":4352},[],{"categories":4354},[],{"categories":4356},[713],{"categories":4358},[],{"categories":4360},[713],{"categories":4362},[713],{"categories":4364},[],{"categories":4366},[4028],{"categories":4368},[60],{"categories":4370},[],{"categories":4372},[4028,4373],"DevOps & Cloud",{"categories":4375},[713],{"categories":4377},[4028],{"categories":4379},[713],{"categories":4381},[],{"categories":4383},[],{"categories":4385},[],{"categories":4387},[],{"categories":4389},[713],{"categories":4391},[4028],{"categories":4393},[],{"categories":4395},[4028],{"categories":4397},[],{"categories":4399},[713],{"categories":4401},[],{"categories":4403},[],{"categories":4405},[],{"categories":4407},[],{"categories":4409},[4028],{"categories":4411},[60],{"categories":4413},[713],{"categories":4415},[147],{"categories":4417},[2344],{"categories":4419},[4019],{"categories":4421},[2933],{"categories":4423},[],{"categories":4425},[4028],{"categories":4427},[4028],{"categories":4429},[713],{"categories":4431},[],{"categories":4433},[],{"categories":4435},[],{"categories":4437},[4028],{"categories":4439},[],{"categories":4441},[4028],{"categories":4443},[4028],{"categories":4445},[2344],{"categories":4447},[4028],{"categories":4449},[713],{"categories":4451},[],{"categories":4453},[713],{"categories":4455},[],{"categories":4457},[2344],{"categories":4459},[4028,4460],"Product Strategy",{"categories":4462},[3936],{"categories":4464},[4373],{"categories":4466},[4460],{"categories":4468},[713],{"categories":4470},[4028],{"categories":4472},[],{"categories":4474},[2344],{"categories":4476},[2344],{"categories":4478},[4028],{"categories":4480},[],{"categories":4482},[4028],{"categories":4484},[713],{"categories":4486},[713],{"categories":4488},[2933],{"categories":4490},[713],{"categories":4492},[],{"categories":4494},[713,3936],{"categories":4496},[2344],{"categories":4498},[713],{"categories":4500},[2344],{"categories":4502},[4028],{"categories":4504},[2344],{"categories":4506},[],{"categories":4508},[3936],{"categories":4510},[4019],{"categories":4512},[],{"categories":4514},[4028],{"categories":4516},[4028],{"categories":4518},[4028],{"categories":4520},[4028],{"categories":4522},[4019],{"categories":4524},[60],{"categories":4526},[147],{"categories":4528},[],{"categories":4530},[4028],{"categories":4532},[],{"categories":4534},[2344],{"categories":4536},[2344],{"categories":4538},[2344],{"categories":4540},[4028],{"categories":4542},[2344],{"categories":4544},[713],{"categories":4546},[2933],{"categories":4548},[713],{"categories":4550},[3936],{"categories":4552},[713,2933],{"categories":4554},[2933],{"categories":4556},[2933],{"categories":4558},[2933],{"categories":4560},[2933],{"categories":4562},[713],{"categories":4564},[],{"categories":4566},[],{"categories":4568},[147],{"categories":4570},[],{"categories":4572},[713],{"categories":4574},[2933],{"categories":4576},[713],{"categories":4578},[60],{"categories":4580},[3936],{"categories":4582},[],{"categories":4584},[713],{"categories":4586},[2933],{"categories":4588},[147],{"categories":4590},[2344],{"categories":4592},[3936],{"categories":4594},[713],{"categories":4596},[],{"categories":4598},[3936],{"categories":4600},[60],{"categories":4602},[4019],{"categories":4604},[4019],{"categories":4606},[],{"categories":4608},[60],{"categories":4610},[4019],{"categories":4612},[2344],{"categories":4614},[2933],{"categories":4616},[4028],{"categories":4618},[4028],{"categories":4620},[713],{"categories":4622},[713],{"categories":4624},[2344],{"categories":4626},[2344],{"categories":4628},[2933],{"categories":4630},[2344],{"categories":4632},[],{"categories":4634},[4460],{"categories":4636},[4028],{"categories":4638},[2344],{"categories":4640},[2344],{"categories":4642},[2344],{"categories":4644},[713],{"categories":4646},[4028],{"categories":4648},[4028],{"categories":4650},[4019],{"categories":4652},[4019],{"categories":4654},[713],{"categories":4656},[2344],{"categories":4658},[],{"categories":4660},[713],{"categories":4662},[4019],{"categories":4664},[4028],{"categories":4666},[4028],{"categories":4668},[4028],{"categories":4670},[60],{"categories":4672},[4028],{"categories":4674},[2933],{"categories":4676},[2344],{"categories":4678},[2344],{"categories":4680},[2344],{"categories":4682},[2344],{"categories":4684},[2344],{"categories":4686},[],{"categories":4688},[],{"categories":4690},[2933],{"categories":4692},[2344],{"categories":4694},[2344],{"categories":4696},[2344],{"categories":4698},[],{"categories":4700},[713],{"categories":4702},[],{"categories":4704},[],{"categories":4706},[60],{"categories":4708},[4019],{"categories":4710},[],{"categories":4712},[2344],{"categories":4714},[4028],{"categories":4716},[4028],{"categories":4718},[4028],{"categories":4720},[147],{"categories":4722},[4028],{"categories":4724},[],{"categories":4726},[2344],{"categories":4728},[2344],{"categories":4730},[713],{"categories":4732},[],{"categories":4734},[147],{"categories":4736},[147],{"categories":4738},[713],{"categories":4740},[2344],{"categories":4742},[4019],{"categories":4744},[3936],{"categories":4746},[713],{"categories":4748},[],{"categories":4750},[713],{"categories":4752},[713],{"categories":4754},[3936],{"categories":4756},[713],{"categories":4758},[713],{"categories":4760},[713],{"categories":4762},[147],{"categories":4764},[2344],{"categories":4766},[713],{"categories":4768},[713],{"categories":4770},[2344],{"categories":4772},[4028],{"categories":4774},[2933],{"categories":4776},[4019],{"categories":4778},[713],{"categories":4780},[2933],{"categories":4782},[2933],{"categories":4784},[],{"categories":4786},[147],{"categories":4788},[2344],{"categories":4790},[2344],{"categories":4792},[2933],{"categories":4794},[4028],{"categories":4796},[4028],{"categories":4798},[4028],{"categories":4800},[4028],{"categories":4802},[60],{"categories":4804},[713],{"categories":4806},[713],{"categories":4808},[4460],{"categories":4810},[713],{"categories":4812},[713],{"categories":4814},[4028],{"categories":4816},[4019],{"categories":4818},[147],{"categories":4820},[],{"categories":4822},[4019],{"categories":4824},[4019],{"categories":4826},[],{"categories":4828},[60],{"categories":4830},[713],{"categories":4832},[],{"categories":4834},[],{"categories":4836},[2344],{"categories":4838},[2344],{"categories":4840},[2344],{"categories":4842},[2344],{"categories":4844},[],{"categories":4846},[2344],{"categories":4848},[713],{"categories":4850},[713],{"categories":4852},[],{"categories":4854},[2344],{"categories":4856},[2344],{"categories":4858},[4019],{"categories":4860},[713],{"categories":4862},[],{"categories":4864},[],{"categories":4866},[2344],{"categories":4868},[2344],{"categories":4870},[2344],{"categories":4872},[713],{"categories":4874},[2344],{"categories":4876},[2344],{"categories":4878},[2344],{"categories":4880},[2344],{"categories":4882},[2344],{"categories":4884},[],{"categories":4886},[4028],{"categories":4888},[713],{"categories":4890},[147],{"categories":4892},[4019],{"categories":4894},[4028],{"categories":4896},[713],{"categories":4898},[],{"categories":4900},[147],{"categories":4902},[2344],{"categories":4904},[2344],{"categories":4906},[2344],{"categories":4908},[2344],{"categories":4910},[2933],{"categories":4912},[3936],{"categories":4914},[],{"categories":4916},[713],{"categories":4918},[4028],{"categories":4920},[4028],{"categories":4922},[4028],{"categories":4924},[4373],{"categories":4926},[4028],{"categories":4928},[713],{"categories":4930},[713],{"categories":4932},[3936],{"categories":4934},[4373],{"categories":4936},[440],{"categories":4938},[713],{"categories":4940},[440],{"categories":4942},[],{"categories":4944},[147],{"categories":4946},[147],{"categories":4948},[60],{"categories":4950},[4373],{"categories":4952},[4028],{"categories":4954},[713],{"categories":4956},[713],{"categories":4958},[4028],{"categories":4960},[4028],{"categories":4962},[4028],{"categories":4964},[2933],{"categories":4966},[2933],{"categories":4968},[4028],{"categories":4970},[4028],{"categories":4972},[],{"categories":4974},[4028],{"categories":4976},[4028],{"categories":4978},[713],{"categories":4980},[440],{"categories":4982},[4028],{"categories":4984},[4028],{"categories":4986},[4028],{"categories":4988},[4028],{"categories":4990},[4019],{"categories":4992},[60],{"categories":4994},[2344],{"categories":4996},[3936],{"categories":4998},[4373],{"categories":5000},[3936],{"categories":5002},[440],{"categories":5004},[],{"categories":5006},[3936],{"categories":5008},[],{"categories":5010},[],{"categories":5012},[3936],{"categories":5014},[713],{"categories":5016},[],{"categories":5018},[],{"categories":5020},[],{"categories":5022},[4019],{"categories":5024},[],{"categories":5026},[],{"categories":5028},[440],{"categories":5030},[713],{"categories":5032},[4373],{"categories":5034},[713],{"categories":5036},[],{"categories":5038},[4028],{"categories":5040},[2933],{"categories":5042},[2933],{"categories":5044},[147],{"categories":5046},[147],{"categories":5048},[147],{"categories":5050},[4373],{"categories":5052},[3936],{"categories":5054},[4028],{"categories":5056},[4019],{"categories":5058},[4019],{"categories":5060},[3936],{"categories":5062},[60],{"categories":5064},[440],{"categories":5066},[60],{"categories":5068},[],{"categories":5070},[713],{"categories":5072},[4028],{"categories":5074},[4028],{"categories":5076},[2933],{"categories":5078},[4028],{"categories":5080},[4028],{"categories":5082},[60],{"categories":5084},[60],{"categories":5086},[4028],{"categories":5088},[4373],{"categories":5090},[713],{"categories":5092},[],{"categories":5094},[147],{"categories":5096},[4028],{"categories":5098},[4019],{"categories":5100},[4028],{"categories":5102},[4028],{"categories":5104},[],{"categories":5106},[713],{"categories":5108},[4028],{"categories":5110},[4028],{"categories":5112},[2933],{"categories":5114},[4028],{"categories":5116},[713],{"categories":5118},[],{"categories":5120},[4028],{"categories":5122},[],{"categories":5124},[60],{"categories":5126},[2933],{"categories":5128},[713],{"categories":5130},[3936],{"categories":5132},[60],{"categories":5134},[2933],{"categories":5136},[440],{"categories":5138},[2933],{"categories":5140},[],{"categories":5142},[713],{"categories":5144},[713],{"categories":5146},[4460],{"categories":5148},[3936],{"categories":5150},[713,4028],{"categories":5152},[4028],{"categories":5154},[713],{"categories":5156},[4028],{"categories":5158},[4028,3936],{"categories":5160},[4028],{"categories":5162},[713],{"categories":5164},[],{"categories":5166},[2933],{"categories":5168},[713],{"categories":5170},[4028],{"categories":5172},[713],{"categories":5174},[],{"categories":5176},[3936],{"categories":5178},[4019],{"categories":5180},[4028],{"categories":5182},[],{"categories":5184},[440],{"categories":5186},[3936],{"categories":5188},[4028],{"categories":5190},[3936],{"categories":5192},[],{"categories":5194},[4028],{"categories":5196},[],{"categories":5198},[4028],{"categories":5200},[],{"categories":5202},[],{"categories":5204},[60],{"categories":5206},[2933],{"categories":5208},[713],{"categories":5210},[4028],{"categories":5212},[],{"categories":5214},[4028],{"categories":5216},[3936],{"categories":5218},[713],{"categories":5220},[713],{"categories":5222},[3936],{"categories":5224},[3936],{"categories":5226},[2933],{"categories":5228},[4019],{"categories":5230},[],{"categories":5232},[713],{"categories":5234},[713],{"categories":5236},[713],{"categories":5238},[4028],{"categories":5240},[713],{"categories":5242},[],{"categories":5244},[60],{"categories":5246},[713],{"categories":5248},[4028],{"categories":5250},[],{"categories":5252},[713],{"categories":5254},[],{"categories":5256},[713],{"categories":5258},[],{"categories":5260},[],{"categories":5262},[],{"categories":5264},[713],{"categories":5266},[713],{"categories":5268},[713],{"categories":5270},[713],{"categories":5272},[],{"categories":5274},[713],{"categories":5276},[713],{"categories":5278},[713],{"categories":5280},[],{"categories":5282},[713],{"categories":5284},[],{"categories":5286},[147],{"categories":5288},[713],{"categories":5290},[],{"categories":5292},[],{"categories":5294},[],{"categories":5296},[713],{"categories":5298},[2344],{"categories":5300},[2344],{"categories":5302},[],{"categories":5304},[4028],{"categories":5306},[713],{"categories":5308},[],{"categories":5310},[713],{"categories":5312},[713],{"categories":5314},[2344],{"categories":5316},[],{"categories":5318},[713],{"categories":5320},[2344],{"categories":5322},[4028],{"categories":5324},[713],{"categories":5326},[],{"categories":5328},[],{"categories":5330},[],{"categories":5332},[4028],{"categories":5334},[4028],{"categories":5336},[4028],{"categories":5338},[4028],{"categories":5340},[713],{"categories":5342},[60],{"categories":5344},[60],{"categories":5346},[4028],{"categories":5348},[4028],{"categories":5350},[2933],{"categories":5352},[4460],{"categories":5354},[2933],{"categories":5356},[2933],{"categories":5358},[713],{"categories":5360},[4028],{"categories":5362},[713],{"categories":5364},[2933],{"categories":5366},[713],{"categories":5368},[4028],{"categories":5370},[4028],{"categories":5372},[4028],{"categories":5374},[4028],{"categories":5376},[4028],{"categories":5378},[713],{"categories":5380},[2933],{"categories":5382},[2933],{"categories":5384},[147],{"categories":5386},[4028],{"categories":5388},[],{"categories":5390},[4028],{"categories":5392},[],{"categories":5394},[2344],{"categories":5396},[713],{"categories":5398},[],{"categories":5400},[4019],{"categories":5402},[60],{"categories":5404},[60],{"categories":5406},[4028],{"categories":5408},[4028],{"categories":5410},[713],{"categories":5412},[713],{"categories":5414},[2344],{"categories":5416},[2344],{"categories":5418},[4373],{"categories":5420},[4028],{"categories":5422},[2344],{"categories":5424},[],{"categories":5426},[713],{"categories":5428},[4028],{"categories":5430},[4028],{"categories":5432},[4028],{"categories":5434},[4028],{"categories":5436},[713],{"categories":5438},[713],{"categories":5440},[713],{"categories":5442},[713],{"categories":5444},[4028],{"categories":5446},[4028],{"categories":5448},[4028],{"categories":5450},[4028],{"categories":5452},[],{"categories":5454},[60],{"categories":5456},[713],{"categories":5458},[713],{"categories":5460},[713],{"categories":5462},[],{"categories":5464},[147],{"categories":5466},[],{"categories":5468},[2933],{"categories":5470},[],{"categories":5472},[4028],{"categories":5474},[2933],{"categories":5476},[60],{"categories":5478},[2933],{"categories":5480},[],{"categories":5482},[2933],{"categories":5484},[2933],{"categories":5486},[],{"categories":5488},[60],{"categories":5490},[4028],{"categories":5492},[4028],{"categories":5494},[2933],{"categories":5496},[713],{"categories":5498},[713],{"categories":5500},[],{"categories":5502},[2344],{"categories":5504},[],{"categories":5506},[147],{"categories":5508},[],{"categories":5510},[60],{"categories":5512},[2344],{"categories":5514},[60],{"categories":5516},[60],{"categories":5518},[60],{"categories":5520},[60],{"categories":5522},[60],{"categories":5524},[60],{"categories":5526},[60],{"categories":5528},[60],{"categories":5530},[60],{"categories":5532},[60],{"categories":5534},[],{"categories":5536},[4028],{"categories":5538},[60],{"categories":5540},[713],{"categories":5542},[713],{"categories":5544},[60],{"categories":5546},[60],{"categories":5548},[60],{"categories":5550},[60],{"categories":5552},[60],{"categories":5554},[60],{"categories":5556},[60],{"categories":5558},[713,60],{"categories":5560},[60],{"categories":5562},[60],{"categories":5564},[60],{"categories":5566},[60],{"categories":5568},[],{"categories":5570},[60],{"categories":5572},[60],{"categories":5574},[60],{"categories":5576},[60],{"categories":5578},[60],{"categories":5580},[60],{"categories":5582},[60],{"categories":5584},[60],{"categories":5586},[60],{"categories":5588},[60,713],{"categories":5590},[60],{"categories":5592},[60],{"categories":5594},[],{"categories":5596},[2344],{"categories":5598},[],{"categories":5600},[713],{"categories":5602},[],{"categories":5604},[4028],{"categories":5606},[4373],{"categories":5608},[4460],{"categories":5610},[4028],{"categories":5612},[4028],{"categories":5614},[],{"categories":5616},[4028],{"categories":5618},[],{"categories":5620},[4028],{"categories":5622},[],{"categories":5624},[],{"categories":5626},[713],{"categories":5628},[713],{"categories":5630},[713],{"categories":5632},[2344],{"categories":5634},[2344],{"categories":5636},[2344],{"categories":5638},[2344],{"categories":5640},[],{"categories":5642},[2344],{"categories":5644},[],{"categories":5646},[2344],{"categories":5648},[713],{"categories":5650},[2344],{"categories":5652},[2344],{"categories":5654},[2344],{"categories":5656},[2344],{"categories":5658},[713],{"categories":5660},[2344],{"categories":5662},[4028],{"categories":5664},[],{"categories":5666},[4028],{"categories":5668},[2344],{"categories":5670},[713],{"categories":5672},[2344],{"categories":5674},[2344],{"categories":5676},[2344],{"categories":5678},[713],{"categories":5680},[713],{"categories":5682},[713],{"categories":5684},[],{"categories":5686},[],{"categories":5688},[713],{"categories":5690},[2344],{"categories":5692},[],{"categories":5694},[713],{"categories":5696},[4028],{"categories":5698},[713],{"categories":5700},[4028],{"categories":5702},[4028],{"categories":5704},[713],{"categories":5706},[],{"categories":5708},[],{"categories":5710},[4028],{"categories":5712},[4028],{"categories":5714},[4028],{"categories":5716},[4028],{"categories":5718},[4028],{"categories":5720},[4028],{"categories":5722},[4028],{"categories":5724},[4028],{"categories":5726},[],{"categories":5728},[4028],{"categories":5730},[4028],{"categories":5732},[4028],{"categories":5734},[713],{"categories":5736},[713],{"categories":5738},[713],{"categories":5740},[2344],{"categories":5742},[713],{"categories":5744},[713],{"categories":5746},[713],{"categories":5748},[4028],{"categories":5750},[147],{"categories":5752},[147],{"categories":5754},[147],{"categories":5756},[4028],{"categories":5758},[],{"categories":5760},[713],{"categories":5762},[],{"categories":5764},[],{"categories":5766},[713],{"categories":5768},[],{"categories":5770},[4028],{"categories":5772},[60],{"categories":5774},[2933],{"categories":5776},[440],{"categories":5778},[713],{"categories":5780},[4028],{"categories":5782},[60],{"categories":5784},[],{"categories":5786},[4028],{"categories":5788},[147,4019],{"categories":5790},[4028],{"categories":5792},[4028],{"categories":5794},[4373],{"categories":5796},[3936],{"categories":5798},[147],{"categories":5800},[2933],{"categories":5802},[713],{"categories":5804},[],{"categories":5806},[713],{"categories":5808},[],{"categories":5810},[713],{"categories":5812},[713],{"categories":5814},[4028],{"categories":5816},[],{"categories":5818},[713],{"categories":5820},[4028],{"categories":5822},[713],{"categories":5824},[2933],{"categories":5826},[4028],{"categories":5828},[713],{"categories":5830},[713,2933],{"categories":5832},[2933],{"categories":5834},[],{"categories":5836},[713],{"categories":5838},[713],{"categories":5840},[713],{"categories":5842},[],{"categories":5844},[],{"categories":5846},[4028],{"categories":5848},[147],{"categories":5850},[2344],{"categories":5852},[4028],{"categories":5854},[713],{"categories":5856},[2344],{"categories":5858},[],{"categories":5860},[2933],{"categories":5862},[2344],{"categories":5864},[],{"categories":5866},[440],{"categories":5868},[147],{"categories":5870},[4019],{"categories":5872},[2344],{"categories":5874},[713],{"categories":5876},[4028],{"categories":5878},[713],{"categories":5880},[4028],{"categories":5882},[4028],{"categories":5884},[2344],{"categories":5886},[2933],{"categories":5888},[60],{"categories":5890},[4019],{"categories":5892},[713],{"categories":5894},[713],{"categories":5896},[],{"categories":5898},[],{"categories":5900},[713],{"categories":5902},[],{"categories":5904},[713],{"categories":5906},[2344],{"categories":5908},[],{"categories":5910},[4028],{"categories":5912},[2933],{"categories":5914},[2344],{"categories":5916},[2933],{"categories":5918},[4028],{"categories":5920},[713],{"categories":5922},[],{"categories":5924},[4028],{"categories":5926},[4028],{"categories":5928},[60],{"categories":5930},[4028],{"categories":5932},[60],{"categories":5934},[4028],{"categories":5936},[4028],{"categories":5938},[60],{"categories":5940},[],{"categories":5942},[],{"categories":5944},[60],{"categories":5946},[60],{"categories":5948},[60],{"categories":5950},[3936],{"categories":5952},[2933],{"categories":5954},[2933],{"categories":5956},[4028],{"categories":5958},[2344],{"categories":5960},[2933],{"categories":5962},[2933],{"categories":5964},[147],{"categories":5966},[60],{"categories":5968},[4028],{"categories":5970},[4028],{"categories":5972},[713],{"categories":5974},[2933],{"categories":5976},[713],{"categories":5978},[],{"categories":5980},[4373],{"categories":5982},[4460],{"categories":5984},[],{"categories":5986},[],{"categories":5988},[4028],{"categories":5990},[2344],{"categories":5992},[147],{"categories":5994},[147],{"categories":5996},[440],{"categories":5998},[60],{"categories":6000},[440],{"categories":6002},[440],{"categories":6004},[4028],{"categories":6006},[],{"categories":6008},[],{"categories":6010},[440],{"categories":6012},[3936],{"categories":6014},[713],{"categories":6016},[3936],{"categories":6018},[440],{"categories":6020},[3936],{"categories":6022},[440],{"categories":6024},[4019],{"categories":6026},[3936],{"categories":6028},[2933],{"categories":6030},[713],{"categories":6032},[],{"categories":6034},[440],{"categories":6036},[4373],{"categories":6038},[],{"categories":6040},[713],{"categories":6042},[713],{"categories":6044},[],{"categories":6046},[],{"categories":6048},[713],{"categories":6050},[713],{"categories":6052},[2344],{"categories":6054},[713],{"categories":6056},[],{"categories":6058},[2344],{"categories":6060},[],{"categories":6062},[],{"categories":6064},[2344],{"categories":6066},[2344],{"categories":6068},[713],{"categories":6070},[713],{"categories":6072},[713],{"categories":6074},[713],{"categories":6076},[713],{"categories":6078},[713],{"categories":6080},[147],{"categories":6082},[],{"categories":6084},[713],{"categories":6086},[],{"categories":6088},[],{"categories":6090},[4028],{"categories":6092},[2933],{"categories":6094},[],{"categories":6096},[4373],{"categories":6098},[713,4373],{"categories":6100},[713],{"categories":6102},[],{"categories":6104},[60],{"categories":6106},[60],{"categories":6108},[60],{"categories":6110},[60],{"categories":6112},[60],{"categories":6114},[],{"categories":6116},[],{"categories":6118},[],{"categories":6120},[3936],{"categories":6122},[4028],{"categories":6124},[4019],{"categories":6126},[3936],{"categories":6128},[2933],{"categories":6130},[60],{"categories":6132},[],{"categories":6134},[147],{"categories":6136},[4460],{"categories":6138},[440],{"categories":6140},[440],{"categories":6142},[440],{"categories":6144},[2933],{"categories":6146},[4460],{"categories":6148},[2933],{"categories":6150},[],{"categories":6152},[4019],{"categories":6154},[3936],{"categories":6156},[713],{"categories":6158},[60],{"categories":6160},[147],{"categories":6162},[3936],{"categories":6164},[147],{"categories":6166},[713],{"categories":6168},[60],{"categories":6170},[3936],{"categories":6172},[4373],{"categories":6174},[713],{"categories":6176},[2344],{"categories":6178},[3936],{"categories":6180},[],{"categories":6182},[713],{"categories":6184},[3936],{"categories":6186},[3936],{"categories":6188},[4028],{"categories":6190},[],{"categories":6192},[147],{"categories":6194},[147],{"categories":6196},[147],{"categories":6198},[4028],{"categories":6200},[713],{"categories":6202},[],{"categories":6204},[4019],{"categories":6206},[2933],{"categories":6208},[2933],{"categories":6210},[440],{"categories":6212},[4019],{"categories":6214},[2344],{"categories":6216},[440],{"categories":6218},[],{"categories":6220},[2344],{"categories":6222},[2344],{"categories":6224},[2344],{"categories":6226},[713],{"categories":6228},[4019],{"categories":6230},[713],{"categories":6232},[],{"categories":6234},[],{"categories":6236},[],{"categories":6238},[3936],{"categories":6240},[4028],{"categories":6242},[],{"categories":6244},[2933],{"categories":6246},[60],{"categories":6248},[],{"categories":6250},[147],{"categories":6252},[],{"categories":6254},[60],{"categories":6256},[713],{"categories":6258},[2933],{"categories":6260},[4019],{"categories":6262},[],{"categories":6264},[60],{"categories":6266},[60],{"categories":6268},[713],{"categories":6270},[],{"categories":6272},[],{"categories":6274},[3936],{"categories":6276},[713],{"categories":6278},[],{"categories":6280},[4028],{"categories":6282},[713],{"categories":6284},[],{"categories":6286},[3936],{"categories":6288},[4028],{"categories":6290},[713],{"categories":6292},[440],{"categories":6294},[713],{"categories":6296},[],{"categories":6298},[440],{"categories":6300},[713],{"categories":6302},[3936],{"categories":6304},[713],{"categories":6306},[440],{"categories":6308},[4028],{"categories":6310},[713],{"categories":6312},[713],{"categories":6314},[713,4028],{"categories":6316},[4028],{"categories":6318},[4028],{"categories":6320},[4028],{"categories":6322},[60],{"categories":6324},[2933],{"categories":6326},[713],{"categories":6328},[2933],{"categories":6330},[60],{"categories":6332},[713],{"categories":6334},[],{"categories":6336},[],{"categories":6338},[713],{"categories":6340},[713],{"categories":6342},[713],{"categories":6344},[4028],{"categories":6346},[713],{"categories":6348},[],{"categories":6350},[713],{"categories":6352},[713],{"categories":6354},[4028],{"categories":6356},[4028],{"categories":6358},[713],{"categories":6360},[713],{"categories":6362},[],{"categories":6364},[713],{"categories":6366},[],{"categories":6368},[713],{"categories":6370},[713],{"categories":6372},[713],{"categories":6374},[713],{"categories":6376},[713],{"categories":6378},[713],{"categories":6380},[713],{"categories":6382},[],{"categories":6384},[713],{"categories":6386},[2344],{"categories":6388},[2344],{"categories":6390},[],{"categories":6392},[],{"categories":6394},[713],{"categories":6396},[],{"categories":6398},[713],{"categories":6400},[713,4373],{"categories":6402},[],{"categories":6404},[2344],{"categories":6406},[],{"categories":6408},[713],{"categories":6410},[],{"categories":6412},[],{"categories":6414},[],{"categories":6416},[713],{"categories":6418},[],{"categories":6420},[713],{"categories":6422},[],{"categories":6424},[713],{"categories":6426},[713],{"categories":6428},[],{"categories":6430},[],{"categories":6432},[713,4373],{"categories":6434},[4373,713],{"categories":6436},[2344],{"categories":6438},[],{"categories":6440},[713],{"categories":6442},[],{"categories":6444},[713],{"categories":6446},[713],{"categories":6448},[],{"categories":6450},[2344],{"categories":6452},[713,4019],{"categories":6454},[2344],{"categories":6456},[3936],{"categories":6458},[],{"categories":6460},[4028],{"categories":6462},[713],{"categories":6464},[147],{"categories":6466},[713],{"categories":6468},[2933],{"categories":6470},[2933],{"categories":6472},[4373],{"categories":6474},[2344],{"categories":6476},[713],{"categories":6478},[4373],{"categories":6480},[3936],{"categories":6482},[713],{"categories":6484},[2933],{"categories":6486},[],{"categories":6488},[713],{"categories":6490},[],{"categories":6492},[],{"categories":6494},[713],{"categories":6496},[],{"categories":6498},[713],{"categories":6500},[3936],{"categories":6502},[4019],{"categories":6504},[2933],{"categories":6506},[147],{"categories":6508},[4028],{"categories":6510},[2933],{"categories":6512},[],{"categories":6514},[147],{"categories":6516},[],{"categories":6518},[],{"categories":6520},[713],{"categories":6522},[2344],{"categories":6524},[147],{"categories":6526},[],{"categories":6528},[713],{"categories":6530},[2344],{"categories":6532},[2344],{"categories":6534},[147],{"categories":6536},[2344],{"categories":6538},[713],{"categories":6540},[2344],{"categories":6542},[713],{"categories":6544},[],{"categories":6546},[713],{"categories":6548},[713],{"categories":6550},[713],{"categories":6552},[2344],{"categories":6554},[],{"categories":6556},[],{"categories":6558},[60],{"categories":6560},[2344],{"categories":6562},[],{"categories":6564},[713],{"categories":6566},[713],{"categories":6568},[713],{"categories":6570},[713],{"categories":6572},[713],{"categories":6574},[713],{"categories":6576},[713],{"categories":6578},[713],{"categories":6580},[713],{"categories":6582},[147],{"categories":6584},[713,60],{"categories":6586},[2344],{"categories":6588},[2344],{"categories":6590},[713],{"categories":6592},[3936],{"categories":6594},[440],{"categories":6596},[713],{"categories":6598},[713],{"categories":6600},[],{"categories":6602},[],{"categories":6604},[713],{"categories":6606},[713],{"categories":6608},[],{"categories":6610},[60],{"categories":6612},[60],{"categories":6614},[2933],{"categories":6616},[713],{"categories":6618},[2933],{"categories":6620},[713],{"categories":6622},[713],{"categories":6624},[],{"categories":6626},[713],{"categories":6628},[],{"categories":6630},[],{"categories":6632},[713],{"categories":6634},[],{"categories":6636},[],{"categories":6638},[2344],{"categories":6640},[],{"categories":6642},[713],{"categories":6644},[713],{"categories":6646},[713],{"categories":6648},[],{"categories":6650},[713],{"categories":6652},[2344],{"categories":6654},[4460],{"categories":6656},[4028],{"categories":6658},[713],{"categories":6660},[],{"categories":6662},[4028],{"categories":6664},[713],{"categories":6666},[],{"categories":6668},[713],{"categories":6670},[],{"categories":6672},[4028],{"categories":6674},[],{"categories":6676},[],{"categories":6678},[4028],{"categories":6680},[4028],{"categories":6682},[4028],{"categories":6684},[713],{"categories":6686},[],{"categories":6688},[4028],{"categories":6690},[4028],{"categories":6692},[],{"categories":6694},[],{"categories":6696},[4028],{"categories":6698},[713],{"categories":6700},[2344],{"categories":6702},[4460],{"categories":6704},[147],{"categories":6706},[],{"categories":6708},[60],{"categories":6710},[713],{"categories":6712},[713],{"categories":6714},[4019],{"categories":6716},[2344],{"categories":6718},[2344],{"categories":6720},[2344],{"categories":6722},[2344],{"categories":6724},[],{"categories":6726},[4028],{"categories":6728},[4028],{"categories":6730},[4028],{"categories":6732},[4028],{"categories":6734},[2933],{"categories":6736},[713],{"categories":6738},[4019],{"categories":6740},[],{"categories":6742},[2933],{"categories":6744},[4028],{"categories":6746},[60],{"categories":6748},[60],{"categories":6750},[60],{"categories":6752},[60],{"categories":6754},[60],{"categories":6756},[60],{"categories":6758},[713,4019],{"categories":6760},[4028],{"categories":6762},[4019],{"categories":6764},[2344],{"categories":6766},[2344],{"categories":6768},[2933],{"categories":6770},[],{"categories":6772},[],{"categories":6774},[147],{"categories":6776},[],{"categories":6778},[713],{"categories":6780},[147],{"categories":6782},[713],{"categories":6784},[3936],{"categories":6786},[4028],{"categories":6788},[4019],{"categories":6790},[4028],{"categories":6792},[3936],{"categories":6794},[2933],{"categories":6796},[4028],{"categories":6798},[],{"categories":6800},[2933],{"categories":6802},[],{"categories":6804},[],{"categories":6806},[4028],{"categories":6808},[4028],{"categories":6810},[4028],{"categories":6812},[713],{"categories":6814},[713],{"categories":6816},[713],{"categories":6818},[713],{"categories":6820},[713],{"categories":6822},[],{"categories":6824},[4373],{"categories":6826},[713],{"categories":6828},[],{"categories":6830},[],{"categories":6832},[],{"categories":6834},[2933],{"categories":6836},[],{"categories":6838},[713],{"categories":6840},[],{"categories":6842},[2344],{"categories":6844},[713],{"categories":6846},[2344],{"categories":6848},[713],{"categories":6850},[4028],{"categories":6852},[],{"categories":6854},[713],{"categories":6856},[713],{"categories":6858},[],{"categories":6860},[440],{"categories":6862},[440],{"categories":6864},[3936],{"categories":6866},[60],{"categories":6868},[],{"categories":6870},[713],{"categories":6872},[4028],{"categories":6874},[],{"categories":6876},[],{"categories":6878},[713],{"categories":6880},[3936],{"categories":6882},[4028],{"categories":6884},[4019],{"categories":6886},[2933,3936],{"categories":6888},[3936],{"categories":6890},[713],{"categories":6892},[4028],{"categories":6894},[],{"categories":6896},[],{"categories":6898},[],{"categories":6900},[],{"categories":6902},[],{"categories":6904},[],{"categories":6906},[713],{"categories":6908},[],{"categories":6910},[],{"categories":6912},[713],{"categories":6914},[],{"categories":6916},[],{"categories":6918},[],{"categories":6920},[713],{"categories":6922},[2344],{"categories":6924},[],{"categories":6926},[],{"categories":6928},[],{"categories":6930},[713],{"categories":6932},[],{"categories":6934},[713],{"categories":6936},[713],{"categories":6938},[],{"categories":6940},[713],{"categories":6942},[3936],{"categories":6944},[],{"categories":6946},[2933],{"categories":6948},[2933],{"categories":6950},[],{"categories":6952},[147],{"categories":6954},[],{"categories":6956},[],{"categories":6958},[],{"categories":6960},[60],{"categories":6962},[2344],{"categories":6964},[4028],{"categories":6966},[713],{"categories":6968},[4019],{"categories":6970},[713],{"categories":6972},[],{"categories":6974},[],{"categories":6976},[4019],{"categories":6978},[147],{"categories":6980},[4028],{"categories":6982},[],{"categories":6984},[4373],{"categories":6986},[],{"categories":6988},[147],{"categories":6990},[713],{"categories":6992},[713],{"categories":6994},[147],{"categories":6996},[713],{"categories":6998},[60],{"categories":7000},[4028],{"categories":7002},[713],{"categories":7004},[4028],{"categories":7006},[713],{"categories":7008},[4028],{"categories":7010},[2933],{"categories":7012},[2933],{"categories":7014},[60],{"categories":7016},[],{"categories":7018},[713],{"categories":7020},[713],{"categories":7022},[147],{"categories":7024},[4460],{"categories":7026},[2933],{"categories":7028},[2344],{"categories":7030},[713],{"categories":7032},[2344],{"categories":7034},[713],{"categories":7036},[713],{"categories":7038},[],{"categories":7040},[713],{"categories":7042},[],{"categories":7044},[713],{"categories":7046},[147],{"categories":7048},[713],{"categories":7050},[713],{"categories":7052},[713],{"categories":7054},[],{"categories":7056},[713],{"categories":7058},[713],{"categories":7060},[4460],{"categories":7062},[],{"categories":7064},[2344],{"categories":7066},[4373],{"categories":7068},[3936],{"categories":7070},[],{"categories":7072},[440],{"categories":7074},[],{"categories":7076},[],{"categories":7078},[2344],{"categories":7080},[713],{"categories":7082},[],{"categories":7084},[713],{"categories":7086},[713],{"categories":7088},[4028],{"categories":7090},[713],{"categories":7092},[2344],{"categories":7094},[2344],{"categories":7096},[60],{"categories":7098},[60],{"categories":7100},[60],{"categories":7102},[713],{"categories":7104},[440],{"categories":7106},[2344],{"categories":7108},[2933],{"categories":7110},[],{"categories":7112},[60],{"categories":7114},[60],{"categories":7116},[4373],{"categories":7118},[60],{"categories":7120},[60],{"categories":7122},[4028],{"categories":7124},[2344],{"categories":7126},[4373],{"categories":7128},[713],{"categories":7130},[713],{"categories":7132},[713],{"categories":7134},[713],{"categories":7136},[],{"categories":7138},[4028],{"categories":7140},[713],{"categories":7142},[60],{"categories":7144},[],{"categories":7146},[],{"categories":7148},[2344],{"categories":7150},[],{"categories":7152},[4028],{"categories":7154},[4028],{"categories":7156},[4028],{"categories":7158},[4028],{"categories":7160},[4028],{"categories":7162},[4028],{"categories":7164},[4028],{"categories":7166},[4028],{"categories":7168},[],{"categories":7170},[],{"categories":7172},[713],{"categories":7174},[],{"categories":7176},[4028],{"categories":7178},[2933],{"categories":7180},[2933],{"categories":7182},[440],{"categories":7184},[4019],{"categories":7186},[],{"categories":7188},[],{"categories":7190},[],{"categories":7192},[60],{"categories":7194},[713],{"categories":7196},[],{"categories":7198},[4019],{"categories":7200},[4019],{"categories":7202},[60],{"categories":7204},[2933],{"categories":7206},[440],{"categories":7208},[60],{"categories":7210},[60],{"categories":7212},[],{"categories":7214},[4028],{"categories":7216},[4019],{"categories":7218},[4019],{"categories":7220},[713],{"categories":7222},[4028],{"categories":7224},[3936],{"categories":7226},[60],{"categories":7228},[],{"categories":7230},[147],{"categories":7232},[440],{"categories":7234},[2344],{"categories":7236},[2344],{"categories":7238},[2344],{"categories":7240},[4373],{"categories":7242},[],{"categories":7244},[4028],{"categories":7246},[],{"categories":7248},[4028],{"categories":7250},[4028],{"categories":7252},[713],{"categories":7254},[713],{"categories":7256},[3936],{"categories":7258},[4028],{"categories":7260},[3936],{"categories":7262},[],{"categories":7264},[4028],{"categories":7266},[60],{"categories":7268},[60],{"categories":7270},[60],{"categories":7272},[713],{"categories":7274},[4028],{"categories":7276},[713],{"categories":7278},[4019],{"categories":7280},[2344],{"categories":7282},[60],{"categories":7284},[2344],{"categories":7286},[713],{"categories":7288},[],{"categories":7290},[2344],{"categories":7292},[4028],{"categories":7294},[2344],{"categories":7296},[2344],{"categories":7298},[2344],{"categories":7300},[2344],{"categories":7302},[],{"categories":7304},[],{"categories":7306},[2344],{"categories":7308},[2344],{"categories":7310},[],{"categories":7312},[2344],{"categories":7314},[2344],{"categories":7316},[713],{"categories":7318},[713],{"categories":7320},[2344],{"categories":7322},[2344],{"categories":7324},[713],{"categories":7326},[],{"categories":7328},[713],{"categories":7330},[4028],{"categories":7332},[713],{"categories":7334},[713],{"categories":7336},[],{"categories":7338},[713],{"categories":7340},[713],{"categories":7342},[713],{"categories":7344},[2344],{"categories":7346},[],{"categories":7348},[],{"categories":7350},[],{"categories":7352},[],{"categories":7354},[713],{"categories":7356},[713],{"categories":7358},[],{"categories":7360},[147],{"categories":7362},[2344],{"categories":7364},[],{"categories":7366},[],{"categories":7368},[],{"categories":7370},[],{"categories":7372},[],{"categories":7374},[713],{"categories":7376},[],{"categories":7378},[],{"categories":7380},[713],{"categories":7382},[],{"categories":7384},[4028],{"categories":7386},[4028],{"categories":7388},[4028],{"categories":7390},[4019],{"categories":7392},[],{"categories":7394},[147],{"categories":7396},[3936],{"categories":7398},[3936],{"categories":7400},[4373],{"categories":7402},[2344],{"categories":7404},[],{"categories":7406},[713],{"categories":7408},[713],{"categories":7410},[4019],{"categories":7412},[],{"categories":7414},[4019],{"categories":7416},[],{"categories":7418},[],{"categories":7420},[],{"categories":7422},[3936],{"categories":7424},[4028],{"categories":7426},[4028],{"categories":7428},[4028],{"categories":7430},[4028],{"categories":7432},[4028],{"categories":7434},[],{"categories":7436},[2344],{"categories":7438},[713],{"categories":7440},[713],{"categories":7442},[713],{"categories":7444},[],{"categories":7446},[4019],{"categories":7448},[],{"categories":7450},[60],{"categories":7452},[440],{"categories":7454},[60],{"categories":7456},[],{"categories":7458},[],{"categories":7460},[713],{"categories":7462},[4028],{"categories":7464},[],{"categories":7466},[713],{"categories":7468},[713],{"categories":7470},[713],{"categories":7472},[4028],{"categories":7474},[4028],{"categories":7476},[713],{"categories":7478},[440],{"categories":7480},[4028],{"categories":7482},[],{"categories":7484},[713],{"categories":7486},[],{"categories":7488},[4460],{"categories":7490},[3936],{"categories":7492},[440],{"categories":7494},[3936],{"categories":7496},[4373],{"categories":7498},[713],{"categories":7500},[3936],{"categories":7502},[2344],{"categories":7504},[4373],{"categories":7506},[3936],{"categories":7508},[60],{"categories":7510},[60],{"categories":7512},[],{"categories":7514},[3936],{"categories":7516},[],{"categories":7518},[2933],{"categories":7520},[3936],{"categories":7522},[],{"categories":7524},[440],{"categories":7526},[440],{"categories":7528},[4460],{"categories":7530},[],{"categories":7532},[713],{"categories":7534},[3936],{"categories":7536},[4373],{"categories":7538},[4028],{"categories":7540},[4028],{"categories":7542},[440],{"categories":7544},[713],{"categories":7546},[2933],{"categories":7548},[713],{"categories":7550},[],{"categories":7552},[],{"categories":7554},[],{"categories":7556},[147],{"categories":7558},[713],{"categories":7560},[60],{"categories":7562},[3936],{"categories":7564},[3936],{"categories":7566},[713],{"categories":7568},[147],{"categories":7570},[2933],{"categories":7572},[713],{"categories":7574},[3936],{"categories":7576},[713],{"categories":7578},[3936],{"categories":7580},[2933],{"categories":7582},[2933],{"categories":7584},[4028],{"categories":7586},[2933],{"categories":7588},[3936],{"categories":7590},[4019],{"categories":7592},[3936],{"categories":7594},[3936],{"categories":7596},[3936],{"categories":7598},[3936],{"categories":7600},[],{"categories":7602},[2344],{"categories":7604},[],{"categories":7606},[440],{"categories":7608},[713],{"categories":7610},[713],{"categories":7612},[],{"categories":7614},[],{"categories":7616},[],{"categories":7618},[713],{"categories":7620},[2344],{"categories":7622},[713],{"categories":7624},[713],{"categories":7626},[],{"categories":7628},[713],{"categories":7630},[60],{"categories":7632},[713],{"categories":7634},[713],{"categories":7636},[713],{"categories":7638},[],{"categories":7640},[],{"categories":7642},[],{"categories":7644},[4373],{"categories":7646},[4373],{"categories":7648},[4019],{"categories":7650},[4028],{"categories":7652},[4019,147],{"categories":7654},[713],{"categories":7656},[2344],{"categories":7658},[],{"categories":7660},[60],{"categories":7662},[440],{"categories":7664},[713],{"categories":7666},[3936],{"categories":7668},[713],{"categories":7670},[],{"categories":7672},[440],{"categories":7674},[4373],{"categories":7676},[4028],{"categories":7678},[4019],{"categories":7680},[4373],{"categories":7682},[4028],{"categories":7684},[2933],{"categories":7686},[4028],{"categories":7688},[2933],{"categories":7690},[713],{"categories":7692},[2933],{"categories":7694},[2933],{"categories":7696},[3936],{"categories":7698},[440],{"categories":7700},[713],{"categories":7702},[147],{"categories":7704},[],{"categories":7706},[713],{"categories":7708},[60],{"categories":7710},[440],{"categories":7712},[4019],{"categories":7714},[713],{"categories":7716},[440],{"categories":7718},[2933],{"categories":7720},[713],{"categories":7722},[713],{"categories":7724},[440],{"categories":7726},[713],{"categories":7728},[2933],{"categories":7730},[713],{"categories":7732},[],{"categories":7734},[713],{"categories":7736},[713],{"categories":7738},[713],{"categories":7740},[713],{"categories":7742},[],{"categories":7744},[4028],{"categories":7746},[4373],{"categories":7748},[],{"categories":7750},[],{"categories":7752},[713],{"categories":7754},[4019],{"categories":7756},[147],{"categories":7758},[4019],{"categories":7760},[4019],{"categories":7762},[4028],{"categories":7764},[],{"categories":7766},[713],{"categories":7768},[2344],{"categories":7770},[713],{"categories":7772},[713],{"categories":7774},[],{"categories":7776},[4028],{"categories":7778},[2344],{"categories":7780},[713,4373],{"categories":7782},[4028,4373],{"categories":7784},[4373],{"categories":7786},[713],{"categories":7788},[4028],{"categories":7790},[4028],{"categories":7792},[3936],{"categories":7794},[3936],{"categories":7796},[3936],{"categories":7798},[713],{"categories":7800},[60],{"categories":7802},[4028],{"categories":7804},[],{"categories":7806},[4373],{"categories":7808},[],{"categories":7810},[4373],{"categories":7812},[4373],{"categories":7814},[4019],{"categories":7816},[4028],{"categories":7818},[],{"categories":7820},[4373],{"categories":7822},[713],{"categories":7824},[2344],{"categories":7826},[713],{"categories":7828},[60],{"categories":7830},[3936],{"categories":7832},[3936],{"categories":7834},[3936],{"categories":7836},[4373],{"categories":7838},[],{"categories":7840},[],{"categories":7842},[],{"categories":7844},[713],{"categories":7846},[3936],{"categories":7848},[713],{"categories":7850},[3936],{"categories":7852},[4373],{"categories":7854},[4373],{"categories":7856},[713],{"categories":7858},[4028],{"categories":7860},[],{"categories":7862},[713],{"categories":7864},[713],{"categories":7866},[713],{"categories":7868},[],{"categories":7870},[],{"categories":7872},[4373],{"categories":7874},[4373],{"categories":7876},[713,4373],{"categories":7878},[4028],{"categories":7880},[4028],{"categories":7882},[4028],{"categories":7884},[4028],{"categories":7886},[4028],{"categories":7888},[4028],{"categories":7890},[],{"categories":7892},[3936],{"categories":7894},[713],{"categories":7896},[3936],{"categories":7898},[147],{"categories":7900},[713],{"categories":7902},[4460],{"categories":7904},[4460],{"categories":7906},[4028],{"categories":7908},[3936],{"categories":7910},[],{"categories":7912},[4028],{"categories":7914},[713],{"categories":7916},[],{"categories":7918},[60],{"categories":7920},[],{"categories":7922},[713],{"categories":7924},[4028],{"categories":7926},[2344],{"categories":7928},[713],{"categories":7930},[],{"categories":7932},[],{"categories":7934},[60],{"categories":7936},[60],{"categories":7938},[2933],{"categories":7940},[60],{"categories":7942},[4028],{"categories":7944},[],{"categories":7946},[4028],{"categories":7948},[2344],{"categories":7950},[713],{"categories":7952},[713],{"categories":7954},[],{"categories":7956},[713],{"categories":7958},[2933],{"categories":7960},[713],{"categories":7962},[],{"categories":7964},[440],{"categories":7966},[3936],{"categories":7968},[3936],{"categories":7970},[4019],{"categories":7972},[4019],{"categories":7974},[4019],{"categories":7976},[4028],{"categories":7978},[4019],{"categories":7980},[4028],{"categories":7982},[4373],{"categories":7984},[4460],{"categories":7986},[2344],{"categories":7988},[2344],{"categories":7990},[2344],{"categories":7992},[4373],{"categories":7994},[2344,4019],{"categories":7996},[440],{"categories":7998},[4028],{"categories":8000},[],{"categories":8002},[713],{"categories":8004},[],{"categories":8006},[3936],{"categories":8008},[440],{"categories":8010},[60],{"categories":8012},[3936],{"categories":8014},[2933],{"categories":8016},[],{"categories":8018},[4028],{"categories":8020},[],{"categories":8022},[4460],{"categories":8024},[],{"categories":8026},[60],{"categories":8028},[60],{"categories":8030},[440],{"categories":8032},[],{"categories":8034},[713],{"categories":8036},[440],{"categories":8038},[],{"categories":8040},[713],{"categories":8042},[713],{"categories":8044},[],{"categories":8046},[2933],{"categories":8048},[713],{"categories":8050},[],{"categories":8052},[713],{"categories":8054},[],{"categories":8056},[],{"categories":8058},[4028],{"categories":8060},[4028],{"categories":8062},[],{"categories":8064},[3936],{"categories":8066},[3936],{"categories":8068},[3936],{"categories":8070},[713,4028],{"categories":8072},[4028],{"categories":8074},[4028],{"categories":8076},[4028],{"categories":8078},[440],{"categories":8080},[440],{"categories":8082},[],{"categories":8084},[2344],{"categories":8086},[713],{"categories":8088},[440],{"categories":8090},[440],{"categories":8092},[2344],{"categories":8094},[4019],{"categories":8096},[4028],{"categories":8098},[3936],{"categories":8100},[713],{"categories":8102},[713],{"categories":8104},[4028],{"categories":8106},[3936],{"categories":8108},[4028],{"categories":8110},[713],{"categories":8112},[147],{"categories":8114},[],{"categories":8116},[713],{"categories":8118},[],{"categories":8120},[713],{"categories":8122},[713],{"categories":8124},[3936],{"categories":8126},[],{"categories":8128},[440],{"categories":8130},[713],{"categories":8132},[4028],{"categories":8134},[4028],{"categories":8136},[3936],{"categories":8138},[2933],{"categories":8140},[2933],{"categories":8142},[2344],{"categories":8144},[713],{"categories":8146},[4028],{"categories":8148},[],{"categories":8150},[4028],{"categories":8152},[713],{"categories":8154},[2344],{"categories":8156},[713],{"categories":8158},[713],{"categories":8160},[713],{"categories":8162},[4028],{"categories":8164},[440],{"categories":8166},[713],{"categories":8168},[60],{"categories":8170},[713],{"categories":8172},[713],{"categories":8174},[713],{"categories":8176},[713],{"categories":8178},[],{"categories":8180},[713],{"categories":8182},[440],{"categories":8184},[60],{"categories":8186},[713],{"categories":8188},[60],{"categories":8190},[],{"categories":8192},[],{"categories":8194},[],{"categories":8196},[713],{"categories":8198},[],{"categories":8200},[],{"categories":8202},[],{"categories":8204},[],{"categories":8206},[4028],{"categories":8208},[2933],{"categories":8210},[4028],{"categories":8212},[4028],{"categories":8214},[3936],{"categories":8216},[4019],{"categories":8218},[713],{"categories":8220},[713],{"categories":8222},[713],{"categories":8224},[4019],{"categories":8226},[2933],{"categories":8228},[],{"categories":8230},[440],{"categories":8232},[147],{"categories":8234},[713],{"categories":8236},[60],{"categories":8238},[2933],{"categories":8240},[2933],{"categories":8242},[4460],{"categories":8244},[4028],{"categories":8246},[713],{"categories":8248},[713],{"categories":8250},[2933],{"categories":8252},[713],{"categories":8254},[],{"categories":8256},[],{"categories":8258},[4373],{"categories":8260},[60],{"categories":8262},[2933],{"categories":8264},[713],{"categories":8266},[2344],{"categories":8268},[2933],{"categories":8270},[4019],{"categories":8272},[4028],{"categories":8274},[4028],{"categories":8276},[2344],{"categories":8278},[713],{"categories":8280},[],{"categories":8282},[],{"categories":8284},[],{"categories":8286},[713],{"categories":8288},[],{"categories":8290},[2344],{"categories":8292},[],{"categories":8294},[713],{"categories":8296},[],{"categories":8298},[2344],{"categories":8300},[4028],{"categories":8302},[713],{"categories":8304},[4373],{"categories":8306},[713],{"categories":8308},[2933],{"categories":8310},[713],{"categories":8312},[2933],{"categories":8314},[2933],{"categories":8316},[],{"categories":8318},[],{"categories":8320},[2933],{"categories":8322},[2933],{"categories":8324},[2933],{"categories":8326},[],{"categories":8328},[2933],{"categories":8330},[4028],{"categories":8332},[4028],{"categories":8334},[],{"categories":8336},[713],{"categories":8338},[147],{"categories":8340},[440],{"categories":8342},[713],{"categories":8344},[],{"categories":8346},[2933],{"categories":8348},[713],{"categories":8350},[4460],{"categories":8352},[2933],{"categories":8354},[2933],{"categories":8356},[147],{"categories":8358},[3936],{"categories":8360},[3936],{"categories":8362},[],{"categories":8364},[3936],{"categories":8366},[713],{"categories":8368},[],{"categories":8370},[],{"categories":8372},[4028],{"categories":8374},[],{"categories":8376},[4028],{"categories":8378},[4028],{"categories":8380},[2344],{"categories":8382},[713],{"categories":8384},[2344],{"categories":8386},[2933],{"categories":8388},[2344],{"categories":8390},[3936],{"categories":8392},[3936],{"categories":8394},[3936],{"categories":8396},[2344],{"categories":8398},[713],{"categories":8400},[4028],{"categories":8402},[4373],{"categories":8404},[4019],{"categories":8406},[4373],{"categories":8408},[4373],{"categories":8410},[3936],{"categories":8412},[4373],{"categories":8414},[4373],[]]