<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Learning Data - Medium]]></title>
        <description><![CDATA[Learn data analysis and business intelligence, share projects, build the data community, and develop our skills together. - Medium]]></description>
        <link>https://medium.com/learning-data?source=rss----eec44e936bf1---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Learning Data - Medium</title>
            <link>https://medium.com/learning-data?source=rss----eec44e936bf1---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 15:32:49 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/learning-data" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Learning to Think Through Operational Problems: From Incident to Action]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/learning-data/learning-to-think-through-operational-problems-from-incident-to-action-99b4d4031dc5?source=rss----eec44e936bf1---4"><img src="https://cdn-images-1.medium.com/max/2600/0*5nzwLhZ1HgecGkd-" width="5472"></a></p><p class="medium-feed-snippet">Some of the most valuable problem-solving exercises don&apos;t come from formal training.</p><p class="medium-feed-link"><a href="https://medium.com/learning-data/learning-to-think-through-operational-problems-from-incident-to-action-99b4d4031dc5?source=rss----eec44e936bf1---4">Continue reading on Learning Data »</a></p></div>]]></description>
            <link>https://medium.com/learning-data/learning-to-think-through-operational-problems-from-incident-to-action-99b4d4031dc5?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/99b4d4031dc5</guid>
            <category><![CDATA[problem-solving]]></category>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[critical-thinking]]></category>
            <dc:creator><![CDATA[Maria Eloisa Pedro]]></dc:creator>
            <pubDate>Wed, 02 Sep 2026 17:53:40 GMT</pubDate>
            <atom:updated>2026-09-02T17:53:38.185Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Designing AI Around Evidence, Not Confidence]]></title>
            <link>https://medium.com/learning-data/designing-ai-around-evidence-not-confidence-1049aab687f0?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/1049aab687f0</guid>
            <category><![CDATA[finance]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[knowledge-graph]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Channabasava H]]></dc:creator>
            <pubDate>Wed, 02 Sep 2026 17:32:37 GMT</pubDate>
            <atom:updated>2026-09-02T17:32:36.156Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tEVSebNvAjMg9_i9l9JbaQ.png" /></figure><p>Most AI systems are built around a simple expectation: ask a question and get an answer.</p><p>For financial analysis, I started wondering whether that is always the right behaviour.</p><blockquote>Sometimes, the better answer is simply — <strong>the evidence isn’t there.</strong></blockquote><p>I have been building a small IPO analysis system that answers questions using only a company’s regulatory filing. The idea is deliberately narrow. No market opinions, no assumptions, and no filling in missing information from what the underlying model may already know.</p><p>The system works from a structured knowledge base created from the filing. Each fact carries its source page, section and disclosure status. The language model sits at the end of the process and narrates only the information that survives the earlier checks.</p><h3>The model doesn’t get the final say</h3><p>One lesson from earlier experiments was that asking a model to <em>please stay within the provided context</em> isn’t a particularly strong control.</p><p>So I moved that responsibility outside the model.</p><p>The current system uses a three-stage pipeline.</p><p>First, certain questions such as investment recommendations, future projections and fair-value opinions are blocked deterministically.</p><p>For legitimate questions, the model can identify which part of the knowledge base may contain the answer. But that choice is then validated in code. If the requested information does not actually exist, it never reaches the final answering step.</p><p>Python also handles the numbers. The language model does not perform arithmetic or invent missing values.</p><blockquote>Its job is much smaller: <strong>Explain the evidence it has been given.</strong></blockquote><h3>A surprisingly useful failure</h3><p>During testing, I deliberately asked questions that a general-purpose model could easily answer from its training data.</p><p>A common financial ratio was one example.</p><p>But if the relevant definition wasn’t available within the information I had allowed the system to use, it didn’t quietly reach into general knowledge and complete the answer.</p><blockquote>It stopped — That was exactly the behavior I wanted.</blockquote><p>The distinction becomes even more important with company-specific information. Understanding what a financial ratio means is one thing. Claiming what that ratio is for a particular company is something entirely different.</p><p>The second requires evidence.</p><h3>Why this matters</h3><p>In many applications, a plausible answer may be good enough.</p><p>Financial documents are less forgiving.</p><p>A number that looks reasonable but cannot be traced back to the filing can easily be mistaken for a disclosed fact. An estimate can start looking like evidence simply because it was written confidently.</p><p>That makes restraint part of the system design.</p><p>The goal is not to make the model less capable. It is to decide where that capability is allowed to operate.</p><p>Most of my career has involved getting systems to do more. This project has been an interesting reversal: part of the value comes from making the system deliberately do less.</p><p>For financial AI, reliability is not only about producing the correct answer.</p><blockquote>It is also about controlling what the system is allowed to claim.</blockquote><p>And sometimes, <strong>“the filing doesn’t provide enough evidence”</strong> is exactly the answer the system should give.</p><p>Thank you for reading…</p><p><em>The contents of external submissions are not necessarily reflective of the opinions or work of </em><a href="http://mavenanalytics.io/"><em>Maven Analytics</em></a><em> or any of its team members.</em></p><p><em>We believe in fostering lifelong learning and our intent is to provide a platform for the data community to share their work and seek feedback from the Maven Analytics data fam.</em></p><p><a href="https://medium.com/learning-data/how-to-get-your-work-published-by-learning-data-with-maven-analytics-7df21e466a3e?source=friends_link&amp;sk=020dfac485597d602e218968d9ffb395"><em>Submit your own writing here</em></a><em> if you’d like to become a contributor.</em></p><p><em>Happy learning!</em></p><p><em>-Team Maven</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1049aab687f0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/learning-data/designing-ai-around-evidence-not-confidence-1049aab687f0">Designing AI Around Evidence, Not Confidence</a> was originally published in <a href="https://medium.com/learning-data">Learning Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Simple Mental Model for Modern AI Infrastructure]]></title>
            <link>https://medium.com/learning-data/a-simple-mental-model-for-modern-ai-infrastructure-733bd90f5a9c?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/733bd90f5a9c</guid>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[agentic-rag]]></category>
            <category><![CDATA[ai-infrastructure]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[llm]]></category>
            <dc:creator><![CDATA[Channabasava H]]></dc:creator>
            <pubDate>Wed, 02 Sep 2026 17:29:40 GMT</pubDate>
            <atom:updated>2026-09-02T17:29:39.203Z</atom:updated>
            <content:encoded><![CDATA[<h4>The Six-Layer Map I Wish I Had as a Beginner</h4><p>If you follow AI discussions or news, you’ve probably encountered terms like &quot;LLM,&quot; &quot;Claude,&quot; &quot;GPT,&quot; &quot;Ollama,&quot; &quot;LangChain,&quot; &quot;RAG,&quot; and &quot;GraphRAG&quot;—without a clear sense of where they fit.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WFrRkGv5ZOHUycrL5H2GWw.png" /></figure><blockquote>It sounds like a lot. It isn’t, actually. The problem isn’t that these things are individually hard — it’s that nobody ever draws you the map of how they fit together. So let’s just draw the map.</blockquote><h3>Why this feels confusing (it’s not you)</h3><p>Every one of those words describes a completely different <em>kind</em> of thing. Some are models. Some run models. Some serve models over an API. Some coordinate the whole app. Some are just strategies for finding information before answering a question.</p><p>Mixing all of these into one sentence—&quot;we used LangChain with RAG on top of vLLM serving a Llama model”—is like describing a restaurant by saying “the menu, the chef, the delivery app, and the gas line” all in one breath. Technically all real, all connected, and all completely different jobs.</p><h3>The full stack, top to bottom</h3><p>Here’s the entire thing. Every AI app, no matter how fancy, is basically this stack:</p><ol><li><strong>The App</strong> — where you type your question. A chatbot, a website, a CLI, whatever.</li><li><strong>Orchestration</strong> — decides what happens next. Should we look something up? Call a tool? Just answer? This is LangChain, LangGraph, or LlamaIndex.</li><li><strong>Retrieval</strong> — goes and finds actual evidence before answering. This is RAG or GraphRAG.</li><li><strong>Model serving</strong> — loads the AI model and runs it efficiently. Ollama, vLLM, SGLang, llama.cpp.</li><li><strong>The model (LLM)</strong> — the actual trained network. Llama, Qwen, Mistral, GPT, Claude.</li><li><strong>Hardware</strong> — CPU/GPU. The thing quietly paying for all of this.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CyZfJnNsGEcU4m4lcDv_UQ.png" /></figure><blockquote>That’s the whole map. Every confusing tool name you’ve ever seen fits into exactly one of these six boxes. Once you know the box, the tool stops being intimidating — it’s just “oh, that’s an orchestration thing” instead of a mystery word.</blockquote><p>One honest caveat: real tools don’t always respect these boundaries neatly. llama.cpp does inference <em>and</em> has its own little server built in. vLLM handles serving <em>and</em> dips into orchestration-adjacent territory. Think responsibilities, not strict rulebooks, and you’ll be fine.</p><p>Here’s that same map, one card per layer:</p><h3>Layer 1: The model isn’t the whole app</h3><p>An LLM — Llama, Qwen, Mistral, GPT, Claude — is just a trained neural network that predicts the next word, over and over, extremely fast. By itself, it’s a file. It can’t take your question, can’t run itself, can’t do anything until something else loads it up and starts feeding it prompts.</p><blockquote>This trips people up constantly: “we have access to GPT” does not mean “we have a working app.” You still need everything below it.</blockquote><h3>Layer 2: Who actually runs the model</h3><p>This is the model-serving layer — the software between “a trained model exists” and “you can actually talk to it.”</p><ul><li><strong>llama.cpp</strong> — runs models locally, even on a regular laptop CPU, especially compressed (“quantized”) versions. Great for offline or budget setups.</li><li><strong>vLLM</strong> — built to handle lots of requests at once, production-grade, usually GPU-powered.</li><li><strong>SGLang</strong> — optimized for speed and more complex, multi-step generation, also production-grade.</li><li><strong>Ollama</strong> — the easy button. Downloads models, manages them, gives you a simple local API to call. It is not the model itself, and it’s not raw low-level inference — it’s the convenience layer sitting on top of it.</li></ul><h3>Layer 3: Who decides what happens next</h3><p>LangChain and LangGraph don’t do any of the actual “thinking” — no neural network math happens inside them. They just decide the sequence: check this, call that, then respond.</p><ul><li><strong>LangChain</strong> gives you pre-built pieces to plug together — tools, integrations, model calls.</li><li><strong>LangGraph</strong> is for when the steps aren’t a straight line — there’s branching, memory, maybe looping back before it’s actually done.</li></ul><h3>Layer 4: Getting the model real information first</h3><p>This is where <strong>RAG</strong> and <strong>GraphRAG</strong> live, and it’s probably the single most misunderstood part of the whole stack—because neither one is a model, a database, or a serving engine. They’re both just <em>strategies for finding good evidence</em> before the model writes an answer.</p><p><strong>RAG (Retrieval-Augmented Generation):</strong> search for relevant text — usually using something called vector search, which finds passages that mean something similar to your question — and staple that text onto the prompt before sending it to the model. Simple, effective, and the reason a chatbot can answer questions about stuff way outside what it was originally trained on.</p><p><strong>GraphRAG:</strong> Instead of grabbing loose, similar-sounding chunks of text, it pulls a <em>connected map</em> of facts—entities and the relationships between them—usually from something called a knowledge graph (Neo4j is a common tool for this). It’s the difference between handing someone a stack of relevant articles versus handing them a diagram that already shows how everything connects.</p><p>Here’s the one sentence worth remembering from this entire post:</p><p><strong>RAG and GraphRAG never change how the model “thinks.” They only change what it’s given to think with.</strong> Same model, same hardware, same underlying math — just better material in front of it.</p><h3>Layer 5: When AI starts making its own decisions—&quot;agentic AI”</h3><p>Everything so far has been mostly fixed steps: get a question, maybe retrieve something, send it to the model, get an answer. An <strong>agent</strong> is different—it&#39;s a setup where the model gets to decide, on its own, what to do next: search for something, run a calculation, call another tool, or ask a follow-up question—and keep looping through these choices until an actual goal is met, not just until one step is technically finished.</p><p>Agents live in the orchestration layer. They use retrieval, model serving, and the LLM as tools toward a goal, instead of following a fixed script top to bottom. LangGraph shows up a lot here specifically because it’s built for this kind of branching, multi-step, sometimes-looping process.</p><h3>Quick myths, busted</h3><ul><li><strong>“Ollama is an LLM.”</strong> Nope — Ollama runs and manages models. The LLM is what it’s running.</li><li><strong>“RAG talks directly to the model’s inner workings.”</strong> Nope — RAG just preps a finished prompt, which then goes through the serving layer like any other request.</li><li><strong>“GraphRAG replaces the LLM.”</strong> Nope — it just hands the LLM better material to work with.</li><li><strong>“GraphRAG is always the better choice.”</strong> Also nope. For a quick, simple fact lookup, plain RAG is faster and cheaper. Save the relationship-graph approach for genuinely connected, multi-step questions.</li><li><strong>“Every tool fits neatly into one box.”</strong> Mostly, but not perfectly — remember the caveat above. Use this map as a mental model, not a legal contract.</li></ul><h3>The whole thing, compressed</h3><blockquote><strong>LLM</strong> = the model. Can’t run itself.</blockquote><blockquote><strong>Serving layer</strong> (Ollama/vLLM/SGLang/llama.cpp) = runs the model.</blockquote><blockquote><strong>Orchestration</strong> (LangChain/LangGraph) = decides the steps.</blockquote><blockquote><strong>RAG/GraphRAG</strong> = fetch good evidence before answering.</blockquote><blockquote><strong>Agents</strong> = orchestration that makes its own calls, in a loop, toward a goal.</blockquote><blockquote><strong>Hardware</strong> = pays the electricity bill.</blockquote><p>Once this map is in your head, new AI tool names stop being scary. You’ll just ask yourself, &quot;Which of these six boxes does this thing actually belong to?” — and nine times out of ten, you’ll already know the answer.</p><h4><strong>Final Thoughts</strong></h4><p>And that’s the stack. The next time someone says, “We’re using RAG with a LangGraph agent on vLLM,” you won’t have to nod thoughtfully and hope nobody asks a follow-up. You’ll know they mean: retrieve the right information, coordinate the workflow, and run the model efficiently.</p><blockquote>Go ahead — use “orchestration layer” in a meeting like it has always been part of your vocabulary.</blockquote><blockquote><em>Thank you for Reading</em> 🙌 <em>and Keep an eye out for similar blogs</em>!!</blockquote><p><strong>Editorial note:</strong> This guide presents a responsibility-based view of AI infrastructure based on my current understanding. It is intended as a learning framework, not a representation of universal industry practice. Because product capabilities evolve quickly, always validate deployment decisions against the latest official documentation.</p><p><em>The contents of external submissions are not necessarily reflective of the opinions or work of </em><a href="http://mavenanalytics.io/"><em>Maven Analytics</em></a><em> or any of its team members.</em></p><p><em>We believe in fostering lifelong learning and our intent is to provide a platform for the data community to share their work and seek feedback from the Maven Analytics data fam.</em></p><p><a href="https://medium.com/learning-data/how-to-get-your-work-published-by-learning-data-with-maven-analytics-7df21e466a3e?source=friends_link&amp;sk=020dfac485597d602e218968d9ffb395"><em>Submit your own writing here</em></a><em> if you’d like to become a contributor.</em></p><p><em>Happy learning!</em></p><p><em>-Team Maven</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=733bd90f5a9c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/learning-data/a-simple-mental-model-for-modern-ai-infrastructure-733bd90f5a9c">A Simple Mental Model for Modern AI Infrastructure</a> was originally published in <a href="https://medium.com/learning-data">Learning Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Say Less, Deliver More]]></title>
            <link>https://medium.com/learning-data/say-less-deliver-more-70d619d7f376?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/70d619d7f376</guid>
            <category><![CDATA[data]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[data-analytics]]></category>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[careers]]></category>
            <dc:creator><![CDATA[Neal Patel]]></dc:creator>
            <pubDate>Wed, 02 Sep 2026 17:27:16 GMT</pubDate>
            <atom:updated>2026-09-22T22:18:08.721Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Why clear communication beats a detailed analysis</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XmPBJK7D7W7qhBTMZQWe0w.jpeg" /></figure><p>Whether it’s:</p><ul><li>Presenting your analysis and watching stakeholders disengage one by one</li><li>Or dropping a painfully long Slack message only to get <em>zero</em> reactions</li></ul><p>Stumbling at the final hurdle hurts more than the messy middle.</p><p>I’ve been there. Hell, I’m still there sometimes — except now, when it happens, I know exactly why.</p><h3>The real tell-tale sign</h3><p>One of the biggest signals of an analyst who actually knows what they’re talking about isn’t technical depth. It’s restraint.</p><p>Giving more information than is necessary is a sure-fire way to lose a room. Not because people don’t respect the effort, but because they don’t have the bandwidth to take the full journey with you.</p><p>Clarity isn’t about saying more — it’s about deciding what not to say.</p><h3>The temptation: “Let me show you how hard I worked”</h3><p>When you’ve put genuine hours into something, there’s a gut feeling that you need to show your working.</p><p>So you end up talking about:</p><ul><li>What the business problem is</li><li>What you had to do to structure the data</li><li>How <em>every</em> metric is calculated (even the irrelevant ones)</li><li>What you tried that worked</li><li>What you tried that didn’t</li><li><em>Finally</em>… the insight and recommendation</li></ul><p>It’s pretty thorough. But working hard and adding value aren’t the same thing, and “keeping it concise” is one of the cleanest ways to signal the difference.</p><h3>What’s actually necessary</h3><p>In most real-world situations, what you <em>really</em> need to land is:</p><ul><li><strong>The business problem</strong></li><li><strong>The outcome that worked (with the metrics that matter)</strong></li><li><strong>Insights &amp; recommendations (next steps)</strong></li></ul><p>That’s it (sorry, no elaborate checklist of 30 areas to consider). 90% of stakeholders only want three things:</p><p><strong>Context. Proof. Actions.</strong></p><p>If you give them that, you win. If you make them dig for it, you lose them.</p><h3>A quick example: long-winded vs concise</h3><p>Let’s say conversion dropped last week and you’ve investigated, both updates below describe the same analysis:</p><h4>Long-winded update (the “no one replies” version)</h4><blockquote><em>Hey all — I’ve looked into the drop in conversion last week. I pulled data from GA4 and our internal events tables but there were discrepancies due to event deduping so I used internal events as source of truth. I also filtered suspected bot sessions because they were inflating sessions and skewing the funnel.</em></blockquote><blockquote><em>I rebuilt the funnel from landing → product view → add to basket → checkout → purchase. I calculated conversion in multiple ways (purchases/sessions, purchases/users, purchases/checkout_starts) to sense check and segmented by device type, browser, channel and new vs returning users.</em></blockquote><blockquote><em>The drop seems concentrated in mobile iOS Safari and starts at checkout_start where we see about a 14% drop week on week. Desktop seems stable. I checked whether this aligned with the new pricing banner test but it doesn’t fully line up.</em></blockquote><blockquote><em>I also investigated latency and there was a slight increase. Payment decline logs also increased but I’m not sure if it’s noise. I can run a deeper cohort analysis and set up a dashboard for ongoing monitoring…</em></blockquote><p>It might be correct, but it’s work for the reader. I’ve done this many times before. It isn’t until you step away from your laptop for 10 minutes and come back to read your response that you realise you just overloaded your stakeholder with words. They had to strip out the point you’re trying to make themselves. Not good.</p><h4>Concise update (Leadership Team-ready)</h4><blockquote><strong><em>Conversion dropped 1.8pp last week (6.2% → 4.4%).</em></strong><em><br></em><strong><em>Where:</em></strong><em> Almost entirely caused by mobile iOS Safari. Desktop remains stable.<br></em><strong><em>What changed:</em></strong><em> Checkout conversion was down 14%</em><strong><em> </em></strong><em>WoW on iOS Safari from Tuesday onwards.<br></em><strong><em>Likely driver:</em></strong><em> Spike in payment declines on that route.</em></blockquote><blockquote><strong><em>Next steps:</em></strong></blockquote><blockquote>1) Engineering to validate iOS Safari payment flow changes (top priority). <br>2) Add alerting for checkout completion by device/browser to track changes. <br>3) If unresolved by end of week, mitigate by routing iOS to alternative payment options.</blockquote><p>This does three things instantly:</p><ul><li>sets the scene</li><li>proves the point</li><li>makes the actions obvious</li></ul><p>And if anyone wants the “how”, you’ve still got it in your back pocket, but this time — its more of a tailored response to fill in the gaps of knowledge asked by the stakeholder directly. Cool right? you just pre-empted the follow-up questions.</p><h3>The trick that keeps me honest</h3><p>Before I send any update now, I ask:</p><p><strong>If they only read one line, what do they need to know?</strong></p><p>That line goes first, everything else earns its place. As a professional in analytics, being right isn’t the job, but being understood sure as hell is.</p><p><em>The contents of external submissions are not necessarily reflective of the opinions or work of </em><a href="http://mavenanalytics.io/"><em>Maven Analytics</em></a><em> or any of its team members.</em></p><p><em>We believe in fostering lifelong learning and our intent is to provide a platform for the data community to share their work and seek feedback from the Maven Analytics data fam.</em></p><p><a href="https://medium.com/learning-data/how-to-get-your-work-published-by-learning-data-with-maven-analytics-7df21e466a3e?source=friends_link&amp;sk=020dfac485597d602e218968d9ffb395"><em>Submit your own writing here</em></a><em> if you’d like to become a contributor.</em></p><p><em>Happy learning!</em></p><p><em>-Team Maven</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=70d619d7f376" width="1" height="1" alt=""><hr><p><a href="https://medium.com/learning-data/say-less-deliver-more-70d619d7f376">Say Less, Deliver More</a> was originally published in <a href="https://medium.com/learning-data">Learning Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Beyond Chatbots: Designing Enterprise AI Systems That Deliver Business Value]]></title>
            <link>https://medium.com/learning-data/beyond-chatbots-designing-enterprise-ai-systems-that-deliver-business-value-3d67f8de1368?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/3d67f8de1368</guid>
            <category><![CDATA[enterprise-ai]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[digital-transformation]]></category>
            <dc:creator><![CDATA[Srujana Sree Bathineni]]></dc:creator>
            <pubDate>Fri, 14 Aug 2026 13:31:01 GMT</pubDate>
            <atom:updated>2026-08-14T13:31:01.677Z</atom:updated>
            <content:encoded><![CDATA[<h4>Chatbots introduced us to Generative AI, but lasting business value comes from integrating intelligence into processes, decisions, and operations.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_7z2OPWT1uw5ez3ywUrs7A.png" /><figcaption>The future of Enterprise AI is not another chatbot. It’s intelligent systems that quietly improve how businesses operate every day.</figcaption></figure><p>When generative AI entered the mainstream, it did something few technologies have managed to accomplish. Almost overnight, artificial intelligence became part of everyday business conversations. Executives who had never discussed machine learning were suddenly asking about large language models. Product teams began exploring AI assistants, customer support organizations experimented with conversational interfaces, and employees discovered that many of the tasks consuming their day could now be completed with a well-written prompt.</p><p>For many organizations, the chatbot became their first meaningful interaction with artificial intelligence. It was intuitive, approachable, and surprisingly capable. Instead of learning a new application or navigating another dashboard, people could simply ask a question in plain language and receive an answer within seconds. It felt natural, almost effortless, and for a moment it seemed as though the future of enterprise AI had finally arrived.</p><p>That excitement was both justified and necessary. Chatbots made artificial intelligence accessible in a way that predictive models and machine learning algorithms never had. They demonstrated that AI could move beyond research laboratories and become something employees could interact with every day. They helped organizations imagine possibilities that previously felt too complex or too expensive to pursue.</p><p>Yet as the excitement grew, I began noticing something that appeared in conversation after conversation. Regardless of the industry or the size of the organization, discussions about enterprise AI almost always started in the same place.</p><p>“How do we build a chatbot?”</p><p>It sounds like a perfectly reasonable question, especially given how visible conversational AI has become. But over time I started wondering whether it was also the wrong question.</p><p>The more I worked on enterprise AI initiatives, the more I realized that many organizations had unintentionally begun treating the chatbot as the destination rather than the introduction. Artificial intelligence had become synonymous with conversation, even though conversations represented only a tiny fraction of how businesses actually operate.</p><p>Most organizations don’t struggle because employees lack someone to answer questions. They struggle because information is fragmented across systems, decisions take longer than they should, repetitive tasks consume valuable time, and critical insights often arrive only after an opportunity has already passed. None of those challenges disappear simply because an employee can chat with an AI assistant.</p><p>That realization changed the way I thought about enterprise AI.</p><p>I stopped viewing conversational interfaces as the center of an AI strategy and began seeing them as just one possible entry point into something much larger. The real opportunity wasn’t teaching people to ask better questions. It was designing systems capable of answering questions before they even needed to be asked.</p><p>Think about how many decisions happen inside an organization on any given day. A purchasing manager decides whether inventory should be reordered. A finance team reconciles supplier invoices. Operations teams monitor products approaching expiration. Customer service representatives search for information spread across multiple systems before responding to a customer. Managers spend valuable time trying to understand why performance changed instead of deciding what should happen next.</p><p>These aren’t isolated problems. They are everyday business activities that quietly shape how efficiently an organization operates.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*anSWRwRU5EiRCuA5QJnDjA.png" /><figcaption>A conceptual view of how enterprise AI transforms organizational data into intelligent actions and measurable business value through continuous learning and operational feedback.</figcaption></figure><p>Artificial intelligence has enormous potential to improve each of these decisions, but not because it can generate fluent responses or summarize documents. Its real value lies in its ability to connect information, recognize patterns, reduce repetitive effort, and deliver insights precisely when people need them. In other words, enterprise AI becomes most valuable when it stops acting like a tool people visit and starts behaving like a capability woven into the way the organization works.</p><p>That distinction may seem subtle, but I believe it defines the next phase of enterprise AI.</p><p>For the past two years, we’ve been fascinated by what AI can say.</p><p>The next challenge is discovering what AI can quietly help organizations do.</p><p>If there’s one lesson I’ve learned from working on enterprise AI initiatives, it’s that technology rarely determines whether a project succeeds. That may sound surprising in a field obsessed with model performance, benchmark scores, and the latest breakthroughs, but the longer I spend designing enterprise AI solutions, the more convinced I become that organizations rarely struggle because they chose the wrong AI model. They struggle because they try to fit AI into processes that were already broken.</p><p>I’ve seen organizations spend months evaluating foundation models while paying very little attention to the quality of the data those models would eventually consume. Teams debated whether one language model reasoned better than another, yet no one could confidently explain where critical business information lived or whether employees trusted the data they were using every day. It reminded me that artificial intelligence doesn’t replace the fundamentals of good system design. If anything, it makes them even more important.</p><p>Enterprise AI isn’t simply another application that sits alongside existing business systems. It becomes part of the way decisions are made. When an AI system recommends a purchasing decision, flags an operational risk, summarizes financial information, or identifies an anomaly, people naturally begin relying on those recommendations. At that moment, the conversation is no longer about artificial intelligence. It’s about trust.</p><p>Trust is difficult to measure, yet it determines almost everything.</p><p>Employees don’t adopt intelligent systems because they are technically impressive. They adopt them because they consistently produce reliable outcomes. Managers don’t change the way they make decisions because an algorithm is sophisticated. They change because the system proves itself over time by helping them make better decisions with greater confidence.</p><p>That is why I believe the future of enterprise AI has less to do with creating more capable conversations and more to do with creating more dependable systems.</p><p>A well-designed enterprise AI platform should feel less like asking questions to a chatbot and more like working within an organization that simply functions better. Information should appear when it’s needed instead of requiring someone to search for it. Routine tasks should happen in the background without drawing attention to themselves. Business users shouldn’t have to understand prompt engineering to benefit from artificial intelligence. Ideally, they shouldn’t have to think about AI at all.</p><p>The most successful technology often becomes invisible. We don’t admire the database every time a transaction is completed, and we rarely think about the cloud infrastructure supporting the applications we use every day. Artificial intelligence will eventually follow the same path. As organizations mature, AI will become another capability quietly embedded within business operations, supporting people without demanding their attention.</p><p>That shift also changes the role of architects, engineers, and technology leaders. Our responsibility is no longer limited to implementing intelligent models. We are designing systems that influence how people work, how organizations make decisions, and how businesses create value. Those responsibilities extend far beyond software development. They require us to understand operations, governance, collaboration, and perhaps most importantly, the people who will ultimately rely on the technology.</p><p>When viewed from that perspective, enterprise AI stops being a technology initiative. It becomes an organizational capability — one that grows stronger as data improves, processes evolve, and people gain confidence in the systems supporting them.</p><p>Artificial intelligence will continue evolving at an extraordinary pace. The models available a year from now will almost certainly outperform the ones we use today, and new capabilities will continue to reshape what organizations believe is possible. That progress is exciting, but it can also become distracting. It’s easy to focus on the next breakthrough while overlooking the foundations that allow innovation to create lasting value.</p><p>I don’t believe the organizations leading the next generation of enterprise AI will necessarily be those that adopt every new model first. They will be the ones that understand their own business well enough to know where intelligence truly belongs. They’ll invest in trusted data before chasing benchmarks, design workflows before designing prompts, and view AI as a capability that strengthens people rather than replaces them.</p><p>Chatbots have undoubtedly changed the way we interact with technology, and they deserve their place in the evolution of artificial intelligence. But they are only the beginning of a much larger story.</p><p>The real transformation happens when intelligence becomes woven into the fabric of an organization — supporting decisions, simplifying complexity, and helping people solve problems without requiring constant attention to the technology itself.</p><p>Perhaps that’s the future enterprise AI has been moving toward all along.</p><p>Not a future where people spend more time talking to artificial intelligence.</p><p>But one where they spend less time thinking about it because it’s already helping them do their work better.</p><p><em>The contents of external submissions are not necessarily reflective of the opinions or work of </em><a href="http://mavenanalytics.io/"><em>Maven Analytics</em></a><em> or any of its team members.</em></p><p><em>We believe in fostering lifelong learning and our intent is to provide a platform for the data community to share their work and seek feedback from the Maven Analytics data fam.</em></p><p><a href="https://medium.com/learning-data/how-to-get-your-work-published-by-learning-data-with-maven-analytics-7df21e466a3e?source=friends_link&amp;sk=020dfac485597d602e218968d9ffb395"><em>Submit your own writing here</em></a><em> if you’d like to become a contributor.</em></p><p><em>Happy learning!</em></p><p><em>-Team Maven</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3d67f8de1368" width="1" height="1" alt=""><hr><p><a href="https://medium.com/learning-data/beyond-chatbots-designing-enterprise-ai-systems-that-deliver-business-value-3d67f8de1368">Beyond Chatbots: Designing Enterprise AI Systems That Deliver Business Value</a> was originally published in <a href="https://medium.com/learning-data">Learning Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Built My Own “penguin-info” Command in My Chromebook’s Linux Environment]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/learning-data/i-built-my-own-penguin-info-command-in-my-chromebooks-linux-environment-86c67daddf07?source=rss----eec44e936bf1---4"><img src="https://cdn-images-1.medium.com/max/2600/0*YEcIbRyQy1d9Tnah" width="4800"></a></p><p class="medium-feed-snippet">I started with a fairly simple question: &#x201C;Can I install useful development tools in my Chromebook&#x2019;s Linux Environment besides VS Code?&#x201D;</p><p class="medium-feed-link"><a href="https://medium.com/learning-data/i-built-my-own-penguin-info-command-in-my-chromebooks-linux-environment-86c67daddf07?source=rss----eec44e936bf1---4">Continue reading on Learning Data »</a></p></div>]]></description>
            <link>https://medium.com/learning-data/i-built-my-own-penguin-info-command-in-my-chromebooks-linux-environment-86c67daddf07?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/86c67daddf07</guid>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[bash]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[chromebook]]></category>
            <dc:creator><![CDATA[Maria Eloisa Pedro]]></dc:creator>
            <pubDate>Thu, 13 Aug 2026 13:31:02 GMT</pubDate>
            <atom:updated>2026-08-13T13:31:02.123Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Slowly Changing Dimensions: Tracking Historical Data]]></title>
            <link>https://medium.com/learning-data/slowly-changing-dimensions-tracking-historical-data-2c338459339d?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/2c338459339d</guid>
            <category><![CDATA[data-warehouse]]></category>
            <category><![CDATA[slowly-changing-dimension]]></category>
            <category><![CDATA[data-engineering]]></category>
            <dc:creator><![CDATA[Madhurima Nath, PhD]]></dc:creator>
            <pubDate>Wed, 12 Aug 2026 20:20:26 GMT</pubDate>
            <atom:updated>2026-08-12T20:20:25.128Z</atom:updated>
            <content:encoded><![CDATA[<p>A database table that records a customer’s address or a product’s category can simply overwrite the old value with the new one when it changes. Querying that table for a customer’s current address or a product’s current category still returns the correct result. The problem appears only when a query needs to know what was true in the past, because the earlier value has already been replaced and no longer exists anywhere.</p><p>This article explains why that happens and describes the different ways of handling it.</p><h3>Fact tables and dimension tables</h3><p>In a data warehouse, data is split into fact tables and dimension tables as a deliberate design choice driven by scale. A fact table can grow to billions of rows, one for every event a business has ever recorded, while the customers or products those events refer to are far fewer and rarely change.</p><p>Storing a customer’s full details on every one of their transactions would create two costs: it would multiply storage many times over, and a single change to one detail would mean rewriting every transaction row in which that customer appears. Splitting the two into separate tables avoids both.</p><p><strong>Fact tables</strong> record events: a sale, a click, a payment. Each happened at a specific moment and is not expected to change once written. A sales fact table might look like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n9K7nGAArjKYBawWY0BzYg.png" /></figure><p><strong>Dimension tables</strong> record descriptions of the things a fact table refers to: who a customer is, where they live, what category a product belongs to. A simple customers dimension might look like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/920/1*Nh0HYAYE2hF5fY2jGpPViQ.png" /></figure><p>The two tables are connected by customer_id. To analyse sales by city, a query joins the two tables: for every row in the fact table, it takes the customer_id and looks up the matching row in the dimension table to get the city.</p><h3>The cost of overwriting a dimension</h3><p>Joining the fact table to the dimension table by customer_id returns the correct city for an old sale only if the customer has not moved since the sale happened. Suppose the customer relocates to New York City, and the dimension table is updated to match:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*sK5palneYh45YbrzbdjE7Q.png" /></figure><p>The join now returns New York City for every one of that customer’s sales, including the sale from 21 June 2025, made while they still lived in San Francisco. A sales-by-city report run before the move correctly showed that sale under San Francisco. The same report, run again now, shows it under New York City instead, even though nothing about the sale itself changed; only the recorded address did.</p><p>The underlying issue is that a dimension table built this way can only ever reflect what is currently true about a customer. A query asking what was true in the past gets today’s value instead, because the table no longer holds any other value.</p><p>This is one of the oldest problems in data warehousing: how much history to keep for a value that changes, and in what form. The problem has a standard name: a <strong>Slowly Changing Dimension</strong>, or <strong>SCD</strong>. A customer’s city is one example of a slowly changing attribute; the same problem applies to a product’s category, a company’s sector, an employee’s department, or any other description that is not fixed forever.</p><p>The term comes from Ralph Kimball’s work on dimensional modelling in the 1990s, long before cloud warehouses or lakehouses existed. It has nothing to do with any particular platform: the same eight types apply whether the table lives in Oracle, SQL Server, Snowflake, Databricks, or a spreadsheet.</p><h3>Consequences for data engineering, analytics, and machine learning</h3><p>The join described above matters well beyond a single report. Every downstream dashboard, business intelligence (BI) query, and machine learning feature pipeline relies on that same mechanism to look up a descriptive value, such as a city or a name, for a raw ID. How the dimension table handles change determines what every one of those downstream layers can know about the past.</p><p>Data engineers make that decision first, often without realising how far it reaches. If the choice is to overwrite, as in the example above, an updated value replaces the old one immediately, at the point of ingestion. From then on, no downstream query can recover what was lost, no matter how it is written.</p><p>Analysts and BI teams encounter the same problem through that join: a quarter that previously reported $50,000 in San Francisco sales now reports $30,000, because the join now attributes those same historical sales to a different city.</p><p>The same join affects machine learning systems too, but as a feature problem rather than a reporting one. A model trained to predict customer churn needs the join to return what was true about a customer <em>at the time</em> of each past event, not what is true today. If the dimension only holds the current value, the join feeds the model facts that did not exist yet, a problem usually known as data leakage.</p><p>There is no single right pattern: the choice depends on which of these failures a business can tolerate. That is a business decision about what the data needs to answer, not a fixed technical rule.</p><h3>Type 0: Retain original (rarely needed)</h3><p>The simplest option: the value never changes once it has been written.</p><p><strong>Best for:</strong> attributes that genuinely should not change after the fact, such as a customer’s original signup date or the marketing channel through which they were first acquired.</p><p><strong>Trade-off:</strong> if the value turns out not to be truly fixed after all, there is no built-in way to correct it. Most attributes do not fit this pattern, which is why Type 0 is rarely the right choice.</p><h3>Type 1: Overwrite (no history kept)</h3><p>This dimension table, shown earlier, has a single row per entity, updated in place, with no history kept. Few teams choose this pattern deliberately; it is simply what happens by default when no extra mechanism is built to preserve history, since each update then has only one existing row to overwrite.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*sK5palneYh45YbrzbdjE7Q.png" /></figure><p><strong>Best for:</strong> corrections with no future analytical value, such as a corrected typo, a corrected phone number, or a corrected spelling. Only the current truth matters; the value it held before is irrelevant.</p><p><strong>Trade-off:</strong> old reports go stale without warning. A report that joined this dimension last year will give a different answer if it runs again today, and there is no way to recover what the data showed at the time.</p><h3>Type 2: Add a new row (the standard choice)</h3><p>Instead of overwriting, Type 2 inserts a new row and marks it as current. This is the most common pattern in real data warehouses, and the one most worth understanding. It also involves the greatest implementation complexity: surrogate keys, effective dates, and a way to atomically close out the old row while inserting the new one.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MMnz_a4b8Qj93wF5_GWvMA.png" /></figure><p>A transaction recorded before the move now joins to the row that was true at that time (San Francisco), while today’s reports use the current row (New York City). The customer_id no longer uniquely identifies one row. The table needs a separate surrogate key for that, plus the date range or the is_current flag, to select the correct version.</p><p>In practice, a MERGE step populates this table each time new data arrives:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BEa73XKeiJgPLLtOF724Jg.png" /></figure><p>Customer A’s move follows the rightmost path: the San Francisco row is flagged inactive, and the New York City row is inserted as current. A customer who has not moved follows the left branch instead: no change, no new row.</p><p><strong>Best for:</strong> point-in-time accuracy and audits, where knowing what was true at a specific moment matters as much as knowing what is true now. It comes up most often in financial services and insurance, where regulators expect a record of what was true when a decision was made; in healthcare, where a patient’s coverage or care details must reflect the state at each visit rather than today; and in retail, where attributing a past sale to the correct price or customer segment depends on knowing what was true when the sale happened. An internal directory or a marketing contact list rarely needs this level of detail; the extra complexity is not justified, and Type 1 is enough.</p><p><strong>Trade-off:</strong> more keys, more dates, more deliberate joins, and more storage, since a new row is added every time the value changes. Every dimension table needs surrogate keys, date ranges, and a rule for which row applies to which fact.</p><h3>Type 3: Add a column (one step of history)</h3><p>A lighter alternative: Type 3 keeps one previous value alongside the current one, in the same row.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*F-T0We_ng2kDQNEhkrag4Q.png" /></figure><p><strong>Best for:</strong> cases where only a before-and-after comparison is needed, not the full chain of every previous change, such as showing a product’s previous price next to its current one.</p><p><strong>Trade-off:</strong> only one step of history survives. A second change erases the original value the same way Type 1 does.</p><h3>Type 4: A separate history table (for read-heavy current tables)</h3><p>Type 4 splits the table in two: a ‘current’ table with one row per entity, and a separate history table holding every past version.</p><p>Current table:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*sK5palneYh45YbrzbdjE7Q.png" /></figure><p>History table:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CWsuzcNRHRf_5WQET08IvA.png" /></figure><p>The current table always holds exactly one row per customer and answers almost every query instantly. The history table grows with every change and is only queried when someone specifically needs to know what was true in the past.</p><p><strong>Best for:</strong> systems where queries access the current table far more often than the history table, such as a customer-profile lookup that almost always needs only the current address, with the full change history queried only occasionally for support or audit purposes. The common case stays fast without paying the cost of scanning years of changes.</p><p><strong>Trade-off:</strong> two tables to maintain instead of one, and any query that needs both current and historical data has to look in two places instead of one.</p><h3>Type 6: A hybrid of full history and a current column (most complete, most complex)</h3><p>Type 6 combines Types 1, 2, and 3: it overwrites a current-value column the way Type 1 does, keeps full history the way Type 2 does, and exposes that current column alongside the history in the same row the way Type 3 does.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UH87c-Yf1BdSFqLOySnUGQ.png" /></figure><p>The current_city column holds New York City in both rows: every time the customer&#39;s city changes, that column is overwritten across all of their rows, past and present. So querying the 2019 row alone shows both what was true then (San Francisco, in city) and what is true now (New York City, in current_city), with no join required.</p><p><strong>Best for:</strong> cases where both the current value and the full history are needed often enough that paying for an extra join every time is not worth it. It shows up most often in subscription billing, where a customer’s current plan tier is checked on every request for feature access while the full history of plan changes is needed to calculate prorated charges each billing cycle, and in loyalty programmes, where a member’s current tier drives an instant discount on every transaction while the full tier history is kept for eligibility checks and dispute resolution.</p><p><strong>Trade-off:</strong> the most storage and the most upkeep of any type, since every change has to update both the history and the current-value column, and keep them in sync.</p><h3>Types 5 and 7: rare in practice</h3><p>Two further types exist, though rare enough that they are only sketched briefly here.</p><p><strong>Type 5</strong> solves a narrower problem: a few attributes, such as a customer’s income band or household size, change far more often than the rest of the customer dimension. Applying Type 2 directly would mean inserting a new row, repeating the customer’s name and every other stable attribute, each time just one of those fast-changing fields shifts.</p><p><strong>Type 5</strong> avoids that by splitting the fast-changing attributes into their own, much smaller table: a mini-dimension. The mini-dimension holds one row per distinct <em>combination</em> of those attributes, not one row per customer, so many customers share the same row.</p><p>Main customer dimension:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/898/1*qyR0fBC8w8mbCJ71zxUoRA.png" /></figure><p>Demographic mini-dimension:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/992/1*OeCFFtApD6Jtbx5IDXrVEA.png" /></figure><p>demo_key is a foreign key, just like customer_id connects a fact table to a dimension table. When the customer&#39;s income band changes, only demo_key in the main dimension is overwritten, to point at whichever mini-dimension row matches the new combination; the main dimension itself never grows. The pattern is most common in retail loyalty programmes, where income band, household size, or activity tier are resurveyed often, while a customer&#39;s name and signup date are not.</p><p><strong>Type 7</strong> keeps both a durable key and a surrogate key in the same table: customer_id stays the same for that customer forever (the durable key), while customer_sk is a new surrogate key generated for every new row, the same kind of surrogate key Type 2 uses to tell historical versions apart.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zT1iZxCx67pLUmHqKBBBPg.png" /></figure><p>A fact table that stores customer_sk always joins to the row that was true when the event happened: the point-in-time view. A fact table that stores customer_id instead joins to today&#39;s row regardless of when the event happened: the current view. This shows up in sales compensation systems, where commission is calculated against the organisational structure at the time of the sale, while executive dashboards roll the same sales up to today&#39;s structure.</p><h3>Weighing trade-offs at a glance</h3><p>The table below compares the six most common types; Types 5 and 7, being rarer, are not included. A quicker guide for the three most common choices:</p><ul><li>Does the old value matter for any future analysis? If not, <strong>Type 1</strong> is sufficient.</li><li>Does accurate point-in-time reporting require the full history of every change? Use <strong>Type 2</strong>.</li><li>Does the use case need only a comparison between the immediately previous value and the current one? <strong>Type 3</strong> is enough, and simpler.</li></ul><p>The trade-offs side by side:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*07f2Qf2MsUOvQe3JQCRCeA.png" /></figure><p>Most real warehouses use a mix: Type 1 for fields like spelling corrections, Type 2 for anything tied to financial or compliance reporting, where what the data showed at the time still matters.</p><h3>Further reading</h3><p>Ralph Kimball and Margy Ross, <em>The Data Warehouse Toolkit</em> (Wiley), the original source of the SCD terminology and numbering used throughout this article.</p><p><em>The contents of external submissions are not necessarily reflective of the opinions or work of </em><a href="http://mavenanalytics.io/"><em>Maven Analytics</em></a><em> or any of its team members.</em></p><p><em>We believe in fostering lifelong learning and our intent is to provide a platform for the data community to share their work and seek feedback from the Maven Analytics data fam.</em></p><p><a href="https://medium.com/learning-data/how-to-get-your-work-published-by-learning-data-with-maven-analytics-7df21e466a3e?source=friends_link&amp;sk=020dfac485597d602e218968d9ffb395"><em>Submit your own writing here</em></a><em> if you’d like to become a contributor.</em></p><p><em>Happy learning!</em></p><p><em>-Team Maven</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2c338459339d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/learning-data/slowly-changing-dimensions-tracking-historical-data-2c338459339d">Slowly Changing Dimensions: Tracking Historical Data</a> was originally published in <a href="https://medium.com/learning-data">Learning Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[“Let’s use ML for this!” Wait, no..]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/learning-data/lets-use-ml-for-this-wait-no-2481b9334c58?source=rss----eec44e936bf1---4"><img src="https://cdn-images-1.medium.com/max/1636/1*JiRousDSx8VLqXvMC1XenQ.png" width="1636"></a></p><p class="medium-feed-snippet">And why ML fails you</p><p class="medium-feed-link"><a href="https://medium.com/learning-data/lets-use-ml-for-this-wait-no-2481b9334c58?source=rss----eec44e936bf1---4">Continue reading on Learning Data »</a></p></div>]]></description>
            <link>https://medium.com/learning-data/lets-use-ml-for-this-wait-no-2481b9334c58?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/2481b9334c58</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[rules]]></category>
            <category><![CDATA[overfitting]]></category>
            <category><![CDATA[baseline]]></category>
            <category><![CDATA[data-science]]></category>
            <dc:creator><![CDATA[Vasilis Kalyvas]]></dc:creator>
            <pubDate>Wed, 12 Aug 2026 20:18:06 GMT</pubDate>
            <atom:updated>2026-08-12T20:18:05.507Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Migrating Financial Analytics to a Lakehouse on Databricks: A Working Demo]]></title>
            <link>https://medium.com/learning-data/migrating-financial-analytics-to-a-lakehouse-on-databricks-a-working-demo-38a3eb9f16d5?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/38a3eb9f16d5</guid>
            <category><![CDATA[databricks]]></category>
            <category><![CDATA[medallion-architecture]]></category>
            <category><![CDATA[streamlit]]></category>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[data-migration]]></category>
            <dc:creator><![CDATA[Madhurima Nath, PhD]]></dc:creator>
            <pubDate>Wed, 12 Aug 2026 20:12:27 GMT</pubDate>
            <atom:updated>2026-08-12T20:12:25.627Z</atom:updated>
            <content:encoded><![CDATA[<h4><em>What the move from SAS to a modern data platform looks like in practice — built on real market data, end to end</em></h4><p>Most financial institutions have run market analytics in SAS for decades. The results are correct, but the infrastructure is a single server, the code mixes data access and analytics logic in the same script.</p><p>The modern alternative is a data lakehouse on Databricks: a platform that combines Delta Lake storage, distributed compute with PySpark, and built-in version history for audit. The question is what the migration actually looks like, end to end.</p><p>Three things drive this at enterprise scale. At the compute level, SAS runs on a single server — as data volumes grow, the only option is a larger machine. PySpark distributes across a cluster; the same logic scales without rewriting. At the governance level, every write to a Delta table is a new version, so a regulator asking for the state of any table on a specific date gets a query rather than a search through archived flat files. At the team level, Python and PySpark skills are widely available in a way that makes teams easier to build and sustain.</p><p>This project is a personal exploration of that migration, built outside work on Databricks Free Edition (the free tier, without Unity Catalog, Delta Live Tables, or Auto Loader). It runs on real financial data from 2010 to the present, with a tested pipeline and a live Streamlit dashboard showing the Gold layer output. The aim is to show what the patterns look like in practice, not to replicate a production deployment.</p><h3>What the project covers</h3><p>Two things, which represent the two sides of any migration.</p><p>The first is the infrastructure: a three-layer Delta Lake pipeline (Bronze, Silver, Gold) processing five financial data series: S&amp;P 500, Euro Stoxx 50, VIX (a measure of expected market volatility), US Federal Funds Rate, and ECB (European Central Bank) Deposit Facility Rate. The Gold layer is the consumption-ready layer where final business rules and aggregations are applied: rolling volatility, cross-market correlations, drawdown, and rate regime classifications for both central banks — served through an interactive Streamlit dashboard.</p><p>The second is the code: a SAS → PySpark converter that translates legacy SAS scripts to PySpark automatically. Common patterns are handled by a rule engine; anything outside those patterns is sent to an LLM (large language model). The converter is covered in the article: <a href="https://medium.com/@m.nath/automating-sas-to-pyspark-migration-rule-engine-first-ai-for-the-rest-d9d0b19ca1a8?postPublishedType=repub">Automating SAS-to-PySpark migration</a>, but it is part of the same project: one cannot move the infrastructure and leave the code behind.</p><h3>The three-layer pipeline</h3><p>The medallion architecture separates data into three layers, each with a distinct role. That separation reflects what happens to data as it moves from raw source to analytics-ready output.</p><p><strong>Bronze</strong> is raw ingestion. Two sources, five tables, no transformation:</p><ul><li>Yahoo Finance (daily): S&amp;P 500 closing prices, Euro Stoxx 50 closing prices, VIX</li><li>FRED (Federal Reserve Economic Data, monthly): US Federal Funds Rate, ECB Deposit Facility Rate</li></ul><p>Everything is written to Delta tables exactly as received; Bronze is the permanent record. If a cleaning step in Silver changes later, one can reprocess the full history without going back to the original APIs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EqAookZ3SClZvGXsWUgysQ.png" /><figcaption><em>All seven Delta tables in the Databricks Catalog after a full pipeline run</em></figcaption></figure><p><strong>Silver</strong> is the data preparation layer. It cleans, joins, and validates before anything downstream uses it. A quality check module runs at every layer transition: row count, null, range, and duplicate checks; if any fail, the pipeline halts rather than passing bad data downstream.</p><p>After Silver, the pipeline has a single clean daily table: one row per trading day, all five series aligned, no nulls, log returns computed, quality checks passed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OxTXv7Vzv3WSq8DwIr2S9g.png" /><figcaption><em>Quality check output after the Silver layer — every check passes before the pipeline writes silver_market and proceeds to Gold</em></figcaption></figure><p><strong>Gold</strong> is the consumption-ready layer where final business rules and aggregations are applied for project-specific use cases. As Databricks defines it, this is the layer where data is organised specifically for how it will be consumed (<a href="https://www.databricks.com/glossary/medallion-architecture">Databricks: Medallion Architecture</a>). This project’s Gold layer computes rolling realised volatility at 20-day and 60-day windows (annualised), 60-day rolling correlation between US and EU equity returns, S&amp;P 500 drawdown from its 52-week high, rate regime classifications for both central banks, and VIX regime labels. A financial analyst opening the dashboard gets these answers directly, with no further calculation needed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SKg13P_Wv8e23dezsb3YXg.png" /><figcaption><em>Gold notebook summary — regime distribution and the most recent rows from the gold_analytics table</em></figcaption></figure><p>Each pipeline run appends a record to a pipeline_run_log Delta table: stage, table name, rows written, date range, and timestamp. Every write to Gold is a new Delta version, so any prior state can be queried with VERSION AS OF, which is what a regulatory audit trail requires.</p><p>The <a href="https://medium.com/@m.nath/a-sas-migration-on-databricks-a-hands-on-project-13582e8f7004">companion article</a> covers each layer in detail for an example data migration project.</p><h3>Testing and validation</h3><p>The converter is tested with 39 automated test scripts covering every supported SAS construct — sort, aggregation, SQL, conditional logic, date functions, and constructs like RETAIN that cannot be translated mechanically and trigger a warning instead — as well as confidence scoring, config-driven library and macro variable resolution, multi-block script conversion, and migration manifest generation. A further 7 cases cover the pipeline submission script — credential loading, correct exit codes on success and failure, and job status handling. The full suite runs automatically on every push to main via GitHub Actions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ceoog7Xeb4DmHxp7w3gR6A.png" /><figcaption><em>All 46 tests passing — 39 for the SAS converter, 7 for the pipeline submission script</em></figcaption></figure><blockquote>The above is generated by running pytest tests/ -v in the terminal from the project root.</blockquote><p>Quality checks at every layer transition validate the actual data on Databricks. If any check fails, the pipeline halts before bad data reaches the next layer. This is not something one gets from a traditional SAS setup, where ingestion, cleaning, joining, and analytics typically live in a single script. The medallion architecture makes each transformation an independently testable unit.</p><h3>What this looks like in production</h3><p>This project runs on the Free Edition. A production deployment on a full Databricks workspace would add:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-MzZH53asgsir2K6D-nj7A.png" /></figure><p>The code is written to be Unity Catalog-ready: adding catalog prefixes to table names is the only change needed when moving to a full workspace. The patterns are the same; the infrastructure around them is more robust.</p><p>The most significant code-level change in production is Delta Live Tables. Currently, each notebook writes tables explicitly and calls quality check functions. In a full workspace, both collapse into declarative table definitions with @dlt.expect decorators. Less repetitive code, same logic.</p><h3>The dashboard</h3><p>The <a href="https://financial-analytics-databricks.streamlit.app/">live dashboard</a> is the working end of the pipeline: 15 years of US and European market data, interactive and filterable by period, reading live from Databricks with no local data files or intermediate exports.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u-9HpKwFy9nWmyWVyh8yWg.png" /><figcaption><em>Dashboard home — the pipeline and the migration tool</em></figcaption></figure><p>The Analytics page shows 15 years of real US and European market data: how the two markets moved together during crises, the ECB’s eight years of negative rates (2014–2022), the fastest rate rises in four decades in 2022, and how quickly both markets recovered after COVID. Interactive date filters can isolate any period.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o7QxHqVBlHnuvNtJMlPwww.png" /><figcaption><em>Analytics Dashboard: 15 years of US and European market data, drawn from the Gold layer output</em></figcaption></figure><p>The Converter page takes SAS code and returns PySpark.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*84UQXg80ATHLpdApFbJX0Q.png" /><figcaption>SAS-to-PySpark Converter</figcaption></figure><h3>Built with Claude Code</h3><p>The project was built with Claude Code (Anthropic’s AI coding assistant) as a development collaborator: architecture decisions, the quality checks module, the converter’s rule engine design, and iterative review across all three pipeline layers. The converter uses the same Claude API as its fallback for unrecognised SAS patterns.</p><h3>Code</h3><p>Full project on GitHub: <a href="https://github.com/madhurima-nath/databricks-ai-automated-pipeline">Financial Analytics Pipeline on Databricks</a></p><p>Live <a href="https://financial-analytics-databricks.streamlit.app/">Streamlit dashboard</a> connected to Databricks</p><p>Full project write-up: <a href="https://madhurima-nath.github.io/project_related_files/data_migration.html">Financial Analytics Pipeline on Databricks</a></p><p>For the medallion pipeline in detail: <a href="https://medium.com/@m.nath/a-sas-migration-on-databricks-a-hands-on-project-13582e8f7004">A SAS Migration on Databricks: A Hands-On Project</a></p><p>Part 2 — SAS-to-PySpark converter: <a href="https://medium.com/@m.nath/automating-sas-to-pyspark-migration-rule-engine-first-ai-for-the-rest-d9d0b19ca1a8">Automating SAS-to-PySpark Migration: Rule Engine First, AI for the Rest</a></p><p><em>Built with Databricks Free Edition, PySpark, Delta Lake, Streamlit, and Claude Code. Rate data from </em><a href="https://fred.stlouisfed.org/"><em>FRED</em></a><em> (Federal Reserve Economic Data). Equity data from </em><a href="https://finance.yahoo.com/"><em>Yahoo Finance</em></a><em>.</em></p><p><em>The contents of external submissions are not necessarily reflective of the opinions or work of </em><a href="http://mavenanalytics.io/"><em>Maven Analytics</em></a><em> or any of its team members.</em></p><p><em>We believe in fostering lifelong learning and our intent is to provide a platform for the data community to share their work and seek feedback from the Maven Analytics data fam.</em></p><p><a href="https://medium.com/learning-data/how-to-get-your-work-published-by-learning-data-with-maven-analytics-7df21e466a3e?source=friends_link&amp;sk=020dfac485597d602e218968d9ffb395"><em>Submit your own writing here</em></a><em> if you’d like to become a contributor.</em></p><p><em>Happy learning!</em></p><p><em>-Team Maven</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=38a3eb9f16d5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/learning-data/migrating-financial-analytics-to-a-lakehouse-on-databricks-a-working-demo-38a3eb9f16d5">Migrating Financial Analytics to a Lakehouse on Databricks: A Working Demo</a> was originally published in <a href="https://medium.com/learning-data">Learning Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Most SQL Projects Analyse Sales… I Audited Them Instead]]></title>
            <link>https://medium.com/learning-data/most-sql-projects-analyse-sales-i-audited-them-instead-c56ef6454d7c?source=rss----eec44e936bf1---4</link>
            <guid isPermaLink="false">https://medium.com/p/c56ef6454d7c</guid>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[revenue-assurance]]></category>
            <category><![CDATA[sql]]></category>
            <dc:creator><![CDATA[Yovani Pillay]]></dc:creator>
            <pubDate>Thu, 06 Aug 2026 13:31:01 GMT</pubDate>
            <atom:updated>2026-08-06T13:31:01.899Z</atom:updated>
            <content:encoded><![CDATA[<h3>Most SQL projects answer one question</h3><blockquote><em>What happened?</em></blockquote><p>Mine didn’t. It asked something different…</p><p><strong><em>Can reported revenue be fully attributed to visible transaction components, and if not, what operational control weaknesses are reducing the reliability of transaction-level reporting?</em></strong></p><p>That single question completely changed how I approached this project. Instead of building another sales dashboard, or doing another menu engineering or customer behaviour analysis, I treated a restaurant point-of-sale (POS) dataset as if I were conducting an internal revenue assurance audit.</p><p>The result wasn’t just another SQL project. It became an exercise in commercial thinking.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*fKFfgFUSZUr5PVW9b1md5w.png" /><figcaption><strong>Executive Audit Overview:</strong> <em>An executive summary of the audit, key findings, quantified exceptions, and management recommendations.</em></figcaption></figure><h4><strong>Every SQL project starts with data. Mine started with a business question…</strong></h4><p>When I first explored the dataset, it would have been easy to analyse revenue trends or identify the best-selling menu items. Those questions are valuable but, they weren’t the most interesting questions.</p><p>Instead, I asked:</p><p><em>Could reported revenue be fully reconciled to visible transaction components?</em></p><p>If the answer was no… <em>Why?</em></p><p><strong>That changed everything.</strong></p><p>Instead of organising the analysis around tables and joins, I organised it around an audit investigation.</p><p>The workflow became:</p><ul><li>Data preparation and validation</li><li>Revenue reconciliation</li><li>Exception analysis</li><li>Root cause assessment</li><li>Management recommendations</li><li>KPI development</li></ul><p>Every SQL query had a business purpose.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*yby7WuaSEgcetG9gLuNgMA.png" /><figcaption><strong>Analytical Framework:</strong> <em>The structured analytical workflow used to transform a raw POS extract into a revenue assurance audit supported by documented SQL and business interpretation.</em></figcaption></figure><p><strong>One lesson surprised me…</strong></p><p>The audit identified:</p><ul><li>494 revenue attribution exceptions</li><li>$340.10 of unattributed revenue within the audit sample</li></ul><p>At first glance those two numbers tell very different stories. Almost five hundred exceptions sound serious, whilst three hundred and forty dollars doesn’t. That’s when I realised something. Commercial analysts shouldn’t confuse <strong>frequency</strong> with <strong>financial exposure</strong> as those are different dimensions of risk.</p><p>That distinction changed the way I interpreted every subsequent finding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/671/1*5aX9Lr3DIhS9tfDAvGnF5g.png" /><figcaption><strong>Revenue Accountability Bridge:</strong> <em>The reconciliation of reported revenue to visible transaction components, quantifying the unattributed revenue identified within the audit sample.</em></figcaption></figure><h4><strong>The project wasn’t really about revenue</strong></h4><p>This might sound strange. Yes, the project identified revenue attribution exceptions. But I don’t think revenue was the most important outcome. The real outcome was confidence. Or more accurately… Confidence in management information.</p><p>The analysis identified:</p><ul><li>missing transaction attributes</li><li>inconsistent reporting labels</li><li>incomplete transactions</li><li>a confirmed pricing configuration defect</li></ul><p>None of those automatically indicate “lost revenue”. What they indicate is reduced confidence in transaction-level reporting. That’s a different conversation. And, arguably, a more important one.</p><h4><strong>The “So What?” Test</strong></h4><p>Every analysis eventually reaches the same point. Someone asks:</p><p><em>So what?</em></p><p>If the answer is simply:</p><p>“<em>Interesting.</em>”</p><p>The analysis probably isn’t finished. The recommendations should change something.</p><p>In this case they focused on:</p><ul><li>strengthening transaction capture</li><li>correcting confirmed configuration issues</li><li>standardising reporting logic</li><li>implementing KPI-based monitoring</li></ul><p>Notice what’s missing?</p><p>I never claimed these actions would increase revenue because I couldn’t prove that. Instead, the recommendations improve the quality of the information management relies on. That’s what the evidence supported.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/472/1*kO--NXinCnbQ1W6LicouUw.png" /><figcaption><strong>Root Cause Summary:</strong> <em>Root cause analysis linking audit findings to operational risks, evidence-based recommendations, and the expected benefits of strengthening transaction controls.</em></figcaption></figure><h4><strong>What this project taught me</strong></h4><p>The biggest lesson wasn’t about SQL. It was about restraint. As analysts, we’re often tempted to make bold claims. But good analysis isn’t about saying the most interesting thing. It’s about saying the most accurate thing.</p><p>Throughout this project I deliberately avoided describing unattributed revenue as “lost revenue” because the available evidence didn’t support that conclusion. Ironically, I think that made the project stronger.</p><h3><strong>Final thoughts</strong></h3><p>When I started this project, I wanted to improve my SQL. When I finished, I realised I’d learned something more valuable. Technical skills help you answer questions, but commercial thinking helps you ask better ones. For me, that’s the difference between writing SQL and delivering analysis that supports decision-making.</p><p><em>The full </em><a href="https://mavenshowcase.com/project/57049"><em>project</em></a><em> is available on Maven Showcase. If you have any questions or would just like to provide feedback for improvement, please feel free to reach out to me in the comments below or feel free to reach out to me on </em><a href="https://www.linkedin.com/in/yovanipillay"><em>LinkedIn</em></a><em>.</em></p><p><em>The contents of external submissions are not necessarily reflective of the opinions or work of </em><a href="http://mavenanalytics.io/"><em>Maven Analytics</em></a><em> or any of its team members.</em></p><p><em>We believe in fostering lifelong learning and our intent is to provide a platform for the data community to share their work and seek feedback from the Maven Analytics data fam.</em></p><p><a href="https://medium.com/learning-data/how-to-get-your-work-published-by-learning-data-with-maven-analytics-7df21e466a3e?source=friends_link&amp;sk=020dfac485597d602e218968d9ffb395"><em>Submit your own writing here</em></a><em> if you’d like to become a contributor.</em></p><p><em>Happy learning!</em></p><p><em>-Team Maven</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c56ef6454d7c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/learning-data/most-sql-projects-analyse-sales-i-audited-them-instead-c56ef6454d7c">Most SQL Projects Analyse Sales… I Audited Them Instead</a> was originally published in <a href="https://medium.com/learning-data">Learning Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>