<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TDS Notes</title><link>/</link><description>Recent content on TDS Notes</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 19 Jan 2024 00:00:00 +0000</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>1. File Formats &amp; Data Handling</title><link>/docs/1.-file-formats--data-handling/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/1.-file-formats--data-handling/</guid><description>&lt;h2 id="1-file-formats--data-handling"&gt;1. File Formats &amp;amp; Data Handling&lt;a class="anchor" href="#1-file-formats--data-handling"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-markdown-md"&gt;1. Markdown (&lt;code&gt;.md&lt;/code&gt;)&lt;a class="anchor" href="#1-markdown-md"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lightweight, &lt;strong&gt;human-readable&lt;/strong&gt; documentation format&lt;/li&gt;
&lt;li&gt;Converts easily to &lt;strong&gt;HTML&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Simple syntax:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;# Heading 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;## Heading 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;**bold**, *italic*, &lt;span style="color:#0ff;font-weight:bold"&gt;`code`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;-&lt;/span&gt; bullet point
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="font-weight:bold"&gt;link text&lt;/span&gt;](&lt;span style="color:#007f7f"&gt;url&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;![&lt;span style="font-weight:bold"&gt;image&lt;/span&gt;](&lt;span style="color:#007f7f"&gt;path&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Best for: README files, documentation, notebooks, wikis&lt;/li&gt;
&lt;li&gt;❌ NOT suitable for complex formatted documents (use DOCX)&lt;/li&gt;
&lt;li&gt;❌ NOT binary - fully readable as plain text&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-docx-word-document"&gt;2. DOCX (Word Document)&lt;a class="anchor" href="#2-docx-word-document"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Word format&lt;/li&gt;
&lt;li&gt;Supports rich formatting: tables, headers, page numbers, styles&lt;/li&gt;
&lt;li&gt;NOT ideal for lightweight documentation&lt;/li&gt;
&lt;li&gt;NOT easily converted to HTML without tools&lt;/li&gt;
&lt;li&gt;Best for: formal reports, letters, documents sent to clients&lt;/li&gt;
&lt;li&gt;❌ Binary format - not human-readable as plain text&lt;/li&gt;
&lt;li&gt;❌ Requires Word or compatible software to open properly&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-binary-blob"&gt;3. Binary Blob&lt;a class="anchor" href="#3-binary-blob"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Raw binary data with no human-readable structure&lt;/li&gt;
&lt;li&gt;Cannot be opened in text editor meaningfully&lt;/li&gt;
&lt;li&gt;Examples: compiled files, encrypted data, raw image data&lt;/li&gt;
&lt;li&gt;❌ NOT suitable for documentation&lt;/li&gt;
&lt;li&gt;❌ NOT human-readable&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-parquet"&gt;4. Parquet&lt;a class="anchor" href="#4-parquet"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Columnar&lt;/strong&gt; storage format&lt;/li&gt;
&lt;li&gt;Most efficient for &lt;strong&gt;large numeric arrays&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Minimal storage overhead - uses compression&lt;/li&gt;
&lt;li&gt;Stores data type information (schema-aware)&lt;/li&gt;
&lt;li&gt;Best for: big data, analytics pipelines, data lakes&lt;/li&gt;
&lt;li&gt;Comparison:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Format&lt;/th&gt;
 &lt;th&gt;Human-Readable&lt;/th&gt;
 &lt;th&gt;Efficient&lt;/th&gt;
 &lt;th&gt;Schema&lt;/th&gt;
 &lt;th&gt;Best For&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Parquet&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;✅✅✅&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Large numeric arrays&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CSV&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Sharing with stakeholders&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;JSON&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Partial&lt;/td&gt;
 &lt;td&gt;APIs, nested data&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;XML&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;❌❌&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Legacy systems&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Reading/writing Parquet with pandas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.to_parquet(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.parquet&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = pd.read_parquet(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.parquet&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-xml-extensible-markup-language"&gt;5. XML (eXtensible Markup Language)&lt;a class="anchor" href="#5-xml-extensible-markup-language"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Human-readable but &lt;strong&gt;very verbose&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Uses tags: &lt;code&gt;&amp;lt;tag&amp;gt;value&amp;lt;/tag&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;High overhead - lots of repeated tag text&lt;/li&gt;
&lt;li&gt;NOT efficient for large numeric data&lt;/li&gt;
&lt;li&gt;Best for: configuration files, legacy data exchange, SOAP APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;&amp;lt;!-- Example: verbose compared to other formats --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;&amp;lt;record&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;John&lt;span style="font-weight:bold"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;&amp;lt;age&amp;gt;&lt;/span&gt;25&lt;span style="font-weight:bold"&gt;&amp;lt;/age&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;&amp;lt;salary&amp;gt;&lt;/span&gt;50000&lt;span style="font-weight:bold"&gt;&amp;lt;/salary&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;&amp;lt;/record&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-json-javascript-object-notation"&gt;6. JSON (JavaScript Object Notation)&lt;a class="anchor" href="#6-json-javascript-object-notation"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Human-readable, flexible format&lt;/li&gt;
&lt;li&gt;Supports nested structures&lt;/li&gt;
&lt;li&gt;NOT efficient for large numeric arrays&lt;/li&gt;
&lt;li&gt;Best for: APIs, configuration files, nested/hierarchical data&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Reading JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.json&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data = json.load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Writing JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.json&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json.dump(data, f, indent=&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Parse JSON string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data = json.loads(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{&amp;#34;name&amp;#34;: &amp;#34;John&amp;#34;, &amp;#34;age&amp;#34;: 25}&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Convert to JSON string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;json_str = json.dumps(data, indent=&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# From API response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.get(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data = response.json() &lt;span style="color:#007f7f"&gt;# parse JSON response directly&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-csv-comma-separated-values"&gt;7. CSV (Comma-Separated Values)&lt;a class="anchor" href="#7-csv-comma-separated-values"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Simple, &lt;strong&gt;human-readable&lt;/strong&gt; tabular format&lt;/li&gt;
&lt;li&gt;Best for &lt;strong&gt;sharing results with non-technical stakeholders&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Can be opened directly in Excel&lt;/li&gt;
&lt;li&gt;No schema enforcement - all values stored as text&lt;/li&gt;
&lt;li&gt;Limitations: no data types, no nested structures, no compression&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# pandas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.to_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.csv&amp;#39;&lt;/span&gt;, index=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Custom delimiter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.tsv&amp;#39;&lt;/span&gt;, sep=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\t&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# tab-delimited&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Built-in csv module&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reader = csv.DictReader(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; row in reader:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(row)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Best for sharing summary results with non-technical stakeholders&lt;/li&gt;
&lt;li&gt;❌ Python pickle (&lt;code&gt;.pkl&lt;/code&gt;) - not human-readable, not cross-platform safe&lt;/li&gt;
&lt;li&gt;❌ JSON with nested structures - harder to open in Excel&lt;/li&gt;
&lt;li&gt;❌ Binary database file - not accessible without tools&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="8-file-format-comparison---complete"&gt;8. File Format Comparison - Complete&lt;a class="anchor" href="#8-file-format-comparison---complete"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Format&lt;/th&gt;
 &lt;th&gt;Readable&lt;/th&gt;
 &lt;th&gt;Size&lt;/th&gt;
 &lt;th&gt;Types&lt;/th&gt;
 &lt;th&gt;Nested&lt;/th&gt;
 &lt;th&gt;Best Use&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Markdown&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Small&lt;/td&gt;
 &lt;td&gt;Text&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Documentation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Stakeholder sharing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;Partial&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;APIs, config&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;XML&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Large&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Legacy, SOAP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Parquet&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Small&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Big data, analytics&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DOCX&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Formal documents&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Pickle&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Small&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Python-only objects&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;HDF5&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Small&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Scientific data&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="9-excel-text-to-columns---auto-date-conversion-problem"&gt;9. Excel Text-to-Columns - Auto-Date Conversion Problem&lt;a class="anchor" href="#9-excel-text-to-columns---auto-date-conversion-problem"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="problem"&gt;Problem:&lt;a class="anchor" href="#problem"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Tab-delimited file contains: &amp;#34;3/10&amp;#34;
Excel auto-interprets as: &amp;#34;March 10&amp;#34; (date)&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="fix"&gt;Fix:&lt;a class="anchor" href="#fix"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Format the column as Text BEFORE applying Text-to-Columns&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;This tells Excel to treat the column as plain text, not numbers or dates&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="steps"&gt;Steps:&lt;a class="anchor" href="#steps"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. Select the column(s) in Excel
2. Format → Cells → Text
3. THEN apply Data → Text to Columns
4. In the wizard → select &amp;#34;Text&amp;#34; as column data format&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;❌ Changing delimiter to commas → doesn&amp;rsquo;t fix data type issue&lt;/li&gt;
&lt;li&gt;❌ Using General format → still auto-converts to date&lt;/li&gt;
&lt;li&gt;❌ Manually changing cells after → tedious, error-prone&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="10-excel-text-to-columns---leading-zeros-problem"&gt;10. Excel Text-to-Columns - Leading Zeros Problem&lt;a class="anchor" href="#10-excel-text-to-columns---leading-zeros-problem"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="problem-1"&gt;Problem:&lt;a class="anchor" href="#problem-1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;File contains: &amp;#34;001234&amp;#34;
Excel auto-converts to: 1234 (drops leading zeros)&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="fix-1"&gt;Fix:&lt;a class="anchor" href="#fix-1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Format cells as Text BEFORE using Text-to-Columns&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Same fix as above - Text format preserves leading zeros&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="common-cases-where-leading-zeros-matter"&gt;Common cases where leading zeros matter:&lt;a class="anchor" href="#common-cases-where-leading-zeros-matter"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Postal/ZIP codes: &lt;code&gt;00123&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Phone numbers: &lt;code&gt;0412345678&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Product codes: &lt;code&gt;001234&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Student IDs: &lt;code&gt;0045&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="11-the-universal-fix---format-as-text-first"&gt;11. The Universal Fix - Format as Text First&lt;a class="anchor" href="#11-the-universal-fix---format-as-text-first"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="when-to-always-format-as-text-before-import"&gt;When to ALWAYS format as Text before import:&lt;a class="anchor" href="#when-to-always-format-as-text-before-import"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Values that look like dates but aren&amp;rsquo;t (&lt;code&gt;3/10&lt;/code&gt;, &lt;code&gt;1-2&lt;/code&gt;, &lt;code&gt;12/5&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Values with leading zeros (&lt;code&gt;001234&lt;/code&gt;, &lt;code&gt;0045&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Long numeric IDs that might be converted to scientific notation&lt;/li&gt;
&lt;li&gt;Values with special characters that might be misinterpreted&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="in-text-to-columns-wizard"&gt;In Text-to-Columns Wizard:&lt;a class="anchor" href="#in-text-to-columns-wizard"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Step 3 of 3 in wizard:
→ Click on the problematic column
→ Under &amp;#34;Column data format&amp;#34; select &amp;#34;Text&amp;#34;
→ Finish&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="12-python-csv-module"&gt;12. Python &lt;code&gt;csv&lt;/code&gt; Module&lt;a class="anchor" href="#12-python-csv-module"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Reading CSV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, newline=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reader = csv.reader(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; header = &lt;span style="color:#fff;font-weight:bold"&gt;next&lt;/span&gt;(reader) &lt;span style="color:#007f7f"&gt;# skip header&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; row in reader:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(row) &lt;span style="color:#007f7f"&gt;# list of values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Reading as dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reader = csv.DictReader(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; row in reader:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(row[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;], row[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;age&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Writing CSV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.csv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;, newline=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; writer = csv.writer(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; writer.writerow([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;age&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;salary&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# header&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; writer.writerow([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;John&amp;#39;&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;25&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;50000&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Custom delimiter (tab-delimited)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.tsv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reader = csv.reader(f, delimiter=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\t&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Handling special characters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reader = csv.reader(f)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="13-python-json-module---complete-reference"&gt;13. Python &lt;code&gt;json&lt;/code&gt; Module - Complete Reference&lt;a class="anchor" href="#13-python-json-module---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Parse JSON string → Python object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data = json.loads(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{&amp;#34;name&amp;#34;: &amp;#34;John&amp;#34;, &amp;#34;age&amp;#34;: 25}&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Convert Python object → JSON string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;json_str = json.dumps(data, indent=&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Read JSON file → Python object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.json&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data = json.load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Write Python object → JSON file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.json&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json.dump(data, f, indent=&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Handling nested JSON (API response)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response_json = {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;weather&amp;#34;&lt;/span&gt;: [{&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;clear sky&amp;#34;&lt;/span&gt;}],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: {&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;temp&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;298.15&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;humidity&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;60&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Access nested fields&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weather&amp;#39;&lt;/span&gt;][&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;temperature = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Common json.dumps options&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;json.dumps(data, indent=&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# pretty print&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;json.dumps(data, sort_keys=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# sort keys alphabetically&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;json.dumps(data, ensure_ascii=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# allow non-ASCII characters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;json.dumps(data, default=&lt;span style="color:#fff;font-weight:bold"&gt;str&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# handle non-serializable types&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="14-python-pickle---when-not-to-use"&gt;14. Python Pickle - When NOT to Use&lt;a class="anchor" href="#14-python-pickle---when-not-to-use"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pickle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Save Python object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;model.pkl&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pickle.dump(model, f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Load Python object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;model.pkl&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model = pickle.load(f)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="pickle-limitations"&gt;Pickle Limitations:&lt;a class="anchor" href="#pickle-limitations"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;❌ NOT human-readable (binary format)&lt;/li&gt;
&lt;li&gt;❌ NOT cross-platform safe (Python version dependent)&lt;/li&gt;
&lt;li&gt;❌ NOT secure - can execute arbitrary code on load&lt;/li&gt;
&lt;li&gt;❌ NOT suitable for sharing with non-technical stakeholders&lt;/li&gt;
&lt;li&gt;✅ OK for: saving Python ML models temporarily&lt;/li&gt;
&lt;li&gt;✅ Better alternatives: &lt;code&gt;joblib&lt;/code&gt; for ML models, &lt;code&gt;parquet&lt;/code&gt; for data, &lt;code&gt;json&lt;/code&gt; for configs&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="quick-reference-card"&gt;Quick Reference Card&lt;a class="anchor" href="#quick-reference-card"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Documentation needed?
→ Markdown (.md)

Sharing data with non-technical users?
→ CSV (opens in Excel)

Large numeric dataset in pipeline?
→ Parquet

API data / nested data?
→ JSON

Formal Word document?
→ DOCX

Excel importing numbers as dates or dropping leading zeros?
→ Format column as Text BEFORE Text-to-Columns

Comparing formats for efficiency?
→ Parquet &amp;gt; CSV &amp;gt; JSON &amp;gt; XML
 (storage efficiency, NOT readability)&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>2. Shell &amp; Command Line</title><link>/docs/2.-shell--command-line/</link><pubDate>Tue, 02 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/2.-shell--command-line/</guid><description>&lt;h2 id="2-shell--command-line"&gt;2. Shell &amp;amp; Command Line&lt;a class="anchor" href="#2-shell--command-line"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-ls---list-directory-contents"&gt;1. &lt;code&gt;ls&lt;/code&gt; - List Directory Contents&lt;a class="anchor" href="#1-ls---list-directory-contents"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="basic-usage"&gt;Basic Usage:&lt;a class="anchor" href="#basic-usage"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls &lt;span style="color:#007f7f"&gt;# list files in current directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls /path/to/dir &lt;span style="color:#007f7f"&gt;# list files in specific directory&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="all-important-flags"&gt;All Important Flags:&lt;a class="anchor" href="#all-important-flags"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -a &lt;span style="color:#007f7f"&gt;# list ALL files including hidden ✅ (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -l &lt;span style="color:#007f7f"&gt;# long format (permissions, size, date, owner)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -h &lt;span style="color:#007f7f"&gt;# human-readable sizes (KB, MB, GB) - NOT hidden files ❌&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -la &lt;span style="color:#007f7f"&gt;# long format + hidden files combined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -lh &lt;span style="color:#007f7f"&gt;# long format + human-readable sizes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -lt &lt;span style="color:#007f7f"&gt;# sort by modification time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -lr &lt;span style="color:#007f7f"&gt;# reverse order&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -lS &lt;span style="color:#007f7f"&gt;# sort by file size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -R &lt;span style="color:#007f7f"&gt;# recursive (list subdirectories too)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="hidden-files"&gt;Hidden Files:&lt;a class="anchor" href="#hidden-files"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Start with &lt;code&gt;.&lt;/code&gt; (dot)&lt;/li&gt;
&lt;li&gt;Examples: &lt;code&gt;.gitignore&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.ssh/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls&lt;/code&gt; without &lt;code&gt;-a&lt;/code&gt; → hidden files NOT shown&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -a&lt;/code&gt; → ALL files shown including hidden ✅&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;ls -h&lt;/code&gt; → human-readable sizes (NOT hidden)&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;show -a&lt;/code&gt; → not a valid Unix command&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;dir /ah&lt;/code&gt; → Windows command only&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="long-format-ls--la-output"&gt;Long Format (&lt;code&gt;ls -la&lt;/code&gt;) Output:&lt;a class="anchor" href="#long-format-ls--la-output"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -la
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Output:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# drwxr-xr-x 5 user group 4096 Dec 14 16:45 .&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# drwxr-xr-x 20 user group 4096 Dec 13 10:22 ..&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# -rw-r--r-- 1 user group 220 Dec 14 09:00 .bashrc ← hidden&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# -rw-r--r-- 1 user group 156 Dec 14 09:00 .gitignore ← hidden&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# drwxr-xr-x 2 user group 4096 Dec 14 16:45 data/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# -rw-r--r-- 1 user group 2048 Dec 14 16:45 script.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Columns: permissions | links | owner | group | size | date | name&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="2-find---search-for-files-by-name"&gt;2. &lt;code&gt;find&lt;/code&gt; - Search for Files by NAME&lt;a class="anchor" href="#2-find---search-for-files-by-name"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find files by name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;*.py&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# all Python files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;data.csv&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# specific file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find /home -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;*.log&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# in specific directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Pine Ridge&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ❌ finds FILE named &amp;#34;Pine Ridge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# NOT content inside files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -type f -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;*.csv&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# files only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -type d -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;data&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# directories only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -size +10M &lt;span style="color:#007f7f"&gt;# files larger than 10MB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -size -1k &lt;span style="color:#007f7f"&gt;# files smaller than 1KB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find and execute command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;*.log&amp;#34;&lt;/span&gt; -exec cat {} &lt;span style="color:#0ff;font-weight:bold"&gt;\;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# cat all log files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;*.pyc&amp;#34;&lt;/span&gt; -exec rm {} &lt;span style="color:#0ff;font-weight:bold"&gt;\;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# delete all .pyc files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find modified recently&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -mtime -7 &lt;span style="color:#007f7f"&gt;# modified in last 7 days&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -mtime +30 &lt;span style="color:#007f7f"&gt;# modified more than 30 days ago&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="find-vs-grep"&gt;&lt;code&gt;find&lt;/code&gt; vs &lt;code&gt;grep&lt;/code&gt;:&lt;a class="anchor" href="#find-vs-grep"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Command&lt;/th&gt;
 &lt;th&gt;Searches&lt;/th&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;find&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File NAMES&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;find . -name &amp;quot;*.log&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File CONTENTS&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;grep &amp;quot;error&amp;quot; logfile.txt&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="3-cat---display-file-contents"&gt;3. &lt;code&gt;cat&lt;/code&gt; - Display File Contents&lt;a class="anchor" href="#3-cat---display-file-contents"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat file.txt &lt;span style="color:#007f7f"&gt;# display entire file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat file1.txt file2.txt &lt;span style="color:#007f7f"&gt;# display multiple files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat -n file.txt &lt;span style="color:#007f7f"&gt;# display with line numbers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; newfile.txt &lt;span style="color:#007f7f"&gt;# create new file (type content, Ctrl+D to end)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt;&amp;gt; file.txt &lt;span style="color:#007f7f"&gt;# append to file&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;❌ Does NOT search content (use &lt;code&gt;grep&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;❌ NOT suitable for very large files (use &lt;code&gt;less&lt;/code&gt; or &lt;code&gt;head&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-grep---search-text-inside-files"&gt;4. &lt;code&gt;grep&lt;/code&gt; - Search Text INSIDE Files&lt;a class="anchor" href="#4-grep---search-text-inside-files"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="basic-usage-1"&gt;Basic Usage:&lt;a class="anchor" href="#basic-usage-1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;search_term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# search in file ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Pine Ridge&amp;#34;&lt;/span&gt; evacuation.txt &lt;span style="color:#007f7f"&gt;# find all lines with &amp;#34;Pine Ridge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;error&amp;#34;&lt;/span&gt; app.log &lt;span style="color:#007f7f"&gt;# find error lines in log&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="important-flags"&gt;Important Flags:&lt;a class="anchor" href="#important-flags"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -i &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# case-insensitive search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -n &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# show line numbers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -v &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# invert - lines NOT containing term&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -c &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# count matching lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -l &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; *.txt &lt;span style="color:#007f7f"&gt;# list files containing term&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -r &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; ./dir/ &lt;span style="color:#007f7f"&gt;# recursive search in directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -w &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# whole word match only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -A &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# show 2 lines AFTER match&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -B &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;term&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# show 2 lines BEFORE match&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# extended regex ✅ (exam relevant)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="grep-with-regex"&gt;grep with Regex:&lt;a class="anchor" href="#grep-with-regex"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;[0-9]+&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# lines with numbers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;^ERROR&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# lines starting with ERROR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;\.py&lt;/span&gt;$&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# lines ending with .py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;(GET|POST)&amp;#34;&lt;/span&gt; access.log &lt;span style="color:#007f7f"&gt;# lines with GET or POST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;1[0-5][0-9]&amp;#34;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# match time range pattern&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-awk---field-extraction--processing"&gt;5. &lt;code&gt;awk&lt;/code&gt; - Field Extraction &amp;amp; Processing&lt;a class="anchor" href="#5-awk---field-extraction--processing"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="basic-usage-2"&gt;Basic Usage:&lt;a class="anchor" href="#basic-usage-2"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# print first field&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $3, $7}&amp;#39;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# print 3rd and 7th fields ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk -F&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; file.csv &lt;span style="color:#007f7f"&gt;# use comma as delimiter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print NR, $0}&amp;#39;&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# print with line numbers&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="common-patterns"&gt;Common Patterns:&lt;a class="anchor" href="#common-patterns"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Print specific fields from log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $1, $4, $7}&amp;#39;&lt;/span&gt; access.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Filter and print&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;$9 == 200 {print $0}&amp;#39;&lt;/span&gt; access.log &lt;span style="color:#007f7f"&gt;# lines where 9th field = 200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Calculate sum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{sum += $5} END {print sum}&amp;#39;&lt;/span&gt; file.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Print lines matching condition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;$7 ~ /\/checkout/&amp;#39;&lt;/span&gt; access.log &lt;span style="color:#007f7f"&gt;# URL contains /checkout/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count occurrences&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{count[$7]++} END {for (url in count) print count[url], url}&amp;#39;&lt;/span&gt; log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="special-variables"&gt;Special Variables:&lt;a class="anchor" href="#special-variables"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;$0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Entire line&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;&amp;hellip;&lt;/td&gt;
 &lt;td&gt;Field 1, 2&amp;hellip;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Current line number&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NF&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Number of fields&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Field separator&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="6-sort---sort-output"&gt;6. &lt;code&gt;sort&lt;/code&gt; - Sort Output&lt;a class="anchor" href="#6-sort---sort-output"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort file.txt &lt;span style="color:#007f7f"&gt;# alphabetical sort&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -n file.txt &lt;span style="color:#007f7f"&gt;# numeric sort&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -r file.txt &lt;span style="color:#007f7f"&gt;# reverse order&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -nr file.txt &lt;span style="color:#007f7f"&gt;# numeric reverse ✅ (exam relevant - sort -nr)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -k2 file.txt &lt;span style="color:#007f7f"&gt;# sort by 2nd field&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -k2 -n file.txt &lt;span style="color:#007f7f"&gt;# sort by 2nd field numerically&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -u file.txt &lt;span style="color:#007f7f"&gt;# sort and remove duplicates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -t&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; -k2 file.csv &lt;span style="color:#007f7f"&gt;# sort CSV by 2nd column&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-uniq---countremove-duplicates"&gt;7. &lt;code&gt;uniq&lt;/code&gt; - Count/Remove Duplicates&lt;a class="anchor" href="#7-uniq---countremove-duplicates"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uniq file.txt &lt;span style="color:#007f7f"&gt;# remove consecutive duplicates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uniq -c file.txt &lt;span style="color:#007f7f"&gt;# count occurrences ✅ (exam relevant)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uniq -d file.txt &lt;span style="color:#007f7f"&gt;# show only duplicates&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uniq -u file.txt &lt;span style="color:#007f7f"&gt;# show only unique lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# IMPORTANT: uniq only works on SORTED input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Always sort before uniq:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort file.txt | uniq -c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-head-and-tail---view-file-portions"&gt;8. &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; - View File Portions&lt;a class="anchor" href="#8-head-and-tail---view-file-portions"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;head file.txt &lt;span style="color:#007f7f"&gt;# first 10 lines (default)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;head -n &lt;span style="color:#ff0;font-weight:bold"&gt;20&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# first 20 lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;head -1000 file.txt &lt;span style="color:#007f7f"&gt;# first 1000 lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tail file.txt &lt;span style="color:#007f7f"&gt;# last 10 lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tail -n &lt;span style="color:#ff0;font-weight:bold"&gt;20&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# last 20 lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tail -f file.txt &lt;span style="color:#007f7f"&gt;# follow file in real-time (for logs) ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="9-wc---wordlinecharacter-count"&gt;9. &lt;code&gt;wc&lt;/code&gt; - Word/Line/Character Count&lt;a class="anchor" href="#9-wc---wordlinecharacter-count"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wc file.txt &lt;span style="color:#007f7f"&gt;# lines, words, characters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wc -l file.txt &lt;span style="color:#007f7f"&gt;# count lines only ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wc -w file.txt &lt;span style="color:#007f7f"&gt;# count words only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wc -c file.txt &lt;span style="color:#007f7f"&gt;# count bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wc -m file.txt &lt;span style="color:#007f7f"&gt;# count characters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count lines matching pattern&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;ERROR&amp;#34;&lt;/span&gt; app.log | wc -l&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="10-shell-pipeline---combining-commands"&gt;10. Shell Pipeline - Combining Commands&lt;a class="anchor" href="#10-shell-pipeline---combining-commands"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="the--pipe-operator"&gt;The &lt;code&gt;|&lt;/code&gt; (pipe) operator:&lt;a class="anchor" href="#the--pipe-operator"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Takes &lt;strong&gt;output of left command&lt;/strong&gt; as &lt;strong&gt;input to right command&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Can chain multiple commands together&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="complete-log-analysis-pipeline"&gt;Complete Log Analysis Pipeline:&lt;a class="anchor" href="#complete-log-analysis-pipeline"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Exam-relevant pipeline for large log file analysis:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;(0[89]|1[0-8]):[0-5][0-9]&amp;#34;&lt;/span&gt; traffic.log &lt;span style="color:#0ff;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $3, $7}&amp;#39;&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| sort &lt;span style="color:#0ff;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| uniq -c &lt;span style="color:#0ff;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| sort -nr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Breakdown:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# grep -E &amp;#34;...&amp;#34; → filter lines matching time pattern&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# awk &amp;#39;{...}&amp;#39; → extract fields 3 and 7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# sort → sort alphabetically (needed before uniq)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# uniq -c → count unique occurrences&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# sort -nr → sort by count, highest first&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="other-useful-pipelines"&gt;Other Useful Pipelines:&lt;a class="anchor" href="#other-useful-pipelines"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count HTTP status codes in log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $9}&amp;#39;&lt;/span&gt; access.log | sort | uniq -c | sort -nr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find most common IP addresses&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt; access.log | sort | uniq -c | sort -nr | head -10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find all POST requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;POST&amp;#34;&lt;/span&gt; access.log | awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $7}&amp;#39;&lt;/span&gt; | sort | uniq -c | sort -nr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count errors by hour&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;ERROR&amp;#34;&lt;/span&gt; app.log | awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print substr($2,1,2)}&amp;#39;&lt;/span&gt; | sort | uniq -c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Search specific pattern and count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -c &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;404&amp;#34;&lt;/span&gt; access.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Extract unique URLs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $7}&amp;#39;&lt;/span&gt; access.log | sort -u&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="11-dir-ah---windows-command-not-unix"&gt;11. &lt;code&gt;dir /ah&lt;/code&gt; - Windows Command (NOT Unix)&lt;a class="anchor" href="#11-dir-ah---windows-command-not-unix"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Windows: dir /ah ← lists hidden files in Windows
Unix: ls -a ← lists hidden files in Unix/Linux/Mac

❌ dir /ah does NOT work on Unix/Linux/Mac
❌ show -a does not exist in any standard shell&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="12-other-essential-shell-commands"&gt;12. Other Essential Shell Commands&lt;a class="anchor" href="#12-other-essential-shell-commands"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="directory-navigation"&gt;Directory Navigation:&lt;a class="anchor" href="#directory-navigation"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;pwd&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# print working directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;cd&lt;/span&gt; /path/to/dir &lt;span style="color:#007f7f"&gt;# change directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;cd&lt;/span&gt; .. &lt;span style="color:#007f7f"&gt;# go up one level&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;cd&lt;/span&gt; ~ &lt;span style="color:#007f7f"&gt;# go to home directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;cd&lt;/span&gt; - &lt;span style="color:#007f7f"&gt;# go to previous directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir new_folder &lt;span style="color:#007f7f"&gt;# create directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p a/b/c &lt;span style="color:#007f7f"&gt;# create nested directories&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rmdir empty_folder &lt;span style="color:#007f7f"&gt;# remove empty directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -rf folder/ &lt;span style="color:#007f7f"&gt;# remove directory and contents (careful!)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="file-operations"&gt;File Operations:&lt;a class="anchor" href="#file-operations"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp source.txt dest.txt &lt;span style="color:#007f7f"&gt;# copy file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp -r source/ dest/ &lt;span style="color:#007f7f"&gt;# copy directory recursively&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv old.txt new.txt &lt;span style="color:#007f7f"&gt;# move/rename file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm file.txt &lt;span style="color:#007f7f"&gt;# remove file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -f file.txt &lt;span style="color:#007f7f"&gt;# force remove (no confirmation)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;touch newfile.txt &lt;span style="color:#007f7f"&gt;# create empty file or update timestamp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="viewing--searching"&gt;Viewing &amp;amp; Searching:&lt;a class="anchor" href="#viewing--searching"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;less file.txt &lt;span style="color:#007f7f"&gt;# view file page by page (better than cat for large files)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;more file.txt &lt;span style="color:#007f7f"&gt;# similar to less&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nano file.txt &lt;span style="color:#007f7f"&gt;# simple text editor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi file.txt &lt;span style="color:#007f7f"&gt;# powerful text editor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Search in less:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# /search_term → forward search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ?search_term → backward search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# n → next match&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# q → quit&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="process-management"&gt;Process Management:&lt;a class="anchor" href="#process-management"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps aux &lt;span style="color:#007f7f"&gt;# list all running processes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;kill&lt;/span&gt; -9 PID &lt;span style="color:#007f7f"&gt;# force kill process&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;top &lt;span style="color:#007f7f"&gt;# real-time process monitor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;htop &lt;span style="color:#007f7f"&gt;# improved process monitor&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="file-permissions"&gt;File Permissions:&lt;a class="anchor" href="#file-permissions"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ff0;font-weight:bold"&gt;755&lt;/span&gt; script.py &lt;span style="color:#007f7f"&gt;# set permissions (rwxr-xr-x)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x script.py &lt;span style="color:#007f7f"&gt;# make executable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ff0;font-weight:bold"&gt;644&lt;/span&gt; file.txt &lt;span style="color:#007f7f"&gt;# rw-r--r--&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chown user:group file.txt &lt;span style="color:#007f7f"&gt;# change owner&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Permission notation:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# r=4, w=2, x=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 755 → rwxr-xr-x (owner: all, group+others: read+execute)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 644 → rw-r--r-- (owner: read+write, others: read only)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="network--downloads"&gt;Network &amp;amp; Downloads:&lt;a class="anchor" href="#network--downloads"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl https://api.example.com/data &lt;span style="color:#007f7f"&gt;# make HTTP request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -O https://example.com/file.zip &lt;span style="color:#007f7f"&gt;# download file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://example.com/file.zip &lt;span style="color:#007f7f"&gt;# download file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -H &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Authorization: Bearer TOKEN&amp;#34;&lt;/span&gt; url &lt;span style="color:#007f7f"&gt;# with header&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -X POST -d &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{&amp;#34;key&amp;#34;:&amp;#34;value&amp;#34;}&amp;#39;&lt;/span&gt; url &lt;span style="color:#007f7f"&gt;# POST request&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="environment-variables"&gt;Environment Variables:&lt;a class="anchor" href="#environment-variables"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;export&lt;/span&gt; API_KEY=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;your_key&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# set environment variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; $API_KEY &lt;span style="color:#007f7f"&gt;# print variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;env &lt;span style="color:#007f7f"&gt;# list all environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;unset&lt;/span&gt; API_KEY &lt;span style="color:#007f7f"&gt;# remove variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;printenv API_KEY &lt;span style="color:#007f7f"&gt;# print specific variable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="13-shell-scripting-basics"&gt;13. Shell Scripting Basics&lt;a class="anchor" href="#13-shell-scripting-basics"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="shebang-and-basic-script"&gt;Shebang and Basic Script:&lt;a class="anchor" href="#shebang-and-basic-script"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0f0;font-weight:bold"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# This is a comment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;John&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Hello, &lt;/span&gt;$NAME&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# User input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;read&lt;/span&gt; -p &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Enter name: &amp;#34;&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Hello, &lt;/span&gt;$name&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Conditionals&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; [ -f &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;file.txt&amp;#34;&lt;/span&gt; ]; &lt;span style="color:#fff;font-weight:bold"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;File exists&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;elif&lt;/span&gt; [ -d &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;folder&amp;#34;&lt;/span&gt; ]; &lt;span style="color:#fff;font-weight:bold"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Folder exists&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Neither exists&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Loops&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; i in {1..5}; &lt;span style="color:#fff;font-weight:bold"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Number: &lt;/span&gt;$i&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; file in *.csv; &lt;span style="color:#fff;font-weight:bold"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Processing: &lt;/span&gt;$file&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# While loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;while&lt;/span&gt; IFS= &lt;span style="color:#fff;font-weight:bold"&gt;read&lt;/span&gt; -r line; &lt;span style="color:#fff;font-weight:bold"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;$line&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;done&lt;/span&gt; &amp;lt; file.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="etl-script-with-idempotency"&gt;ETL Script with Idempotency:&lt;a class="anchor" href="#etl-script-with-idempotency"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0f0;font-weight:bold"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Idempotent ETL script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TEMP_FILE=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;/tmp/output_temp.csv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FINAL_FILE=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;/output/final.csv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LOG_FILE=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;/logs/etl.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;$(&lt;/span&gt;date&lt;span style="color:#fff;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: Starting ETL&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Write to temp file first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python process_data.py &amp;gt; $TEMP_FILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Check if processing succeeded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; [ $? -eq &lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt; ]; &lt;span style="color:#fff;font-weight:bold"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Atomic move to final destination&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mv $TEMP_FILE $FINAL_FILE &lt;span style="color:#007f7f"&gt;# ✅ atomic operation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;$(&lt;/span&gt;date&lt;span style="color:#fff;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: ETL completed&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;$(&lt;/span&gt;date&lt;span style="color:#fff;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: ETL failed&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rm -f $TEMP_FILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;exit&lt;/span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="14-grep-for-log-analysis---exam-scenarios"&gt;14. &lt;code&gt;grep&lt;/code&gt; for Log Analysis - Exam Scenarios&lt;a class="anchor" href="#14-grep-for-log-analysis---exam-scenarios"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="scenario-1-find-entries-related-to-specific-term"&gt;Scenario 1: Find entries related to specific term&lt;a class="anchor" href="#scenario-1-find-entries-related-to-specific-term"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Correct: grep searches CONTENT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Pine Ridge&amp;#34;&lt;/span&gt; evacuation-logs.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong: find searches FILE NAMES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find -name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Pine Ridge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong: ls lists directory contents&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Pine Ridge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong: cat shows everything, no search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat evacuation-logs.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scenario-2-search-across-multiple-files"&gt;Scenario 2: Search across multiple files&lt;a class="anchor" href="#scenario-2-search-across-multiple-files"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -r &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;ERROR&amp;#34;&lt;/span&gt; ./logs/ &lt;span style="color:#007f7f"&gt;# recursive search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;404&amp;#34;&lt;/span&gt; *.log &lt;span style="color:#007f7f"&gt;# all log files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -l &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;critical&amp;#34;&lt;/span&gt; ./logs/* &lt;span style="color:#007f7f"&gt;# list files containing &amp;#34;critical&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="scenario-3-extract-specific-log-entries"&gt;Scenario 3: Extract specific log entries&lt;a class="anchor" href="#scenario-3-extract-specific-log-entries"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# POST requests to /checkout/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;POST /checkout&amp;#34;&lt;/span&gt; access.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Requests between 12:00-15:59&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep -E &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;1[2-5]:[0-5][0-9]&amp;#34;&lt;/span&gt; access.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Combine with awk for field extraction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;POST&amp;#34;&lt;/span&gt; access.log | awk &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;{print $1, $4, $7, $9}&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="shell-commands---quick-reference-card"&gt;Shell Commands - Quick Reference Card&lt;a class="anchor" href="#shell-commands---quick-reference-card"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Navigation &amp;amp; Files:
 pwd → current directory
 ls -a → list all files (including hidden) ✅
 ls -la → long format + hidden
 cd path → change directory
 find → search FILE NAMES

Viewing Content:
 cat → display file (small files)
 less → view file page by page (large files)
 head -n N → first N lines
 tail -n N → last N lines
 tail -f → follow file in real-time

Searching:
 grep &amp;#34;term&amp;#34; file → search CONTENT ✅
 grep -i → case-insensitive
 grep -E &amp;#34;pattern&amp;#34; → extended regex
 grep -r &amp;#34;term&amp;#34; dir → recursive search

Processing:
 awk &amp;#39;{print $N}&amp;#39; → extract field N
 sort → sort output
 sort -nr → numeric reverse sort
 uniq -c → count unique ✅
 wc -l → count lines

Pipeline:
 cmd1 | cmd2 → pipe output to next command
 grep | awk | sort | uniq -c | sort -nr ✅

Log Analysis Pattern:
 grep -E &amp;#34;pattern&amp;#34; log | awk &amp;#39;{print $field}&amp;#39; | sort | uniq -c | sort -nr&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>3. Python File &amp; Memory Handling</title><link>/docs/3.-python-file--memory-handling/</link><pubDate>Wed, 03 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/3.-python-file--memory-handling/</guid><description>&lt;h2 id="3-python-file--memory-handling"&gt;3. Python File &amp;amp; Memory Handling&lt;a class="anchor" href="#3-python-file--memory-handling"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-generator-expression---memory-efficient-file-processing"&gt;1. Generator Expression - Memory-Efficient File Processing&lt;a class="anchor" href="#1-generator-expression---memory-efficient-file-processing"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-a-generator"&gt;What is a Generator?&lt;a class="anchor" href="#what-is-a-generator"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Produces values &lt;strong&gt;one at a time&lt;/strong&gt; on demand&lt;/li&gt;
&lt;li&gt;Does NOT load entire data into memory&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;yield&lt;/code&gt; keyword or generator expressions&lt;/li&gt;
&lt;li&gt;Critical for processing &lt;strong&gt;large files (GBs)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="the-problem-with-loading-entire-file"&gt;The Problem with Loading Entire File:&lt;a class="anchor" href="#the-problem-with-loading-entire-file"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Bad - loads ENTIRE file into memory at once&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lines = &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logfile.txt&amp;#39;&lt;/span&gt;).readlines() &lt;span style="color:#007f7f"&gt;# all lines in RAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in lines:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# If file is 10GB → needs 10GB of RAM → crash&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="generator-solution"&gt;Generator Solution:&lt;a class="anchor" href="#generator-solution"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Good - reads ONE line at a time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logfile.txt&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Only one line in memory at any time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Works for files of ANY size&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="generator-expression-vs-list-comprehension"&gt;Generator Expression vs List Comprehension:&lt;a class="anchor" href="#generator-expression-vs-list-comprehension"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# List comprehension - loads ALL into memory ❌&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results = [process(line) &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Generator expression - one at a time ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results = (process(line) &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Difference:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# List: [...] → eager, all in memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Generator: (...) → lazy, one at a time&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="generator-with-yield"&gt;Generator with &lt;code&gt;yield&lt;/code&gt;:&lt;a class="anchor" href="#generator-with-yield"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; process_logs(filepath):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Generator function - yields one line at a time&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(filepath, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line = line.strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; line: &lt;span style="color:#007f7f"&gt;# skip empty lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;yield&lt;/span&gt; parse_line(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Usage - memory efficient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; entry in process_logs(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; entry[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;] == &lt;span style="color:#ff0;font-weight:bold"&gt;404&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(entry[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# vs loading all at once ❌&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_entries = &lt;span style="color:#fff;font-weight:bold"&gt;list&lt;/span&gt;(process_logs(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log&amp;#39;&lt;/span&gt;)) &lt;span style="color:#007f7f"&gt;# defeats purpose&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="practical-example---large-log-processing"&gt;Practical Example - Large Log Processing:&lt;a class="anchor" href="#practical-example---large-log-processing"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; process_large_log(filepath, filter_func):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; Process large log file without memory issues
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; ✅ Generator pattern - exam answer for large file processing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(filepath, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f: &lt;span style="color:#007f7f"&gt;# reads ONE line at a time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; entry = parse_line(line.strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; entry and filter_func(entry):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;yield&lt;/span&gt; entry
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count POST requests - never loads full file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;post_count = &lt;span style="color:#fff;font-weight:bold"&gt;sum&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; entry in process_large_log(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;lambda&lt;/span&gt; e: e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;method&amp;#39;&lt;/span&gt;] == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Memory usage: constant regardless of file size ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# vs readlines(): proportional to file size ❌&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="2-readlines---why-avoid-for-large-files"&gt;2. &lt;code&gt;readlines()&lt;/code&gt; - Why Avoid for Large Files&lt;a class="anchor" href="#2-readlines---why-avoid-for-large-files"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ readlines() - loads entire file into list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lines = &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logfile&amp;#39;&lt;/span&gt;).readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Returns: [&amp;#39;line1\n&amp;#39;, &amp;#39;line2\n&amp;#39;, &amp;#39;line3\n&amp;#39;, ...]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Problem: 10GB file = 10GB in RAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ read() - even worse, single giant string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content = &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logfile&amp;#39;&lt;/span&gt;).read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ pandas for log files - loads everything&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logfile.csv&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# all rows in RAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Correct alternatives:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 1. Generator (for line in open())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 2. pd.read_csv(chunksize=N)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 3. gzip.open() for compressed files&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="memory-comparison"&gt;Memory Comparison:&lt;a class="anchor" href="#memory-comparison"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;File Size readlines() Generator
─────────────────────────────────────
1 MB 1 MB RAM ~few KB
100 MB 100 MB RAM ~few KB
1 GB 1 GB RAM ~few KB
10 GB CRASH ~few KB&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="3-pdread_csvchunksizen---large-csv-processing"&gt;3. &lt;code&gt;pd.read_csv(chunksize=N)&lt;/code&gt; - Large CSV Processing&lt;a class="anchor" href="#3-pdread_csvchunksizen---large-csv-processing"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="basic-usage"&gt;Basic Usage:&lt;a class="anchor" href="#basic-usage"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Process large CSV in chunks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; chunk in pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;large_file.csv&amp;#39;&lt;/span&gt;, chunksize=&lt;span style="color:#ff0;font-weight:bold"&gt;10000&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# chunk is a regular DataFrame with 10000 rows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(chunk)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Each chunk is processed and discarded before next is loaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Memory: only 10000 rows at a time regardless of file size&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="complete-chunked-processing"&gt;Complete Chunked Processing:&lt;a class="anchor" href="#complete-chunked-processing"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; process_large_csv(filepath, chunksize=&lt;span style="color:#ff0;font-weight:bold"&gt;10000&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Process large CSV without memory issues&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; i, chunk in &lt;span style="color:#fff;font-weight:bold"&gt;enumerate&lt;/span&gt;(pd.read_csv(filepath, chunksize=chunksize)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Processing chunk &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;i+&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Apply operations to chunk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; chunk[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;normalized&amp;#39;&lt;/span&gt;] = chunk[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;].str.lower()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filtered = chunk[chunk[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;] &amp;gt; &lt;span style="color:#ff0;font-weight:bold"&gt;1000&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results.append(filtered)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Combine results&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final = pd.concat(results, ignore_index=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; final
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = process_large_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales_data.csv&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="aggregation-across-chunks"&gt;Aggregation Across Chunks:&lt;a class="anchor" href="#aggregation-across-chunks"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Calculate statistics without loading all data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total_sales = &lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;count = &lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; chunk in pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales.csv&amp;#39;&lt;/span&gt;, chunksize=&lt;span style="color:#ff0;font-weight:bold"&gt;10000&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; total_sales += chunk[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;].sum()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count += &lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(chunk)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;average_sales = total_sales / count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Average sales: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;average_sales&lt;span style="color:#0ff;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;.2f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="chunked-processing-with-filter"&gt;Chunked Processing with Filter:&lt;a class="anchor" href="#chunked-processing-with-filter"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find all rows matching condition in large file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;matching_rows = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; chunk in pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv&amp;#39;&lt;/span&gt;, chunksize=&lt;span style="color:#ff0;font-weight:bold"&gt;10000&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Filter within chunk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filtered = chunk[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (chunk[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;] == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;active&amp;#39;&lt;/span&gt;) &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (chunk[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;amount&amp;#39;&lt;/span&gt;] &amp;gt; &lt;span style="color:#ff0;font-weight:bold"&gt;1000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; matching_rows.append(filtered)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result = pd.concat(matching_rows, ignore_index=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="options-with-read_csv"&gt;Options with &lt;code&gt;read_csv&lt;/code&gt;:&lt;a class="anchor" href="#options-with-read_csv"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Useful options for large files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.read_csv(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;large.csv&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; chunksize=&lt;span style="color:#ff0;font-weight:bold"&gt;10000&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# rows per chunk ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; usecols=[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;], &lt;span style="color:#007f7f"&gt;# load only needed columns → saves memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dtype={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;: &lt;span style="color:#fff;font-weight:bold"&gt;str&lt;/span&gt;}, &lt;span style="color:#007f7f"&gt;# specify dtypes → prevents auto-conversion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nrows=&lt;span style="color:#ff0;font-weight:bold"&gt;1000&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# load only first N rows (for testing)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; skiprows=&lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;100&lt;/span&gt;), &lt;span style="color:#007f7f"&gt;# skip rows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoding=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# specify encoding&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; low_memory=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# better dtype inference&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="4-gzipopen---reading-compressed-files"&gt;4. &lt;code&gt;gzip.open()&lt;/code&gt; - Reading Compressed Files&lt;a class="anchor" href="#4-gzipopen---reading-compressed-files"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="why-gzipped-files"&gt;Why Gzipped Files?&lt;a class="anchor" href="#why-gzipped-files"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Log files are often compressed to save disk space&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.gz&lt;/code&gt; extension = gzip compressed&lt;/li&gt;
&lt;li&gt;Python can read them directly without manual decompression&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="basic-usage-1"&gt;Basic Usage:&lt;a class="anchor" href="#basic-usage-1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; gzip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Read gzipped text file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logfile.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rt&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f: &lt;span style="color:#007f7f"&gt;# &amp;#39;rt&amp;#39; = read text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f: &lt;span style="color:#007f7f"&gt;# generator pattern&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Read entire compressed file (small files only)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logfile.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rt&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content = f.read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Write gzipped file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;wt&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f.write(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;compressed content&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="mode-options"&gt;Mode Options:&lt;a class="anchor" href="#mode-options"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# read text ✅ most common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# read binary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;wt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# write text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# write binary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;at&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# append text&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="complete-log-analysis---gzipped-apache-log"&gt;Complete Log Analysis - Gzipped Apache Log:&lt;a class="anchor" href="#complete-log-analysis---gzipped-apache-log"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; gzip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; datetime &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; analyze_gzipped_log(filepath):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; Analyze gzipped Apache log file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; Uses generator pattern for memory efficiency
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; post_count = &lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; status_counts = {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; gzip.open(filepath, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rt&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f: &lt;span style="color:#007f7f"&gt;# generator - one line at a time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; entry = parse_apache_log(line.strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; entry is &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Count POST requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; entry[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;method&amp;#39;&lt;/span&gt;] == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; post_count += &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Count by status code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; status = entry[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; status_counts[status] = status_counts.get(status, &lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;) + &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; post_count, status_counts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Run analysis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;posts, statuses = analyze_gzipped_log(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log.gz&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;POST requests: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;posts&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Status distribution: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;statuses&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="pandas-with-gzipped-csv"&gt;pandas with Gzipped CSV:&lt;a class="anchor" href="#pandas-with-gzipped-csv"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# pandas auto-detects .gz extension&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv.gz&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# small files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; chunk in pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv.gz&amp;#39;&lt;/span&gt;, chunksize=&lt;span style="color:#ff0;font-weight:bold"&gt;10000&lt;/span&gt;): &lt;span style="color:#007f7f"&gt;# large files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(chunk)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-with-open---context-manager"&gt;5. &lt;code&gt;with open()&lt;/code&gt; - Context Manager&lt;a class="anchor" href="#5-with-open---context-manager"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="why-use-context-manager"&gt;Why Use Context Manager?&lt;a class="anchor" href="#why-use-context-manager"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Automatically &lt;strong&gt;closes file&lt;/strong&gt; when done&lt;/li&gt;
&lt;li&gt;Works even if exception occurs&lt;/li&gt;
&lt;li&gt;Prevents resource leaks&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Always use context manager&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content = f.read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# File automatically closed here, even if error occurs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Bad - manual close, risky&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;f = &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content = f.read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;f.close() &lt;span style="color:#007f7f"&gt;# might not run if error occurs above&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="file-modes"&gt;File Modes:&lt;a class="anchor" href="#file-modes"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# read text (default)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# write text (creates/overwrites)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# append text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;x&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# exclusive creation (fails if exists)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# read binary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# write binary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r+&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# read and write&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="reading-options"&gt;Reading Options:&lt;a class="anchor" href="#reading-options"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Read entire file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content = f.read() &lt;span style="color:#007f7f"&gt;# single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Read all lines into list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lines = f.readlines() &lt;span style="color:#007f7f"&gt;# [&amp;#39;line1\n&amp;#39;, &amp;#39;line2\n&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Read one line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line = f.readline() &lt;span style="color:#007f7f"&gt;# &amp;#39;line1\n&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# ✅ Iterate line by line (memory efficient)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(line.strip()) &lt;span style="color:#007f7f"&gt;# strip removes \n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="writing-options"&gt;Writing Options:&lt;a class="anchor" href="#writing-options"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f.write(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Hello World&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# write string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f.writelines([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;line1&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;line2&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# write list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Append to existing file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f.write(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;New line&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="encoding"&gt;Encoding:&lt;a class="anchor" href="#encoding"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Always specify encoding for non-ASCII content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content = f.read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;, encoding=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f.write(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Content with unicode: é, ü, 中文&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-ospath---file-path-operations"&gt;6. &lt;code&gt;os.path&lt;/code&gt; - File Path Operations&lt;a class="anchor" href="#6-ospath---file-path-operations"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Check existence&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.exists(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# True if exists (file or dir)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.isfile(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# True if file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.isdir(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;folder/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# True if directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Path manipulation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.join(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;folder&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;#39;folder/file.txt&amp;#39; (OS-safe)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.basename(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/path/to/file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;#39;file.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.dirname(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/path/to/file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;#39;/path/to&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.splitext(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# (&amp;#39;file&amp;#39;, &amp;#39;.txt&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.abspath(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# absolute path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# File info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.getsize(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# size in bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.path.getmtime(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# last modified time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Directory operations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.listdir(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# list directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.makedirs(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;path/to/dir&amp;#39;&lt;/span&gt;, exist_ok=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# create dirs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.remove(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# delete file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.rename(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;old.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;new.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# rename file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.getcwd() &lt;span style="color:#007f7f"&gt;# current working directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.chdir(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/path/to/dir&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# change directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.environ.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;API_KEY&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# get environment variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;API_KEY&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# with default value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-pathlibpath---modern-file-path-handling"&gt;7. &lt;code&gt;pathlib.Path&lt;/code&gt; - Modern File Path Handling&lt;a class="anchor" href="#7-pathlibpath---modern-file-path-handling"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="why-pathlib"&gt;Why pathlib?&lt;a class="anchor" href="#why-pathlib"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;More readable and Pythonic than &lt;code&gt;os.path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Works consistently across Windows/Mac/Linux&lt;/li&gt;
&lt;li&gt;Object-oriented approach&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; pathlib &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; Path
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create path object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p = Path(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data/file.txt&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p = Path(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/absolute/path/file.txt&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Check existence&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.exists() &lt;span style="color:#007f7f"&gt;# True/False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.is_file() &lt;span style="color:#007f7f"&gt;# True if file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.is_dir() &lt;span style="color:#007f7f"&gt;# True if directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Path components&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.name &lt;span style="color:#007f7f"&gt;# &amp;#39;file.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.stem &lt;span style="color:#007f7f"&gt;# &amp;#39;file&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.suffix &lt;span style="color:#007f7f"&gt;# &amp;#39;.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.parent &lt;span style="color:#007f7f"&gt;# Path(&amp;#39;data&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.parts &lt;span style="color:#007f7f"&gt;# (&amp;#39;data&amp;#39;, &amp;#39;file.txt&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Build paths (OS-safe)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;base = Path(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;full = base / &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;subfolder&amp;#39;&lt;/span&gt; / &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅ clean syntax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# File operations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.read_text() &lt;span style="color:#007f7f"&gt;# read entire file as string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.write_text(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# write string to file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.read_bytes() &lt;span style="color:#007f7f"&gt;# read as bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.write_bytes(data) &lt;span style="color:#007f7f"&gt;# write bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create directories&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Path(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;new/nested/dir&amp;#39;&lt;/span&gt;).mkdir(parents=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;, exist_ok=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# List directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; file in Path(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;).iterdir():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(file)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find files by pattern&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; csv_file in Path(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;).glob(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;**/*.csv&amp;#39;&lt;/span&gt;): &lt;span style="color:#007f7f"&gt;# recursive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(csv_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; log_file in Path(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;logs&amp;#39;&lt;/span&gt;).glob(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;*.log&amp;#39;&lt;/span&gt;): &lt;span style="color:#007f7f"&gt;# non-recursive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(log_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.unlink() &lt;span style="color:#007f7f"&gt;# delete file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.rmdir() &lt;span style="color:#007f7f"&gt;# delete empty directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Rename/move&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.rename(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;new_name.txt&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p.replace(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;new_location/file.txt&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-tempfile---temporary-files"&gt;8. &lt;code&gt;tempfile&lt;/code&gt; - Temporary Files&lt;a class="anchor" href="#8-tempfile---temporary-files"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="why-temporary-files"&gt;Why Temporary Files?&lt;a class="anchor" href="#why-temporary-files"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Safe place to write data during processing&lt;/li&gt;
&lt;li&gt;Automatically cleaned up&lt;/li&gt;
&lt;li&gt;Essential for &lt;strong&gt;idempotent ETL&lt;/strong&gt; pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; tempfile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; shutil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create temporary file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; tempfile.NamedTemporaryFile(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mode=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; suffix=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.csv&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delete=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# don&amp;#39;t delete on close&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; tmp:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmp.write(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;data,goes,here&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmp_path = tmp.name &lt;span style="color:#007f7f"&gt;# save path for later&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# File persists after &amp;#39;with&amp;#39; block (because delete=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Temp file at: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;tmp_path&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Idempotent ETL pattern:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; safe_write_output(data, final_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Write to temp first, then atomic move to final&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Step 1: Write to temp file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmp = tempfile.NamedTemporaryFile(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mode=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; suffix=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.csv&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delete=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; row in data:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmp.write(row + &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmp.close()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Step 2: Atomic move to final destination&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; shutil.move(tmp.name, final_path) &lt;span style="color:#007f7f"&gt;# ✅ atomic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Output written to: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;final_path&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; Exception &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Cleanup temp file on error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmp.close()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os.unlink(tmp.name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;raise&lt;/span&gt; e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create temp directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; tempfile.TemporaryDirectory() &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; tmpdir:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Work inside temp directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; work_file = os.path.join(tmpdir, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;work.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Automatically deleted when &amp;#39;with&amp;#39; block exits&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="9-shutil---file-operations"&gt;9. &lt;code&gt;shutil&lt;/code&gt; - File Operations&lt;a class="anchor" href="#9-shutil---file-operations"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; shutil
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Copy file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.copy(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;source.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;dest.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# copy file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.copy2(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;source.txt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;dest.txt&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# copy with metadata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.copytree(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;source_dir/&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;dest_dir/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# copy directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Move file (ATOMIC on same filesystem) ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.move(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp_output.csv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;final_output.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.rmtree(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;directory/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# delete directory and contents&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Archive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.make_archive(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;zip&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;folder/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# create zip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.unpack_archive(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;archive.zip&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;dest/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# extract&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Disk usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.disk_usage(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# total, used, free bytes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="why-shutilmove-is-atomic"&gt;Why &lt;code&gt;shutil.move()&lt;/code&gt; is Atomic:&lt;a class="anchor" href="#why-shutilmove-is-atomic"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Atomic move - all or nothing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shutil.move(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp.csv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;final.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# If crash occurs DURING move:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → temp.csv may be deleted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → final.csv still has OLD content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → No partial/corrupt file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Non-atomic write&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;final.csv&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; row in data:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f.write(row) &lt;span style="color:#007f7f"&gt;# crash here = partial/corrupt file&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="memory-management---complete-reference"&gt;Memory Management - Complete Reference&lt;a class="anchor" href="#memory-management---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="python-memory-concepts"&gt;Python Memory Concepts:&lt;a class="anchor" href="#python-memory-concepts"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; sys
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Check object size in bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sys.getsizeof([&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# size of list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sys.getsizeof(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# size of string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Memory-efficient alternatives:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 1. Generator vs List&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gen = (x**&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; x in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(&lt;span style="color:#ff0;font-weight:bold"&gt;1000000&lt;/span&gt;)) &lt;span style="color:#007f7f"&gt;# tiny memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lst = [x**&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; x in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(&lt;span style="color:#ff0;font-weight:bold"&gt;1000000&lt;/span&gt;)] &lt;span style="color:#007f7f"&gt;# large memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 2. numpy arrays vs Python lists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; numpy &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;arr = np.array([&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;], dtype=np.int32) &lt;span style="color:#007f7f"&gt;# 4 bytes per element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lst = [&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ~28 bytes per element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 3. Chunked processing vs loading all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# (covered in pd.read_csv(chunksize=N))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 4. Delete large objects when done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;large_data = load_large_dataset()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;process(large_data)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;del&lt;/span&gt; large_data &lt;span style="color:#007f7f"&gt;# free memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; gc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gc.collect() &lt;span style="color:#007f7f"&gt;# force garbage collection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="quick-reference---when-to-use-what"&gt;Quick Reference - When to Use What&lt;a class="anchor" href="#quick-reference---when-to-use-what"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;File Size Approach
───────────────────────────────────────────────
Small (&amp;lt;100MB) → pd.read_csv() or open().read()
Medium (100MB-1GB) → pd.read_csv(chunksize=N)
Large (&amp;gt;1GB) → Generator: for line in open()
Compressed (.gz) → gzip.open(&amp;#39;file.gz&amp;#39;, &amp;#39;rt&amp;#39;)
CSV compressed → pd.read_csv(&amp;#39;file.csv.gz&amp;#39;)

File Operation → Method
───────────────────────────────────────────────
Read text file → with open(&amp;#39;f&amp;#39;, &amp;#39;r&amp;#39;) as f
Write safely → tempfile + shutil.move() ✅
Check existence → os.path.exists() or Path.exists()
Build paths → os.path.join() or Path / &amp;#39;file&amp;#39;
Find files → Path.glob(&amp;#39;**/*.csv&amp;#39;)
Process large → Generator expression ✅
Chunk large CSV → pd.read_csv(chunksize=N) ✅&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>4. Git &amp; Version Control</title><link>/docs/4.-git--version-control/</link><pubDate>Thu, 04 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/4.-git--version-control/</guid><description>&lt;h2 id="4-git--version-control"&gt;4. Git &amp;amp; Version Control&lt;a class="anchor" href="#4-git--version-control"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-git---core-concepts--purpose"&gt;1. Git - Core Concepts &amp;amp; Purpose&lt;a class="anchor" href="#1-git---core-concepts--purpose"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-git"&gt;What is Git?&lt;a class="anchor" href="#what-is-git"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Distributed version control system&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tracks changes to files over time&lt;/li&gt;
&lt;li&gt;Every developer has full copy of repository&lt;/li&gt;
&lt;li&gt;Works offline - syncs when connected&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="core-benefits"&gt;Core Benefits:&lt;a class="anchor" href="#core-benefits"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;✅ Tracks every change ever made
✅ Enables collaboration among multiple developers
✅ Rollback to any previous state
✅ Branching - work on features without affecting main code
✅ Blame - see who changed what and when
✅ Merge - combine work from multiple people

❌ Does NOT automatically clean data
❌ Does NOT replace testing
❌ Does NOT store only binary assets&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="git-vs-github-vs-gitlab"&gt;Git vs GitHub vs GitLab:&lt;a class="anchor" href="#git-vs-github-vs-gitlab"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;What it is&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Version control software (local)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Cloud hosting for Git repos + collaboration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GitLab&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Alternative to GitHub (self-hostable)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Bitbucket&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Another alternative by Atlassian&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="2-git---core-architecture"&gt;2. Git - Core Architecture&lt;a class="anchor" href="#2-git---core-architecture"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Working Directory Staging Area Local Repo Remote Repo
(your files) (index) (.git folder) (GitHub)
 │ │ │ │
 │ git add │ git commit │ git push │
 │──────────────────&amp;gt;│────────────────&amp;gt;│───────────────&amp;gt;│
 │ │ │ │
 │&amp;lt;──────────────────────────────────────────────────── │
 │ git pull / git clone │
 │ │ │ │
 │ git checkout -- . git fetch │
 │&amp;lt;──────────────────│ │&amp;lt;───────────────│&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="three-areas-explained"&gt;Three Areas Explained:&lt;a class="anchor" href="#three-areas-explained"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 1. Working Directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Files you&amp;#39;re currently editing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Changes not yet tracked by Git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 2. Staging Area (Index)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Files marked for next commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → git add moves files here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 3. Local Repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Committed snapshots&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → git commit moves from staging to here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 4. Remote Repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → GitHub/GitLab server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → git push uploads local commits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → git pull downloads remote commits&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="3-gitignore---excluding-files-from-tracking"&gt;3. &lt;code&gt;.gitignore&lt;/code&gt; - Excluding Files from Tracking&lt;a class="anchor" href="#3-gitignore---excluding-files-from-tracking"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-gitignore"&gt;What is &lt;code&gt;.gitignore&lt;/code&gt;?&lt;a class="anchor" href="#what-is-gitignore"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Text file listing patterns of files Git should &lt;strong&gt;NOT track&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Placed in root of repository&lt;/li&gt;
&lt;li&gt;Committed to repo so all team members use same rules&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="common-gitignore-entries"&gt;Common &lt;code&gt;.gitignore&lt;/code&gt; Entries:&lt;a class="anchor" href="#common-gitignore-entries"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-gitignore" data-lang="gitignore"&gt;# Python
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
*.egg-info/

# Virtual environments
venv/
.venv/
env/
.env

# Secrets &amp;amp; API keys ✅ most important
.env
.env.*
secrets.json
credentials.json
config/secrets.py

# Data files (often too large for git)
data/raw/
*.csv
*.parquet
*.pkl

# IDE files
.vscode/
.idea/
*.swp

# OS files
.DS_Store # Mac
Thumbs.db # Windows

# Jupyter
.ipynb_checkpoints/

# Build artifacts
dist/
build/
*.egg-info/

# Logs
*.log
logs/&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="gitignore-vs-gitconfig"&gt;&lt;code&gt;.gitignore&lt;/code&gt; vs &lt;code&gt;.git/config&lt;/code&gt;:&lt;a class="anchor" href="#gitignore-vs-gitconfig"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Specify files Git should NOT track ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.git/config&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Repository settings (remote URL, branches)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.gitattributes&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File-specific settings (line endings, merge strategy)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;❌ NOT for tracking specific files&lt;/li&gt;
&lt;li&gt;❌ NOT for listing contributors&lt;/li&gt;
&lt;li&gt;❌ NOT for defining repository settings&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-git-diff---view-changes"&gt;4. &lt;code&gt;git diff&lt;/code&gt; - View Changes&lt;a class="anchor" href="#4-git-diff---view-changes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Working directory vs last commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff &lt;span style="color:#007f7f"&gt;# ✅ exam answer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Staged changes vs last commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --staged
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --cached &lt;span style="color:#007f7f"&gt;# same as --staged&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Between two commits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff abc123 def456
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Between two branches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff main feature-branch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Specific file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff file.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Summary only (no actual diff)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --stat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="related-commands"&gt;Related Commands:&lt;a class="anchor" href="#related-commands"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status &lt;span style="color:#007f7f"&gt;# shows WHICH files changed (not the actual diff)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log &lt;span style="color:#007f7f"&gt;# shows commit HISTORY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show &lt;span style="color:#007f7f"&gt;# shows changes in a specific commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log -p &lt;span style="color:#007f7f"&gt;# shows commits WITH their diffs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-diff-output"&gt;&lt;code&gt;git diff&lt;/code&gt; Output:&lt;a class="anchor" href="#git-diff-output"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;diff --git a/script.py b/script.py
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;index abc123..def456 100644
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--- a/script.py ← old version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+++ b/script.py ← new version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;@@ -10,7 +10,8 @@ ← line numbers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; def clean_data(df):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- df.dropna() ← removed line (red)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ df.dropna(subset=[&amp;#39;name&amp;#39;]) ← added line (green)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ df.reset_index(drop=True) ← added line (green)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; return df
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-git-workflow-commands---complete-reference"&gt;5. Git Workflow Commands - Complete Reference&lt;a class="anchor" href="#5-git-workflow-commands---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="staging--committing"&gt;Staging &amp;amp; Committing:&lt;a class="anchor" href="#staging--committing"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Check what changed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status &lt;span style="color:#007f7f"&gt;# see modified/staged/untracked files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Stage changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add file.py &lt;span style="color:#007f7f"&gt;# stage specific file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#007f7f"&gt;# stage ALL changes ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add *.py &lt;span style="color:#007f7f"&gt;# stage all Python files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add -p &lt;span style="color:#007f7f"&gt;# stage changes interactively (chunk by chunk)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Unstage (undo git add)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged file.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset HEAD file.py &lt;span style="color:#007f7f"&gt;# older syntax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Add data cleaning function&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -am &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;message&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# stage + commit tracked files in one step&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend &lt;span style="color:#007f7f"&gt;# modify last commit message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Correct sequence for uploading work:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push &lt;span style="color:#007f7f"&gt;# ✅ exam answer: add → commit → push&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="viewing-history"&gt;Viewing History:&lt;a class="anchor" href="#viewing-history"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log &lt;span style="color:#007f7f"&gt;# full commit history&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline &lt;span style="color:#007f7f"&gt;# compact one-line per commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --graph &lt;span style="color:#007f7f"&gt;# visual branch graph&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline --graph --all &lt;span style="color:#007f7f"&gt;# full visual history&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log -n &lt;span style="color:#ff0;font-weight:bold"&gt;5&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# last 5 commits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --author=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;John&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# commits by specific author&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --since=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;2024-01-01&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# commits after date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log -- file.py &lt;span style="color:#007f7f"&gt;# commits touching specific file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show abc123 &lt;span style="color:#007f7f"&gt;# show specific commit details&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show HEAD &lt;span style="color:#007f7f"&gt;# show last commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show HEAD~1 &lt;span style="color:#007f7f"&gt;# show second-to-last commit&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-syncing-with-remote"&gt;6. Syncing with Remote&lt;a class="anchor" href="#6-syncing-with-remote"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Download + integrate remote changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull &lt;span style="color:#007f7f"&gt;# pull from tracked remote branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull origin main &lt;span style="color:#007f7f"&gt;# ✅ pull from main branch specifically&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Download WITHOUT integrating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch origin &lt;span style="color:#007f7f"&gt;# fetch all remote changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch origin main &lt;span style="color:#007f7f"&gt;# fetch specific branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Pull vs Fetch:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# git pull = git fetch + git merge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# git fetch = download only (safe, no changes to working files)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Push local commits to remote&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push &lt;span style="color:#007f7f"&gt;# push to tracked remote branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin main &lt;span style="color:#007f7f"&gt;# push to specific branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin feature &lt;span style="color:#007f7f"&gt;# push feature branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin feature &lt;span style="color:#007f7f"&gt;# push + set upstream tracking&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --force &lt;span style="color:#007f7f"&gt;# ⚠️ force push (dangerous, avoid)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-git-branching"&gt;7. Git Branching&lt;a class="anchor" href="#7-git-branching"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="why-branches"&gt;Why Branches?&lt;a class="anchor" href="#why-branches"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Work on features without affecting &lt;code&gt;main&lt;/code&gt; code&lt;/li&gt;
&lt;li&gt;Multiple people work simultaneously without conflicts&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;main&lt;/code&gt; always production-ready&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch feature-analysis &lt;span style="color:#007f7f"&gt;# create branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch &lt;span style="color:#007f7f"&gt;# list local branches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -a &lt;span style="color:#007f7f"&gt;# list all branches (local + remote)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d feature-analysis &lt;span style="color:#007f7f"&gt;# delete branch (safe)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D feature-analysis &lt;span style="color:#007f7f"&gt;# force delete branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Switch branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout feature-analysis &lt;span style="color:#007f7f"&gt;# switch to branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout main &lt;span style="color:#007f7f"&gt;# go back to main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create + switch in one step ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -b feature-analysis &lt;span style="color:#007f7f"&gt;# ✅ most common shortcut&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch -c feature-analysis &lt;span style="color:#007f7f"&gt;# newer syntax (Git 2.23+)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Exam answer: create and switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch feature-analysis
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout feature-analysis
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# OR single command:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -b feature-analysis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="branch-naming-conventions"&gt;Branch Naming Conventions:&lt;a class="anchor" href="#branch-naming-conventions"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;feature/data-cleaning &lt;span style="color:#007f7f"&gt;# new features&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bugfix/fix-null-handling &lt;span style="color:#007f7f"&gt;# bug fixes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hotfix/critical-api-fix &lt;span style="color:#007f7f"&gt;# urgent production fixes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;release/v1.2.0 &lt;span style="color:#007f7f"&gt;# release preparation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docs/update-readme &lt;span style="color:#007f7f"&gt;# documentation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-undoing-changes"&gt;8. Undoing Changes&lt;a class="anchor" href="#8-undoing-changes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Discard working directory changes ✅ (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -- . &lt;span style="color:#007f7f"&gt;# discard ALL unstaged changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -- file.py &lt;span style="color:#007f7f"&gt;# discard changes to specific file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore . &lt;span style="color:#007f7f"&gt;# newer syntax (Git 2.23+)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore file.py &lt;span style="color:#007f7f"&gt;# specific file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Unstage (undo git add)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged file.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset HEAD file.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Undo last commit (keep changes in working directory)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --soft HEAD~1 &lt;span style="color:#007f7f"&gt;# undo commit, keep staged&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset HEAD~1 &lt;span style="color:#007f7f"&gt;# undo commit, unstage changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --mixed HEAD~1 &lt;span style="color:#007f7f"&gt;# same as above (default)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Undo last commit (DISCARD all changes) ⚠️ destructive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Revert (creates NEW commit that undoes previous)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert HEAD &lt;span style="color:#007f7f"&gt;# undo last commit safely&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert abc123 &lt;span style="color:#007f7f"&gt;# undo specific commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Stash (save work temporarily)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash &lt;span style="color:#007f7f"&gt;# save current changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash list &lt;span style="color:#007f7f"&gt;# see all stashes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash pop &lt;span style="color:#007f7f"&gt;# apply most recent stash + delete it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash apply &lt;span style="color:#007f7f"&gt;# apply most recent stash (keep it)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash drop &lt;span style="color:#007f7f"&gt;# delete most recent stash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash clear &lt;span style="color:#007f7f"&gt;# delete all stashes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="undo-command-comparison"&gt;Undo Command Comparison:&lt;a class="anchor" href="#undo-command-comparison"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Command&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;th&gt;Destructive?&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git checkout -- .&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Discard working dir changes ✅&lt;/td&gt;
 &lt;td&gt;Yes (local only)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git reset --soft&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Undo commit, keep staged&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git reset --hard&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Undo commit, discard all&lt;/td&gt;
 &lt;td&gt;Yes ⚠️&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git revert&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;New commit undoing previous&lt;/td&gt;
 &lt;td&gt;No (safe)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Temporarily save changes&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git clean -fd&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Remove untracked files&lt;/td&gt;
 &lt;td&gt;Yes ⚠️&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="9-merging--merge-conflicts"&gt;9. Merging &amp;amp; Merge Conflicts&lt;a class="anchor" href="#9-merging--merge-conflicts"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="merging-branches"&gt;Merging Branches:&lt;a class="anchor" href="#merging-branches"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Merge feature into main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout main &lt;span style="color:#007f7f"&gt;# switch to target branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge feature-analysis &lt;span style="color:#007f7f"&gt;# merge feature into current branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Fast-forward merge (no new commit needed)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge --ff feature
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Always create merge commit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge --no-ff feature
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Merge with message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Merge feature-analysis&amp;#34;&lt;/span&gt; feature&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="merge-conflicts"&gt;Merge Conflicts:&lt;a class="anchor" href="#merge-conflicts"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# When do conflicts occur?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Two people edit the SAME LINE on different branches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Git cannot auto-decide which change to keep&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Must be RESOLVED MANUALLY ✅ (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# After conflict:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status &lt;span style="color:#007f7f"&gt;# shows conflicted files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Conflicted file looks like:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD (current branch)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.dropna(subset=[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]) ← your change
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;=======
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.dropna(subset=[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]) ← incoming change
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature-branch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Resolution steps:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 1. Open conflicted file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 2. Choose which change to keep (or combine both)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 3. Remove conflict markers (&amp;lt;&amp;lt;&amp;lt;&amp;lt;, ====, &amp;gt;&amp;gt;&amp;gt;&amp;gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 4. Stage resolved file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add file.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 5. Complete merge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Abort merge (go back to before merge)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge --abort&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="10-pull-requests-pr"&gt;10. Pull Requests (PR)&lt;a class="anchor" href="#10-pull-requests-pr"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-a-pr"&gt;What is a PR?&lt;a class="anchor" href="#what-is-a-pr"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Formal request to &lt;strong&gt;merge your branch into main&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Team members can:
&lt;ul&gt;
&lt;li&gt;Review code changes&lt;/li&gt;
&lt;li&gt;Leave comments&lt;/li&gt;
&lt;li&gt;Request changes&lt;/li&gt;
&lt;li&gt;Approve the merge&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Standard practice in collaborative projects&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="pr-workflow"&gt;PR Workflow:&lt;a class="anchor" href="#pr-workflow"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. Create feature branch
 git checkout -b feature-data-cleaning

2. Make changes and commit
 git add .
 git commit -m &amp;#34;Add data cleaning pipeline&amp;#34;

3. Push branch to remote
 git push origin feature-data-cleaning

4. Create PR on GitHub/GitLab
 → Go to repository on GitHub
 → Click &amp;#34;New Pull Request&amp;#34;
 → Select base: main, compare: feature-data-cleaning
 → Add title and description
 → Request reviewers

5. Code review
 → Reviewers comment on specific lines
 → Author makes requested changes
 → Push additional commits to same branch

6. Approval and merge
 → Reviewer approves
 → PR merged into main

7. Clean up
 git branch -d feature-data-cleaning
 git push origin --delete feature-data-cleaning&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ PRs allow code review + approval before merging&lt;/li&gt;
&lt;li&gt;❌ PRs are NOT faster than direct merging&lt;/li&gt;
&lt;li&gt;❌ PRs do NOT automatically fix bugs&lt;/li&gt;
&lt;li&gt;❌ PRs are NOT only for documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="11-git-hotfix-workflow"&gt;11. Git Hotfix Workflow&lt;a class="anchor" href="#11-git-hotfix-workflow"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="when-to-use-hotfix"&gt;When to Use Hotfix?&lt;a class="anchor" href="#when-to-use-hotfix"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Critical bug found in &lt;strong&gt;production&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cannot wait for regular release cycle&lt;/li&gt;
&lt;li&gt;Need immediate fix with minimal disruption&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="hotfix-process"&gt;Hotfix Process:&lt;a class="anchor" href="#hotfix-process"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 1: Create hotfix branch from LAST RELEASE TAG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -b hotfix/critical-routing-bug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 2: Implement and test the fix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# (make changes, run tests)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Fix critical routing bug in intersection algorithm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 3: Open PR for expedited review&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin hotfix/critical-routing-bug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Create PR on GitHub&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → Request urgent/expedited review&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 4: Merge into BOTH main AND develop ✅ (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge hotfix/critical-routing-bug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git tag -a v1.0.1 -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Hotfix: critical routing bug&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin main --tags
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout develop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge hotfix/critical-routing-bug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin develop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 5: Delete hotfix branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d hotfix/critical-routing-bug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin --delete hotfix/critical-routing-bug&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Create hotfix branch from release tag → fix → PR → merge to main AND develop&lt;/li&gt;
&lt;li&gt;❌ Apply fix directly to main without review&lt;/li&gt;
&lt;li&gt;❌ Delay fix to next regular release cycle&lt;/li&gt;
&lt;li&gt;❌ Fix in working directory, apply to production, backport to Git later&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="12-branch-strategy---gitflow"&gt;12. Branch Strategy - GitFlow&lt;a class="anchor" href="#12-branch-strategy---gitflow"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="complete-branching-model"&gt;Complete Branching Model:&lt;a class="anchor" href="#complete-branching-model"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;main (production-ready)
 │
 ├── hotfix branches (emergency fixes)
 │ └── merge back to main + develop
 │
develop (integration branch)
 │
 ├── feature/data-cleaning
 ├── feature/visualization
 ├── feature/api-integration
 │ └── merge back to develop when complete
 │
 └── release/v1.2.0 (when ready for production)
 └── merge to main + develop, then tag&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="simple-github-flow-simpler-alternative"&gt;Simple GitHub Flow (simpler alternative):&lt;a class="anchor" href="#simple-github-flow-simpler-alternative"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;main (always deployable)
 │
 ├── feature/data-cleaning → PR → main
 ├── bugfix/fix-null-values → PR → main
 └── hotfix/urgent-fix → PR → main (expedited)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="13-pipeline-transformation-versioning"&gt;13. Pipeline Transformation Versioning&lt;a class="anchor" href="#13-pipeline-transformation-versioning"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="problem"&gt;Problem:&lt;a class="anchor" href="#problem"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Transformation logic changes frequently
→ Hard to track what changed and when
→ Can&amp;#39;t reproduce old results
→ Risk of breaking existing processes&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="solution"&gt;Solution:&lt;a class="anchor" href="#solution"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Version transformations with git + unit tests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -b feature/new-transformation-logic
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Write unit tests FIRST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# tests/test_transform.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Implement transformation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# src/transform.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Test on sample data (not production)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pytest tests/ -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# If all tests pass → PR → merge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Update normalization: handle unicode names&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin feature/new-transformation-logic&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Unit test for transformation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; test_normalize_company_name():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;assert&lt;/span&gt; normalize(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;APPLE INC&amp;#34;&lt;/span&gt;) == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Apple Inc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;assert&lt;/span&gt; normalize(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;apple incorporated&amp;#34;&lt;/span&gt;) == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Apple Inc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;assert&lt;/span&gt; normalize(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34; Apple &amp;#34;&lt;/span&gt;) == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Apple&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; test_schema_preserved():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result = transform(sample_df)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;assert&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;list&lt;/span&gt;(result.columns) == [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;revenue&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;assert&lt;/span&gt; result[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;revenue&amp;#39;&lt;/span&gt;].dtype == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;float64&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Version with git + write unit tests + test on sample data before production&lt;/li&gt;
&lt;li&gt;❌ Keep all logic in one script and update directly&lt;/li&gt;
&lt;li&gt;❌ Manually document changes in shared doc&lt;/li&gt;
&lt;li&gt;❌ Avoid changes to prevent breaking things&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="git-commands---complete-quick-reference"&gt;Git Commands - Complete Quick Reference&lt;a class="anchor" href="#git-commands---complete-quick-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# SETUP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.name &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.email &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init &lt;span style="color:#007f7f"&gt;# initialize new repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone url &lt;span style="color:#007f7f"&gt;# clone existing repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# DAILY WORKFLOW&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status &lt;span style="color:#007f7f"&gt;# what changed?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff &lt;span style="color:#007f7f"&gt;# what exactly changed? ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#007f7f"&gt;# stage all ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;message&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# save snapshot ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push &lt;span style="color:#007f7f"&gt;# upload to remote ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull origin main &lt;span style="color:#007f7f"&gt;# get latest ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# BRANCHING&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch &lt;span style="color:#007f7f"&gt;# list branches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -b feature &lt;span style="color:#007f7f"&gt;# create + switch ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout main &lt;span style="color:#007f7f"&gt;# switch branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge feature &lt;span style="color:#007f7f"&gt;# merge branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d feature &lt;span style="color:#007f7f"&gt;# delete branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# UNDOING&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -- . &lt;span style="color:#007f7f"&gt;# discard changes ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged file &lt;span style="color:#007f7f"&gt;# unstage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --soft HEAD~1 &lt;span style="color:#007f7f"&gt;# undo last commit (keep changes)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1 &lt;span style="color:#007f7f"&gt;# undo last commit (discard) ⚠️&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert HEAD &lt;span style="color:#007f7f"&gt;# safe undo (new commit)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash / git stash pop &lt;span style="color:#007f7f"&gt;# save/restore temp changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# REMOTE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote -v &lt;span style="color:#007f7f"&gt;# show remote URLs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch origin &lt;span style="color:#007f7f"&gt;# download (don&amp;#39;t merge)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull origin main &lt;span style="color:#007f7f"&gt;# download + merge ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin feature &lt;span style="color:#007f7f"&gt;# push branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# INSPECTION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline --graph &lt;span style="color:#007f7f"&gt;# visual history&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show abc123 &lt;span style="color:#007f7f"&gt;# show commit details&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git blame file.py &lt;span style="color:#007f7f"&gt;# who changed each line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git tag -a v1.0 -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# create tag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# HOTFIX&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout -b hotfix/fix &lt;span style="color:#007f7f"&gt;# from main ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → fix → commit → PR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# → merge to main AND develop ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="git---exam-scenario-answers"&gt;Git - Exam Scenario Answers&lt;a class="anchor" href="#git---exam-scenario-answers"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Scenario&lt;/th&gt;
 &lt;th&gt;Command&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Get latest team updates&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;git pull&lt;/code&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;See what changed in files&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;git diff&lt;/code&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Save work and upload&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;git add . → git commit → git push&lt;/code&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Create and switch branch&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;git checkout -b feature-name&lt;/code&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Discard working directory changes&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;git checkout -- .&lt;/code&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Files Git should not track&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.gitignore&lt;/code&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Collaborative review before merge&lt;/td&gt;
 &lt;td&gt;Pull Request (PR) ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Critical production bug fix&lt;/td&gt;
 &lt;td&gt;Hotfix branch → merge to main + develop ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Two people edit same line&lt;/td&gt;
 &lt;td&gt;Merge conflict → manual resolution ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>5. HTTP &amp; APIs</title><link>/docs/5.-http--apis/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/5.-http--apis/</guid><description>&lt;h2 id="5-http--apis"&gt;5. HTTP &amp;amp; APIs&lt;a class="anchor" href="#5-http--apis"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-http-status-codes---complete-reference"&gt;1. HTTP Status Codes - Complete Reference&lt;a class="anchor" href="#1-http-status-codes---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-are-http-status-codes"&gt;What are HTTP Status Codes?&lt;a class="anchor" href="#what-are-http-status-codes"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;3-digit numbers sent by server in response to client request&lt;/li&gt;
&lt;li&gt;Indicate &lt;strong&gt;what happened&lt;/strong&gt; with the request&lt;/li&gt;
&lt;li&gt;First digit indicates category&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="1xx---informational"&gt;1xx - Informational&lt;a class="anchor" href="#1xx---informational"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Server received request, processing continues

100 Continue → Client should continue sending request body
101 Switching → Server agrees to switch protocols
 Protocols (e.g., HTTP → WebSocket)
102 Processing → Server processing, no response yet&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h4 id="2xx---success-"&gt;2xx - Success ✅&lt;a class="anchor" href="#2xx---success-"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Request successfully received, understood, and accepted

200 OK → Standard success ✅ most common
201 Created → Resource created (after POST) ✅
202 Accepted → Request accepted but not yet processed
204 No Content → Success but no response body (DELETE) ✅
206 Partial Content → Partial data returned (file download resume)&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Checking success in Python:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt; &amp;lt;= status &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;300&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅ correct range check (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;status == &lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ❌ misses 201, 204 etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;status in [&lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;201&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ❌ incomplete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;status &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;400&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ❌ includes redirects&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="3xx---redirection"&gt;3xx - Redirection&lt;a class="anchor" href="#3xx---redirection"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Further action needed to complete request

300 Multiple Choices → Multiple options for resource
301 Moved Permanently → Resource permanently at new URL
302 Found → Resource temporarily at different URL
303 See Other → Redirect to another URL using GET
304 Not Modified → Cached version still valid, no new data ✅
307 Temp Redirect → Like 302 but must use same HTTP method
308 Perm Redirect → Like 301 but must use same HTTP method&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Checking redirect in Python:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;300&lt;/span&gt; &amp;lt;= status &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;400&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅ correct range check (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;status in [&lt;span style="color:#ff0;font-weight:bold"&gt;301&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;302&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ❌ incomplete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt; &amp;lt; status &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;400&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ❌ includes some 2xx codes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;status in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(&lt;span style="color:#ff0;font-weight:bold"&gt;299&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;400&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ❌ starts at 299&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="4xx---client-errors"&gt;4xx - Client Errors&lt;a class="anchor" href="#4xx---client-errors"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Request contains bad syntax or cannot be fulfilled

400 Bad Request → Malformed syntax or invalid parameters
401 Unauthorized → Authentication required/failed ✅ exam
 (missing or invalid API key)
403 Forbidden → Authenticated but no permission
404 Not Found → Resource doesn&amp;#39;t exist at URL
405 Method Not Allowed→ HTTP method not supported for endpoint
408 Request Timeout → Server timed out waiting for request
409 Conflict → Conflicts with current state (duplicate)
410 Gone → Resource permanently deleted
413 Payload Too Large → Request body exceeds server limit
415 Unsupported → Server doesn&amp;#39;t support content type
 Media Type
422 Unprocessable → Syntactically correct but semantically wrong
 Entity
429 Too Many Requests → Rate limit exceeded ✅ exam&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h4 id="5xx---server-errors"&gt;5xx - Server Errors&lt;a class="anchor" href="#5xx---server-errors"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Server failed to fulfill valid request

500 Internal Server → Generic server-side error ✅
 Error
501 Not Implemented → Server doesn&amp;#39;t support functionality
502 Bad Gateway → Invalid response from upstream server
503 Service → Server temporarily down
 Unavailable (overloaded or maintenance)
504 Gateway Timeout → Upstream server didn&amp;#39;t respond in time
505 HTTP Version → Server doesn&amp;#39;t support HTTP version
 Not Supported&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h4 id="key-distinctions---exam-focus"&gt;Key Distinctions - Exam Focus:&lt;a class="anchor" href="#key-distinctions---exam-focus"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;401 vs 403:
→ 401 = not authenticated yet (no/wrong credentials)
→ 403 = authenticated but no permission

401 vs 429:
→ 401 = wrong/missing API key
→ 429 = valid key but too many requests

404 vs 410:
→ 404 = not found (may exist elsewhere)
→ 410 = permanently deleted

301 vs 302:
→ 301 = permanent redirect (update your bookmarks)
→ 302 = temporary redirect (keep old URL)

500 vs 503:
→ 500 = code error on server
→ 503 = server temporarily unavailable

502 vs 504:
→ 502 = bad response FROM upstream
→ 504 = upstream TIMED OUT&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="2-http-methods---complete-reference"&gt;2. HTTP Methods - Complete Reference&lt;a class="anchor" href="#2-http-methods---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="all-http-methods"&gt;All HTTP Methods:&lt;a class="anchor" href="#all-http-methods"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GET → Retrieve data (safe + idempotent)
POST → Send/create data (not safe, not idempotent)
PUT → Update/replace resource (idempotent)
PATCH → Partial update (not idempotent)
DELETE → Remove resource (idempotent)
HEAD → Like GET but no body (just headers)
OPTIONS → Get allowed methods for resource&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="safe-vs-idempotent"&gt;Safe vs Idempotent:&lt;a class="anchor" href="#safe-vs-idempotent"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Safe = does NOT modify server state
Idempotent = same result if called multiple times

 Safe Idempotent
GET ✅ ✅
HEAD ✅ ✅
OPTIONS ✅ ✅
POST ❌ ❌
PUT ❌ ✅
PATCH ❌ ❌
DELETE ❌ ✅&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ GET = safe (does not modify server state) - exam answer&lt;/li&gt;
&lt;li&gt;✅ PUT = idempotent (multiple identical requests = same effect) - exam answer&lt;/li&gt;
&lt;li&gt;❌ POST = NOT idempotent (creates new resource each call)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="get---retrieve-data"&gt;GET - Retrieve Data:&lt;a class="anchor" href="#get---retrieve-data"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Basic GET request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.openweathermap.org/data/2.5/weather&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params={
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Delhi&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;appid&amp;#39;&lt;/span&gt;: os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;API_KEY&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Check status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(response.status_code) &lt;span style="color:#007f7f"&gt;# 200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(response.json()) &lt;span style="color:#007f7f"&gt;# parsed JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(response.text) &lt;span style="color:#007f7f"&gt;# raw text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(response.headers) &lt;span style="color:#007f7f"&gt;# response headers&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="post---send-data--llm-inference"&gt;POST - Send Data / LLM Inference:&lt;a class="anchor" href="#post---send-data--llm-inference"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# POST to LLM API (exam-relevant)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.post(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.anthropic.com/v1/messages&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers={
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;x-api-key&amp;#39;&lt;/span&gt;: os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ANTHROPIC_API_KEY&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json={
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;model&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;claude-3-sonnet-20240229&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;max_tokens&amp;#39;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;messages&amp;#39;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;role&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Classify sentiment: Great product!&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data = response.json()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;][&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="put---update-resource"&gt;PUT - Update Resource:&lt;a class="anchor" href="#put---update-resource"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# PUT replaces entire resource&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.put(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.example.com/users/123&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;John&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;john@example.com&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Calling same PUT 5 times = same result as calling once (idempotent)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="patch---partial-update"&gt;PATCH - Partial Update:&lt;a class="anchor" href="#patch---partial-update"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# PATCH updates only specified fields&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.patch(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.example.com/users/123&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;newemail@example.com&amp;#39;&lt;/span&gt;} &lt;span style="color:#007f7f"&gt;# only update email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="delete"&gt;DELETE:&lt;a class="anchor" href="#delete"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.delete(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.example.com/users/123&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(response.status_code) &lt;span style="color:#007f7f"&gt;# 204 No Content (success)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="3-api-rate-limiting---handling"&gt;3. API Rate Limiting - Handling&lt;a class="anchor" href="#3-api-rate-limiting---handling"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-rate-limiting"&gt;What is Rate Limiting?&lt;a class="anchor" href="#what-is-rate-limiting"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;APIs limit number of requests per time period&lt;/li&gt;
&lt;li&gt;Example: 60 calls/minute (OpenWeatherMap free tier)&lt;/li&gt;
&lt;li&gt;Exceeding limit → HTTP 429 Too Many Requests&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="strategies"&gt;Strategies:&lt;a class="anchor" href="#strategies"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;h5 id="1-simple-sleep-between-requests"&gt;1. Simple Sleep Between Requests:&lt;a class="anchor" href="#1-simple-sleep-between-requests"&gt;#&lt;/a&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cities = [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Delhi&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Mumbai&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Chennai&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Kolkata&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Bangalore&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; city in cities:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.openweathermap.org/data/2.5/weather&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: city, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;appid&amp;#39;&lt;/span&gt;: os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;API_KEY&amp;#39;&lt;/span&gt;)}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results.append(response.json())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;elif&lt;/span&gt; response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;429&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Rate limit hit, waiting...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;60&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# wait 1 minute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Retry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(...)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results.append(response.json())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ 1-2 sec between requests (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Collected data for &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(results)&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; cities&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="2-exponential-backoff"&gt;2. Exponential Backoff:&lt;a class="anchor" href="#2-exponential-backoff"&gt;#&lt;/a&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; fetch_with_retry(url, params, max_retries=&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Retry with exponential backoff on rate limit&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; attempt in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(max_retries):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url, params=params)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; response.json()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;elif&lt;/span&gt; response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;429&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait_time = &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; ** attempt &lt;span style="color:#007f7f"&gt;# 1, 2, 4 seconds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Rate limited. Waiting &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;wait_time&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;s...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(wait_time)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;elif&lt;/span&gt; response.status_code &amp;gt;= &lt;span style="color:#ff0;font-weight:bold"&gt;500&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait_time = &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; ** attempt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Server error &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;response.status_code&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;. Retrying...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(wait_time)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;raise&lt;/span&gt; Exception(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Unexpected status: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;response.status_code&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;raise&lt;/span&gt; Exception(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Max retries exceeded&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="3-using-tenacity-library"&gt;3. Using &lt;code&gt;tenacity&lt;/code&gt; Library:&lt;a class="anchor" href="#3-using-tenacity-library"&gt;#&lt;/a&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; tenacity &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; retry,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stop_after_attempt,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait_exponential,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; retry_if_exception_type
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@retry(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stop=stop_after_attempt(&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait=wait_exponential(multiplier=&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, &lt;span style="color:#fff;font-weight:bold"&gt;min&lt;/span&gt;=&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, &lt;span style="color:#fff;font-weight:bold"&gt;max&lt;/span&gt;=&lt;span style="color:#ff0;font-weight:bold"&gt;60&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; fetch_weather(city):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url, params={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: city})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;429&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;raise&lt;/span&gt; Exception(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Rate limited&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; response.json()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Use &lt;code&gt;time.sleep(1-2)&lt;/code&gt; between requests - exam answer&lt;/li&gt;
&lt;li&gt;❌ Make all requests simultaneously → triggers 429&lt;/li&gt;
&lt;li&gt;❌ Ignore rate limit → API blocks your key&lt;/li&gt;
&lt;li&gt;❌ Request only during off-peak hours → not reliable&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-api-security---storing-keys"&gt;4. API Security - Storing Keys&lt;a class="anchor" href="#4-api-security---storing-keys"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="environment-variables---best-practice"&gt;Environment Variables - Best Practice:&lt;a class="anchor" href="#environment-variables---best-practice"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Read from environment variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_key = os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;WEATHER_API_KEY&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_key = os.environ.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;WEATHER_API_KEY&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_key = os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;WEATHER_API_KEY&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;default_value&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# with default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.get(url, params={
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Delhi&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;appid&amp;#39;&lt;/span&gt;: api_key &lt;span style="color:#007f7f"&gt;# ✅ from environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="setting-environment-variables"&gt;Setting Environment Variables:&lt;a class="anchor" href="#setting-environment-variables"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Linux/Mac - terminal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;export&lt;/span&gt; WEATHER_API_KEY=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;your_key_here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;export&lt;/span&gt; ANTHROPIC_API_KEY=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;sk-ant-...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Windows - command prompt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;set&lt;/span&gt; WEATHER_API_KEY=your_key_here
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Windows - PowerShell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$env:WEATHER_API_KEY = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;your_key_here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Persistent - add to ~/.bashrc or ~/.zshrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;export WEATHER_API_KEY=&amp;#34;your_key&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;source&lt;/span&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="using-env-file"&gt;Using &lt;code&gt;.env&lt;/code&gt; File:&lt;a class="anchor" href="#using-env-file"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# .env file (NEVER commit to git!)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEATHER_API_KEY=your_key_here
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ANTHROPIC_API_KEY=sk-ant-...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DATABASE_URL=postgresql://user:pass@localhost/db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DEBUG=false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Load .env file with python-dotenv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; dotenv &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; load_dotenv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;load_dotenv() &lt;span style="color:#007f7f"&gt;# loads .env file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_key = os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;WEATHER_API_KEY&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# read variable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-gitignore" data-lang="gitignore"&gt;# .gitignore - ALWAYS exclude .env
.env
.env.*
*.env
secrets.json&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="what-not-to-do"&gt;What NOT to Do:&lt;a class="anchor" href="#what-not-to-do"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Hard-coded in script (visible in git history)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_key = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;abc123xyz789&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ In code comments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# API key: abc123xyz789&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ In GitHub README&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Use API key: abc123xyz789&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Printed to console (appears in logs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Using key: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;api_key&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-json-response-parsing---nested-fields"&gt;5. JSON Response Parsing - Nested Fields&lt;a class="anchor" href="#5-json-response-parsing---nested-fields"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="understanding-nested-json"&gt;Understanding Nested JSON:&lt;a class="anchor" href="#understanding-nested-json"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Typical API response structure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response_json = {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Delhi&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;temp&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;298.15&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;humidity&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;weather&amp;#34;&lt;/span&gt;: [ &lt;span style="color:#007f7f"&gt;# ← this is a LIST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;clear sky&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;01d&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;wind&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;speed&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;3.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Correct access patterns:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;city_name = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# &amp;#34;Delhi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;temperature = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# 298.15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;humidity = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;humidity&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# 60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weather&amp;#39;&lt;/span&gt;][&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ✅ &amp;#34;clear sky&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# [0] needed - weather is a LIST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;icon = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weather&amp;#39;&lt;/span&gt;][&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;icon&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# &amp;#34;01d&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wind_speed = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;wind&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;speed&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# 3.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong access patterns:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weather&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ❌ weather is a list, not dict&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weather&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ❌ wrong key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weather&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ❌ completely wrong order&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Safe access with .get() - avoids KeyError&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;temp = response_json.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;, {}).get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp&amp;#39;&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Convert Kelvin to Celsius&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;temp_celsius = response_json[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp&amp;#39;&lt;/span&gt;] - &lt;span style="color:#ff0;font-weight:bold"&gt;273.15&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-requests-library---complete-reference"&gt;6. &lt;code&gt;requests&lt;/code&gt; Library - Complete Reference&lt;a class="anchor" href="#6-requests-library---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="installation--import"&gt;Installation &amp;amp; Import:&lt;a class="anchor" href="#installation--import"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="all-http-methods-1"&gt;All HTTP Methods:&lt;a class="anchor" href="#all-http-methods-1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# GET&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.get(url, params={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# POST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.post(url, json={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.post(url, data={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;}) &lt;span style="color:#007f7f"&gt;# form data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# PUT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.put(url, json={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# PATCH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.patch(url, json={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# DELETE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.delete(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# HEAD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.head(url)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="request-options"&gt;Request Options:&lt;a class="anchor" href="#request-options"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;requests.get(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Delhi&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;appid&amp;#39;&lt;/span&gt;: key}, &lt;span style="color:#007f7f"&gt;# query parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers={
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Bearer &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;token&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;User-Agent&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;MyApp/1.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;}, &lt;span style="color:#007f7f"&gt;# request body (auto-sets Content-Type)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;}, &lt;span style="color:#007f7f"&gt;# form-encoded body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeout=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# seconds before timeout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; verify=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# SSL certificate verification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; auth=(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;pass&amp;#39;&lt;/span&gt;), &lt;span style="color:#007f7f"&gt;# basic authentication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cookies={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;session&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;abc&amp;#39;&lt;/span&gt;} &lt;span style="color:#007f7f"&gt;# send cookies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="response-object"&gt;Response Object:&lt;a class="anchor" href="#response-object"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r = requests.get(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.status_code &lt;span style="color:#007f7f"&gt;# 200, 404, etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.ok &lt;span style="color:#007f7f"&gt;# True if 200-299&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.raise_for_status() &lt;span style="color:#007f7f"&gt;# raises exception if 4xx/5xx ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.text &lt;span style="color:#007f7f"&gt;# response as string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.json() &lt;span style="color:#007f7f"&gt;# parse JSON response ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.content &lt;span style="color:#007f7f"&gt;# response as bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.headers &lt;span style="color:#007f7f"&gt;# response headers dict&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.url &lt;span style="color:#007f7f"&gt;# final URL (after redirects)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.history &lt;span style="color:#007f7f"&gt;# redirect history&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.elapsed &lt;span style="color:#007f7f"&gt;# time taken for request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r.cookies &lt;span style="color:#007f7f"&gt;# response cookies&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="error-handling"&gt;Error Handling:&lt;a class="anchor" href="#error-handling"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; requests.exceptions &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RequestException,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ConnectionError,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Timeout,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HTTPError
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; safe_api_call(url, params):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url, params=params, timeout=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response.raise_for_status() &lt;span style="color:#007f7f"&gt;# raise for 4xx/5xx ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; response.json()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.Timeout:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Request timed out&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.ConnectionError:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Connection failed&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.HTTPError &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;HTTP error: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;e.response.status_code&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e.response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;401&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Check your API key&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;elif&lt;/span&gt; e.response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;429&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Rate limit exceeded, slow down&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.RequestException &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Request failed: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;e&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="sessions---reuse-connection"&gt;Sessions - Reuse Connection:&lt;a class="anchor" href="#sessions---reuse-connection"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Use session for multiple requests to same API&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# More efficient - reuses TCP connection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;session = requests.Session()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Set default headers for all requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;session.headers.update({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Bearer &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;token&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# All requests use session settings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r1 = session.get(url1)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r2 = session.get(url2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r3 = session.post(url3, json=data)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;session.close() &lt;span style="color:#007f7f"&gt;# or use context manager:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; requests.Session() &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; session:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session.headers.update({&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Bearer &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;token&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r = session.get(url)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-api-pagination"&gt;7. API Pagination&lt;a class="anchor" href="#7-api-pagination"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-pagination"&gt;What is Pagination?&lt;a class="anchor" href="#what-is-pagination"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;API returns data in &lt;strong&gt;pages&lt;/strong&gt; (not all at once)&lt;/li&gt;
&lt;li&gt;Need to make multiple requests to get all data&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="common-pagination-patterns"&gt;Common Pagination Patterns:&lt;a class="anchor" href="#common-pagination-patterns"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;h5 id="1-page-number-pagination"&gt;1. Page Number Pagination:&lt;a class="anchor" href="#1-page-number-pagination"&gt;#&lt;/a&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; get_all_results(base_url, params):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Fetch all pages of results&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; page = &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;while&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;page&amp;#39;&lt;/span&gt;] = page
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;per_page&amp;#39;&lt;/span&gt;] = &lt;span style="color:#ff0;font-weight:bold"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(base_url, params=params)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data = response.json()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results = data.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;results&amp;#39;&lt;/span&gt;, [])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; not results:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;break&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# no more pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_results.extend(results)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; page += &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;0.5&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# rate limiting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; all_results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="2-cursor-pagination"&gt;2. Cursor Pagination:&lt;a class="anchor" href="#2-cursor-pagination"&gt;#&lt;/a&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; get_all_with_cursor(url, params):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cursor = &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;while&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; cursor:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;cursor&amp;#39;&lt;/span&gt;] = cursor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url, params=params)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data = response.json()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_results.extend(data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;items&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cursor = data.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;next_cursor&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; not cursor:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;break&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# no more pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; all_results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="3-link-header-pagination-github-style"&gt;3. Link Header Pagination (GitHub style):&lt;a class="anchor" href="#3-link-header-pagination-github-style"&gt;#&lt;/a&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; get_all_github_results(url, headers):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;while&lt;/span&gt; url:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url, headers=headers)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_results.extend(response.json())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# GitHub puts next page URL in Link header&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link_header = response.headers.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Link&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; next_url = &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; part in link_header.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rel=&amp;#34;next&amp;#34;&amp;#39;&lt;/span&gt; in part:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; next_url = part.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;)[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;].strip().strip(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;lt;&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url = next_url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; all_results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-chrome-devtools---network-tab-for-apis"&gt;8. Chrome DevTools - Network Tab for APIs&lt;a class="anchor" href="#8-chrome-devtools---network-tab-for-apis"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-network-tab-shows"&gt;What Network Tab Shows:&lt;a class="anchor" href="#what-network-tab-shows"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Network Tab Features:
├── All HTTP requests made by page
├── Request details:
│ ├── Headers → request/response headers ✅
│ │ ├── Request URL
│ │ ├── Request Method (GET, POST)
│ │ ├── Status Code (200, 401, 429)
│ │ ├── Authorization header (API key location)
│ │ └── Content-Type
│ ├── Payload → request body (POST data)
│ ├── Response → actual response data ✅
│ │ └── JSON response body
│ └── Timing → request timing breakdown
│ ├── DNS lookup
│ ├── Connection time
│ ├── Time to First Byte (TTFB)
│ └── Content download
│
├── Filter by type:
│ └── XHR/Fetch → API calls specifically
│
└── Throttling → simulate slow network&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="debugging-api-issues"&gt;Debugging API Issues:&lt;a class="anchor" href="#debugging-api-issues"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Problem: API call returns 401
→ Network tab → click request → Headers
→ Check: is Authorization header present?
→ Check: is API key format correct?
 Bearer token: &amp;#34;Authorization: Bearer sk-...&amp;#34;
 API key: &amp;#34;x-api-key: your-key&amp;#34;

Problem: Rate limiting (429)
→ Network tab → filter XHR
→ Look for pattern of 429 responses
→ Use Timing tab to see request frequency
→ Add sleep() between requests

Problem: Wrong data in response
→ Network tab → click request → Response tab
→ See exact JSON returned
→ Compare with expected structure&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="complete-api-workflow---putting-it-together"&gt;Complete API Workflow - Putting It Together:&lt;a class="anchor" href="#complete-api-workflow---putting-it-together"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; dotenv &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; load_dotenv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Load environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;load_dotenv()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;class&lt;/span&gt; WeatherAPIClient:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; __init__(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.api_key = os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;WEATHER_API_KEY&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ env variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.base_url = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.openweathermap.org/data/2.5&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.session = requests.Session()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.session.params = {&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;appid&amp;#39;&lt;/span&gt;: &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.api_key}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; get_weather(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;, city, max_retries=&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Fetch weather with error handling and retry&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url = &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.base_url&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/weather&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; attempt in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(max_retries):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.session.get(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: city},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeout=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response.raise_for_status() &lt;span style="color:#007f7f"&gt;# raise on 4xx/5xx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data = response.json()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# ✅ Parse nested JSON correctly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;: data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp_c&amp;#39;&lt;/span&gt;: data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp&amp;#39;&lt;/span&gt;] - &lt;span style="color:#ff0;font-weight:bold"&gt;273.15&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;humidity&amp;#39;&lt;/span&gt;: data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;humidity&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;: data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weather&amp;#39;&lt;/span&gt;][&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ✅ [0]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.HTTPError &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e.response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;401&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;raise&lt;/span&gt; Exception(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Invalid API key&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# don&amp;#39;t retry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;elif&lt;/span&gt; e.response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;429&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait = &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; ** attempt &lt;span style="color:#007f7f"&gt;# exponential backoff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Rate limited. Waiting &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;wait&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;s&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(wait)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;raise&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.Timeout:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; ** attempt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;raise&lt;/span&gt; Exception(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Failed after &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;max_retries&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; attempts&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; get_multiple_cities(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;, cities):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Fetch weather for multiple cities with rate limiting&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; city in cities:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data = &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.get_weather(city)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results.append(data)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;✅ Got weather for &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;city&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; Exception &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;❌ Failed for &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;city&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;e&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ rate limiting between requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; results
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;client = WeatherAPIClient()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cities = [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Delhi&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Mumbai&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Chennai&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Kolkata&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Bangalore&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;weather_data = client.get_multiple_cities(cities)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; city_data in weather_data:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;city_data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;]&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;city_data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;temp_c&amp;#39;&lt;/span&gt;]&lt;span style="color:#0ff;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;.1f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;°C, &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;city_data[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;]&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="http--apis---quick-reference-card"&gt;HTTP &amp;amp; APIs - Quick Reference Card&lt;a class="anchor" href="#http--apis---quick-reference-card"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Status Codes:
 2xx → Success (200 OK, 201 Created, 204 No Content)
 3xx → Redirect (301 Permanent, 302 Temporary, 304 Cached)
 4xx → Client Error (400 Bad, 401 Auth ✅, 403 Forbidden,
 404 Not Found, 429 Rate Limit ✅)
 5xx → Server Error (500 Internal, 503 Unavailable)

Range Checks:
 200 &amp;lt;= status &amp;lt; 300 → success ✅
 300 &amp;lt;= status &amp;lt; 400 → redirect ✅

HTTP Methods:
 GET → retrieve (safe + idempotent) ✅
 POST → create/send (LLM inference) ✅
 PUT → replace (idempotent) ✅
 DELETE → remove (idempotent)
 PATCH → partial update

Rate Limiting:
 429 → rate limit exceeded
 Fix: time.sleep(1-2) between requests ✅
 Advanced: exponential backoff

API Security:
 ✅ os.getenv(&amp;#39;API_KEY&amp;#39;)
 ✅ .env file + python-dotenv
 ❌ Hard-code in script
 ❌ Commit to git

JSON Parsing:
 response.json() # parse response
 data[&amp;#39;weather&amp;#39;][0][&amp;#39;description&amp;#39;] # nested + list ✅
 data.get(&amp;#39;key&amp;#39;, default) # safe access&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>6. Web Scraping</title><link>/docs/6.-web-scraping/</link><pubDate>Sat, 06 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/6.-web-scraping/</guid><description>&lt;h2 id="6-web-scraping"&gt;6. Web Scraping&lt;a class="anchor" href="#6-web-scraping"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-web-scraping---overview"&gt;1. Web Scraping - Overview&lt;a class="anchor" href="#1-web-scraping---overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-web-scraping"&gt;What is Web Scraping?&lt;a class="anchor" href="#what-is-web-scraping"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Programmatically &lt;strong&gt;extracting data from websites&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Automates what a human would do manually in a browser&lt;/li&gt;
&lt;li&gt;Used for: price monitoring, research data collection, news aggregation, lead generation&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="general-workflow"&gt;General Workflow:&lt;a class="anchor" href="#general-workflow"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. Send HTTP request to URL
 ↓
2. Receive HTML response
 ↓
3. Parse HTML to find data
 ↓
4. Extract specific elements
 ↓
5. Clean and store data&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="tools-available"&gt;Tools Available:&lt;a class="anchor" href="#tools-available"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Best For&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;requests&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Fetch HTML pages&lt;/td&gt;
 &lt;td&gt;Simple static pages&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;BeautifulSoup&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Parse HTML/XML&lt;/td&gt;
 &lt;td&gt;Extracting data from HTML&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Scrapy&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Full scraping framework&lt;/td&gt;
 &lt;td&gt;Large-scale scraping&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Selenium&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Browser automation&lt;/td&gt;
 &lt;td&gt;Dynamic/JavaScript pages&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Playwright&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Modern browser automation&lt;/td&gt;
 &lt;td&gt;Modern JS-heavy pages&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;httpx&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Async HTTP requests&lt;/td&gt;
 &lt;td&gt;Concurrent scraping&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="2-ethical-scraping---robotstxt"&gt;2. Ethical Scraping - &lt;code&gt;robots.txt&lt;/code&gt;&lt;a class="anchor" href="#2-ethical-scraping---robotstxt"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-robotstxt"&gt;What is &lt;code&gt;robots.txt&lt;/code&gt;?&lt;a class="anchor" href="#what-is-robotstxt"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Text file at root of website: &lt;code&gt;https://example.com/robots.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tells web crawlers which paths are &lt;strong&gt;allowed or disallowed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Standard convention - not technically enforced but legally/ethically important&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="reading-robotstxt"&gt;Reading &lt;code&gt;robots.txt&lt;/code&gt;:&lt;a class="anchor" href="#reading-robotstxt"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Example robots.txt
User-agent: * # applies to all bots
Disallow: /admin/ # don&amp;#39;t scrape /admin/
Disallow: /private/ # don&amp;#39;t scrape /private/
Allow: /public/ # explicitly allow /public/
Crawl-delay: 2 # wait 2 seconds between requests ✅

User-agent: Googlebot # specific rule for Google
Allow: / # Googlebot can access everything

User-agent: BadBot # block specific bot
Disallow: / # disallow everything&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="checking-robotstxt-in-python"&gt;Checking &lt;code&gt;robots.txt&lt;/code&gt; in Python:&lt;a class="anchor" href="#checking-robotstxt-in-python"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; urllib.robotparser &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; RobotFileParser
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; can_scrape(url, user_agent=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Check if URL can be scraped according to robots.txt&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Parse robots.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rp = RobotFileParser()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Get base URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; urllib.parse &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; urlparse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parsed = urlparse(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; robots_url = &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;parsed.scheme&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;://&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;parsed.netloc&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/robots.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rp.set_url(robots_url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rp.read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Check if allowed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; allowed = rp.can_fetch(user_agent, url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; crawl_delay = rp.crawl_delay(user_agent)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; allowed, crawl_delay
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com/products&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;allowed, delay = can_scrape(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; allowed:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# process...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; delay:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(delay) &lt;span style="color:#007f7f"&gt;# ✅ respect crawl-delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Scraping &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;url&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; is not allowed by robots.txt&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="ethical-scraping-checklist"&gt;Ethical Scraping Checklist:&lt;a class="anchor" href="#ethical-scraping-checklist"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;✅ Parse robots.txt before scraping
✅ Follow disallowed paths
✅ Implement crawl-delay between requests
✅ Identify your bot in User-Agent header
✅ Don&amp;#39;t overload servers
✅ Check website&amp;#39;s Terms of Service
✅ Cache responses to avoid redundant requests
✅ Scrape during off-peak hours if large volume

❌ Ignore robots.txt even for academic purposes
❌ Treat robots.txt as optional guidance
❌ Make rapid-fire requests without delays
❌ Scrape personal/private data without consent
❌ Bypass authentication/paywalls&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Parse robots.txt, follow disallowed paths, implement crawl-delay - exam answer&lt;/li&gt;
&lt;li&gt;❌ Ignore robots.txt if data is for academic purposes - wrong&lt;/li&gt;
&lt;li&gt;❌ Check robots.txt only once per domain - insufficient&lt;/li&gt;
&lt;li&gt;❌ Treat robots.txt as optional - unethical&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-crawl-delay-directive"&gt;3. &lt;code&gt;crawl-delay&lt;/code&gt; Directive&lt;a class="anchor" href="#3-crawl-delay-directive"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; urllib.robotparser &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; RobotFileParser
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rp = RobotFileParser()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rp.set_url(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com/robots.txt&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rp.read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get crawl delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;delay = rp.crawl_delay(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# for all bots&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;delay = delay &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; delay &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# default 1 second&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;urls_to_scrape = [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com/page1&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com/page2&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com/page3&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; url in urls_to_scrape:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; rp.can_fetch(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;, url):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(response)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(delay) &lt;span style="color:#007f7f"&gt;# ✅ respect crawl-delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Skipping disallowed URL: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;url&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="4-beautifulsoup---html-parsing"&gt;4. BeautifulSoup - HTML Parsing&lt;a class="anchor" href="#4-beautifulsoup---html-parsing"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-beautifulsoup"&gt;What is BeautifulSoup?&lt;a class="anchor" href="#what-is-beautifulsoup"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Python library for &lt;strong&gt;parsing HTML and XML&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Makes it easy to navigate, search, and extract data from HTML&lt;/li&gt;
&lt;li&gt;Works with &lt;code&gt;requests&lt;/code&gt; to fetch and parse web pages&lt;/li&gt;
&lt;li&gt;❌ NOT for making HTTP requests (use &lt;code&gt;requests&lt;/code&gt; for that)&lt;/li&gt;
&lt;li&gt;❌ NOT for dynamic/JavaScript pages (use Selenium/Playwright)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="installation"&gt;Installation:&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install beautifulsoup4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install lxml &lt;span style="color:#007f7f"&gt;# faster parser (optional)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="import"&gt;Import:&lt;a class="anchor" href="#import"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; bs4 &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-beautifulsoup---creating-a-soup-object"&gt;5. &lt;code&gt;BeautifulSoup()&lt;/code&gt; - Creating a Soup Object&lt;a class="anchor" href="#5-beautifulsoup---creating-a-soup-object"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="basic-html-parsing"&gt;Basic HTML Parsing:&lt;a class="anchor" href="#basic-html-parsing"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; bs4 &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 1: Fetch HTML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.get(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;html_content = response.text
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 2: Create soup object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup = BeautifulSoup(html_content, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ built-in parser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup = BeautifulSoup(html_content, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;lxml&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# faster, needs lxml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup = BeautifulSoup(html_content, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html5lib&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# most lenient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 3: Extract data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;title = soup.title.text
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(title)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="parsers-comparison"&gt;Parsers Comparison:&lt;a class="anchor" href="#parsers-comparison"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Parser&lt;/th&gt;
 &lt;th&gt;Speed&lt;/th&gt;
 &lt;th&gt;Leniency&lt;/th&gt;
 &lt;th&gt;Requires Install&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;html.parser&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;No (built-in)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;lxml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Fast&lt;/td&gt;
 &lt;td&gt;Strict&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;html5lib&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Slow&lt;/td&gt;
 &lt;td&gt;Most lenient&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="parsing-from-string-for-testing"&gt;Parsing from String (for testing):&lt;a class="anchor" href="#parsing-from-string-for-testing"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;html = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;lt;html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;lt;body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;h1 class=&amp;#34;title&amp;#34;&amp;gt;Data Science Tools&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;div id=&amp;#34;content&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;p class=&amp;#34;intro&amp;#34;&amp;gt;Welcome to TDS&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;li&amp;gt;Python&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;li&amp;gt;Pandas&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;li&amp;gt;Git&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;table&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Tool&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Purpose&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Git&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Version Control&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Docker&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Containerization&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;/table&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;lt;a href=&amp;#34;https://example.com&amp;#34;&amp;gt;Click here&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup = BeautifulSoup(html, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-find-and-find_all---locating-elements"&gt;6. &lt;code&gt;.find()&lt;/code&gt; and &lt;code&gt;.find_all()&lt;/code&gt; - Locating Elements&lt;a class="anchor" href="#6-find-and-find_all---locating-elements"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="find---returns-first-matching-element"&gt;&lt;code&gt;.find()&lt;/code&gt; - Returns FIRST matching element:&lt;a class="anchor" href="#find---returns-first-matching-element"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by tag name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;h1 = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h1&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# first &amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;div = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# first &amp;lt;div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# first &amp;lt;p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by CSS class&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;intro = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;, class_=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;intro&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;lt;p class=&amp;#34;intro&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;title = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h1&amp;#39;&lt;/span&gt;, class_=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;lt;h1 class=&amp;#34;title&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, &lt;span style="color:#fff;font-weight:bold"&gt;id&lt;/span&gt;=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;lt;div id=&amp;#34;content&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content = soup.find(&lt;span style="color:#fff;font-weight:bold"&gt;id&lt;/span&gt;=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# same result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;link = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, href=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# any &amp;lt;a&amp;gt; with href&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;link = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, href=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by multiple attributes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;elem = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, {&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;intro&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;main&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Shorthand (tag as attribute)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;title = soup.h1 &lt;span style="color:#007f7f"&gt;# first &amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;first_p = soup.p &lt;span style="color:#007f7f"&gt;# first &amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="find_all---returns-all-matching-elements"&gt;&lt;code&gt;.find_all()&lt;/code&gt; - Returns ALL matching elements:&lt;a class="anchor" href="#find_all---returns-all-matching-elements"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find all by tag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_links = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# all &amp;lt;a&amp;gt; tags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_paragraphs = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# all &amp;lt;p&amp;gt; tags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_rows = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;tr&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# all table rows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find all by class&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_items = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;li&amp;#39;&lt;/span&gt;, class_=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;item&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find all by attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_hrefs = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, href=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Limit results&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;first_3 = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;, limit=&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find multiple tag types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_headings = soup.find_all([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h1&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h2&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h3&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find by regex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_h = soup.find_all(re.compile(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;^h[1-6]$&amp;#39;&lt;/span&gt;)) &lt;span style="color:#007f7f"&gt;# all heading tags&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="navigating-the-tree"&gt;Navigating the Tree:&lt;a class="anchor" href="#navigating-the-tree"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Parent/child navigation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;div = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, &lt;span style="color:#fff;font-weight:bold"&gt;id&lt;/span&gt;=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Children&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;children = &lt;span style="color:#fff;font-weight:bold"&gt;list&lt;/span&gt;(div.children) &lt;span style="color:#007f7f"&gt;# direct children&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;descendants = &lt;span style="color:#fff;font-weight:bold"&gt;list&lt;/span&gt;(div.descendants) &lt;span style="color:#007f7f"&gt;# all descendants&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# First/last child&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;first = div.find() &lt;span style="color:#007f7f"&gt;# first child element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Parent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;parent = div.parent &lt;span style="color:#007f7f"&gt;# parent element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Siblings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;next_sib = div.next_sibling
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prev_sib = div.previous_sibling
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_siblings = div.next_siblings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Find within element (scoped search)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ul = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ul&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;items = ul.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;li&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# only li inside this ul&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-get_text---extracting-text"&gt;7. &lt;code&gt;.get_text()&lt;/code&gt; - Extracting Text&lt;a class="anchor" href="#7-get_text---extracting-text"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Extract text from element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;h1 = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h1&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text = h1.get_text() &lt;span style="color:#007f7f"&gt;# &amp;#34;Data Science Tools&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text = h1.text &lt;span style="color:#007f7f"&gt;# same result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get text with separator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;div = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, &lt;span style="color:#fff;font-weight:bold"&gt;id&lt;/span&gt;=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text = div.get_text(separator=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# text with newlines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text = div.get_text(separator=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39; &amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# text with spaces&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text = div.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# strip whitespace ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get text from all matching elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_li = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;li&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;items = [li.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; li in all_li]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# [&amp;#39;Python&amp;#39;, &amp;#39;Pandas&amp;#39;, &amp;#39;Git&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get all text on page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_text = soup.get_text()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_text = soup.get_text(separator=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;, strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Clean text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clean = re.sub(&lt;span style="color:#0ff;font-weight:bold"&gt;r&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;\s+&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, all_text).strip()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-gethref---extracting-attributes"&gt;8. &lt;code&gt;.get('href')&lt;/code&gt; - Extracting Attributes&lt;a class="anchor" href="#8-gethref---extracting-attributes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get attribute value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;link = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;href = link.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ safe (returns None if missing)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;href = link[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# raises KeyError if missing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get any attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;img = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;src = img.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;src&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alt = img.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;alt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# with default value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;width = img.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;width&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Check if attribute exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; link.has_attr(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(link[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get all attributes as dict&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;attrs = link.attrs &lt;span style="color:#007f7f"&gt;# {&amp;#39;href&amp;#39;: &amp;#39;url&amp;#39;, &amp;#39;class&amp;#39;: [&amp;#39;link&amp;#39;]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Get all links on page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_links = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, href=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;urls = [link.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; link in all_links]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Resolve relative URLs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; urllib.parse &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; urljoin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;base_url = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;absolute_urls = [urljoin(base_url, url) &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; url in urls]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="complete-beautifulsoup-example---scraping-a-table"&gt;Complete BeautifulSoup Example - Scraping a Table:&lt;a class="anchor" href="#complete-beautifulsoup-example---scraping-a-table"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; bs4 &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; scrape_table(url):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; Scrape HTML table from webpage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; ✅ Follows ethical scraping practices
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Set User-Agent to identify bot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers = {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;User-Agent&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;DataScienceBot/1.0 (research purposes)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Fetch page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requests.get(url, headers=headers, timeout=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response.raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Parse HTML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; soup = BeautifulSoup(response.text, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Find table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; table = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;table&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; not table:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Extract headers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers_row = table.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;tr&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers = [th.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; th in headers_row.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;th&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Extract rows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rows = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; tr in table.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;tr&amp;#39;&lt;/span&gt;)[&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;:]: &lt;span style="color:#007f7f"&gt;# skip header row&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cells = [td.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; td in tr.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;td&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; cells:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rows.append(cells)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Convert to DataFrame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df = pd.DataFrame(rows, columns=headers)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; df
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; scrape_multiple_pages(base_url, pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Scrape multiple pages with rate limiting&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_data = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; page in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, pages + &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url = &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;base_url&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;?page=&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;page&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df = scrape_table(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; df is not &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_data.append(df)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;✅ Scraped page &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;page&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; Exception &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;❌ Failed page &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;page&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;e&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ rate limiting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; pd.concat(all_data, ignore_index=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="complete-beautifulsoup-reference"&gt;Complete BeautifulSoup Reference:&lt;a class="anchor" href="#complete-beautifulsoup-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# CSS Selectors (alternative to find/find_all)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup.select(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div.content&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;lt;div class=&amp;#34;content&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup.select(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;#main&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# id=&amp;#34;main&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup.select(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;table tr td&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# nested elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup.select(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a[href]&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;lt;a&amp;gt; with href attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup.select(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;p.intro, p.outro&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# multiple selectors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# First match with CSS selector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;soup.select_one(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h1.title&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Practical extraction patterns:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 1. All links&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;links = [(a.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;), a.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; a in soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, href=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 2. All images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;images = [(img.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;alt&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;), img.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;src&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; img in soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;, src=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 3. Table to DataFrame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tables = pd.read_html(&lt;span style="color:#fff;font-weight:bold"&gt;str&lt;/span&gt;(soup)) &lt;span style="color:#007f7f"&gt;# ✅ pandas can parse HTML tables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = tables[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# first table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 4. Specific div content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, class_=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;article-body&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;paragraphs = [p.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; p in content.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 5. Meta tags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta_desc = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;meta&amp;#39;&lt;/span&gt;, attrs={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description = meta_desc.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; meta_desc &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 6. JSON-LD structured data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;script = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;script&amp;#39;&lt;/span&gt;, &lt;span style="color:#fff;font-weight:bold"&gt;type&lt;/span&gt;=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;application/ld+json&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; script:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data = json.loads(script.string)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 7. Next page link (pagination)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;next_page = soup.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, {&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rel&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;next&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;next_url = next_page.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; next_page &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="9-scrapy---full-web-scraping-framework"&gt;9. Scrapy - Full Web Scraping Framework&lt;a class="anchor" href="#9-scrapy---full-web-scraping-framework"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-scrapy"&gt;What is Scrapy?&lt;a class="anchor" href="#what-is-scrapy"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Full-featured, asynchronous web scraping framework&lt;/li&gt;
&lt;li&gt;Built for &lt;strong&gt;large-scale scraping&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Handles: requests, parsing, pipelines, rate limiting automatically&lt;/li&gt;
&lt;li&gt;More complex than BeautifulSoup but much more powerful&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="when-to-use-scrapy-vs-beautifulsoup"&gt;When to Use Scrapy vs BeautifulSoup:&lt;a class="anchor" href="#when-to-use-scrapy-vs-beautifulsoup"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Scenario&lt;/th&gt;
 &lt;th&gt;Use&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Simple, one-off scraping&lt;/td&gt;
 &lt;td&gt;BeautifulSoup + requests&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Large-scale, many pages&lt;/td&gt;
 &lt;td&gt;Scrapy&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Need JavaScript&lt;/td&gt;
 &lt;td&gt;Selenium/Playwright&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Need data pipelines&lt;/td&gt;
 &lt;td&gt;Scrapy&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Quick data extraction&lt;/td&gt;
 &lt;td&gt;BeautifulSoup&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="basic-scrapy-spider"&gt;Basic Scrapy Spider:&lt;a class="anchor" href="#basic-scrapy-spider"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; scrapy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;class&lt;/span&gt; ProductSpider(scrapy.Spider):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;products&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; start_urls = [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com/products&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Respect robots.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; custom_settings = {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ROBOTSTXT_OBEY&amp;#39;&lt;/span&gt;: &lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# ✅ obey robots.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;DOWNLOAD_DELAY&amp;#39;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# ✅ 2 second delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;CONCURRENT_REQUESTS&amp;#39;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;4&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# max concurrent requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;USER_AGENT&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;DataBot/1.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; parse(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;, response):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Extract data from page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; product in response.css(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div.product&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;yield&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;: product.css(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h2::text&amp;#39;&lt;/span&gt;).get(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;price&amp;#39;&lt;/span&gt;: product.css(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.price::text&amp;#39;&lt;/span&gt;).get(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;: product.css(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a::attr(href)&amp;#39;&lt;/span&gt;).get()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Follow next page link&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; next_page = response.css(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a.next-page::attr(href)&amp;#39;&lt;/span&gt;).get()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; next_page:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;yield&lt;/span&gt; response.follow(next_page, &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.parse)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="10-requests--beautifulsoup---combined-pattern"&gt;10. &lt;code&gt;requests&lt;/code&gt; + BeautifulSoup - Combined Pattern&lt;a class="anchor" href="#10-requests--beautifulsoup---combined-pattern"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="standard-workflow"&gt;Standard Workflow:&lt;a class="anchor" href="#standard-workflow"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; bs4 &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; scrape_page(url, session=&lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; Standard requests + BeautifulSoup workflow
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; requester = session or requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = requester.get(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;User-Agent&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Research Bot 1.0&amp;#39;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; timeout=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response.raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; soup = BeautifulSoup(response.text, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; soup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; extract_articles(soup):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Extract article data from parsed HTML&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; articles = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; article in soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title = article.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;h2&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link = article.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date = article.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; summary = article.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;, class_=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;summary&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; articles.append({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;: title.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; title &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;: link.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; link &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;: date.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;datetime&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; date &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;summary&amp;#39;&lt;/span&gt;: summary.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; summary &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; articles
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Full pipeline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; scrape_news_site(base_url, num_pages=&lt;span style="color:#ff0;font-weight:bold"&gt;5&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_articles = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; requests.Session() &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; session:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session.headers.update({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;User-Agent&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;DataScience Research Bot 1.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; page in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;, num_pages + &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url = &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;base_url&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/news?page=&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;page&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; soup = scrape_page(url, session)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; articles = extract_articles(soup)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; all_articles.extend(articles)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Page &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;page&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(articles)&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; articles&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; Exception &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Failed page &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;page&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;e&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ rate limiting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; all_articles&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="11-handling-dynamic-pages---selenium--playwright"&gt;11. Handling Dynamic Pages - Selenium &amp;amp; Playwright&lt;a class="anchor" href="#11-handling-dynamic-pages---selenium--playwright"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="when-is-javascript-needed"&gt;When is JavaScript Needed?&lt;a class="anchor" href="#when-is-javascript-needed"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Static page (BeautifulSoup works):
→ HTML is fully rendered in response
→ Data visible in page source (Ctrl+U)

Dynamic page (need Selenium/Playwright):
→ Data loaded by JavaScript after page loads
→ Data NOT in page source
→ Requires button clicks, scrolling, waiting
→ Examples: SPAs, infinite scroll, login-required pages&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="selenium-basic-usage"&gt;Selenium Basic Usage:&lt;a class="anchor" href="#selenium-basic-usage"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; selenium &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; webdriver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; selenium.webdriver.common.by &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; By
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; selenium.webdriver.support.ui &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; WebDriverWait
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; selenium.webdriver.support &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; expected_conditions &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; EC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; bs4 &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Setup driver (Chrome)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;options = webdriver.ChromeOptions()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;options.add_argument(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;--headless&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# run without browser window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;options.add_argument(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;--no-sandbox&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;driver = webdriver.Chrome(options=options)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Navigate to page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driver.get(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Wait for element to load&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait = WebDriverWait(driver, &lt;span style="color:#ff0;font-weight:bold"&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; element = wait.until(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; EC.presence_of_element_located((By.CLASS_NAME, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;product&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Scroll to load more content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driver.execute_script(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;window.scrollTo(0, document.body.scrollHeight)&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Click button&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; button = driver.find_element(By.ID, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;load-more&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; button.click()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Get rendered HTML and parse with BeautifulSoup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; html = driver.page_source
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; soup = BeautifulSoup(html, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Extract data normally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; products = soup.find_all(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, class_=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;product&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; product in products:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(product.get_text(strip=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driver.quit() &lt;span style="color:#007f7f"&gt;# always close browser&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="playwright-modern-alternative"&gt;Playwright (Modern Alternative):&lt;a class="anchor" href="#playwright-modern-alternative"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; playwright.sync_api &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; sync_playwright
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; bs4 &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; sync_playwright() &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; p:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; browser = p.chromium.launch(headless=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; page = browser.new_page()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; page.goto(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; page.wait_for_selector(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.product&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# wait for element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Get content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; html = page.content()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; soup = BeautifulSoup(html, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; browser.close()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="12-respecting-rate-limits-in-scraping"&gt;12. Respecting Rate Limits in Scraping&lt;a class="anchor" href="#12-respecting-rate-limits-in-scraping"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; random
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; urllib.robotparser &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; RobotFileParser
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;class&lt;/span&gt; EthicalScraper:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; Scraper that respects robots.txt and rate limits
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; __init__(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;, base_url, delay=&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.base_url = base_url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.delay = delay
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.session = requests.Session()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.session.headers.update({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;User-Agent&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ResearchBot/1.0 (academic research)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Load robots.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.robot_parser = RobotFileParser()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.robot_parser.set_url(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;base_url&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/robots.txt&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.robot_parser.read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Get crawl delay from robots.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; robot_delay = &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.robot_parser.crawl_delay(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; robot_delay:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.delay = &lt;span style="color:#fff;font-weight:bold"&gt;max&lt;/span&gt;(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.delay, robot_delay) &lt;span style="color:#007f7f"&gt;# use larger delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; fetch(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;, url, retries=&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Fetch URL with rate limiting and error handling&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Check robots.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; not &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.robot_parser.can_fetch(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;, url):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Disallowed by robots.txt: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;url&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; attempt in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(retries):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.session.get(url, timeout=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response.raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# ✅ Rate limiting - respect crawl delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Add random jitter to avoid being detected as bot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep_time = &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.delay + random.uniform(&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(sleep_time)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; response.text
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.HTTPError &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e.response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;429&lt;/span&gt;: &lt;span style="color:#007f7f"&gt;# rate limited&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;60&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# wait 1 minute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;elif&lt;/span&gt; e.response.status_code == &lt;span style="color:#ff0;font-weight:bold"&gt;404&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# page not found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; ** attempt) &lt;span style="color:#007f7f"&gt;# backoff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; requests.exceptions.RequestException:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; ** attempt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; scrape(&lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;, urls):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Scrape multiple URLs ethically&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; url in urls:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; html = &lt;span style="color:#fff;font-weight:bold"&gt;self&lt;/span&gt;.fetch(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; html:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; bs4 &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; soup = BeautifulSoup(html, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results.append({&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;: url, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;soup&amp;#39;&lt;/span&gt;: soup})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="web-scraping---quick-reference-card"&gt;Web Scraping - Quick Reference Card&lt;a class="anchor" href="#web-scraping---quick-reference-card"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Tool Selection:
 Static HTML page → requests + BeautifulSoup ✅
 JavaScript page → Selenium or Playwright
 Large-scale scraping → Scrapy
 Simple HTTP → requests alone

BeautifulSoup:
 soup = BeautifulSoup(html, &amp;#39;html.parser&amp;#39;)
 soup.find(&amp;#39;tag&amp;#39;) → first element
 soup.find(&amp;#39;tag&amp;#39;, class_=&amp;#39;name&amp;#39;) → by class
 soup.find(id=&amp;#39;name&amp;#39;) → by id
 soup.find_all(&amp;#39;tag&amp;#39;) → all elements
 element.get_text(strip=True) → extract text ✅
 element.get(&amp;#39;href&amp;#39;) → extract attribute ✅
 soup.select(&amp;#39;div.class &amp;gt; p&amp;#39;) → CSS selector

Ethical Scraping:
 ✅ Check robots.txt first
 ✅ Follow crawl-delay
 ✅ Add time.sleep() between requests
 ✅ Set User-Agent header
 ❌ Ignore robots.txt
 ❌ Rapid-fire requests

Common Patterns:
 # Fetch + parse
 response = requests.get(url)
 soup = BeautifulSoup(response.text, &amp;#39;html.parser&amp;#39;)

 # Extract all links
 links = [a.get(&amp;#39;href&amp;#39;) for a in soup.find_all(&amp;#39;a&amp;#39;, href=True)]

 # Extract table
 df = pd.read_html(response.text)[0]

 # Extract all text
 text = soup.get_text(separator=&amp;#39;\n&amp;#39;, strip=True)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;✅ Section 6 done! Proceed to &lt;strong&gt;Section 7: Python Error Handling &amp;amp; Logging&lt;/strong&gt;?&lt;/p&gt;</description></item><item><title>7. Python Error Handling &amp; Logging</title><link>/docs/7.-python-error-handling--logging/</link><pubDate>Sun, 07 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/7.-python-error-handling--logging/</guid><description>&lt;h2 id="7-python-error-handling--logging"&gt;7. Python Error Handling &amp;amp; Logging&lt;a class="anchor" href="#7-python-error-handling--logging"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-try-except-finally---overview"&gt;1. &lt;code&gt;try-except-finally&lt;/code&gt; - Overview&lt;a class="anchor" href="#1-try-except-finally---overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Used to &lt;strong&gt;handle runtime errors&lt;/strong&gt; gracefully and ensure cleanup code always runs&lt;/li&gt;
&lt;li&gt;Most robust and maintainable solution for unexpected errors in data pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-execution-order---no-exception"&gt;2. Execution Order - No Exception:&lt;a class="anchor" href="#2-execution-order---no-exception"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;finally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# except block is SKIPPED if no exception occurs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-execution-order---exception-occurs"&gt;3. Execution Order - Exception Occurs:&lt;a class="anchor" href="#3-execution-order---exception-occurs"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;finally&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-finally-block"&gt;4. &lt;code&gt;finally&lt;/code&gt; Block:&lt;a class="anchor" href="#4-finally-block"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ALWAYS runs&lt;/strong&gt; regardless of whether exception occurred or not&lt;/li&gt;
&lt;li&gt;Used for: closing files, DB connections, releasing resources&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result = risky_operation()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; ValueError &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Error: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;e&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cleanup() &lt;span style="color:#007f7f"&gt;# ALWAYS runs ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-else-block"&gt;5. &lt;code&gt;else&lt;/code&gt; Block:&lt;a class="anchor" href="#5-else-block"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;only when NO exception&lt;/strong&gt; occurs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result = risky_operation()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; ValueError:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Error&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Success&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# only if no exception&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cleanup() &lt;span style="color:#007f7f"&gt;# always&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-specific-exception-types"&gt;6. Specific Exception Types:&lt;a class="anchor" href="#6-specific-exception-types"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Always use &lt;strong&gt;specific&lt;/strong&gt; exception types over generic ones&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; ValueError &lt;span style="color:#007f7f"&gt;# wrong value type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; FileNotFoundError &lt;span style="color:#007f7f"&gt;# file doesn&amp;#39;t exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; KeyError &lt;span style="color:#007f7f"&gt;# dictionary key missing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; TypeError &lt;span style="color:#007f7f"&gt;# wrong data type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; ZeroDivisionError &lt;span style="color:#007f7f"&gt;# division by zero&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; Exception &lt;span style="color:#007f7f"&gt;# catch-all (use sparingly)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-generic-exception"&gt;7. Generic &lt;code&gt;Exception&lt;/code&gt;:&lt;a class="anchor" href="#7-generic-exception"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Catches everything - use only as last resort&lt;/li&gt;
&lt;li&gt;Hides bugs by catching unexpected errors silently&lt;/li&gt;
&lt;li&gt;✅ Always prefer specific exceptions&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="8-common-wrong-answers"&gt;8. Common Wrong Answers:&lt;a class="anchor" href="#8-common-wrong-answers"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ &lt;code&gt;try-catch-finally&lt;/code&gt; → Java/JavaScript syntax, NOT Python&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;if-else-finally&lt;/code&gt; → not valid Python&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;try only&lt;/code&gt; → no cleanup, no error handling&lt;/li&gt;
&lt;li&gt;❌ Using only generic &lt;code&gt;try-except&lt;/code&gt; → too broad, misses specific handling&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="9-logging-module"&gt;9. &lt;code&gt;logging&lt;/code&gt; Module:&lt;a class="anchor" href="#9-logging-module"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Better than &lt;code&gt;print()&lt;/code&gt; for production code&lt;/li&gt;
&lt;li&gt;Records errors with timestamps, severity levels&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; logging
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logging.debug(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Debug info&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# development details&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logging.info(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Pipeline started&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# general info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logging.warning(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Missing data&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# something unexpected&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logging.error(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;API call failed&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# serious problem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logging.critical(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;DB crashed&amp;#34;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# system failure&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="log-levels-low--high"&gt;Log Levels (low → high):&lt;a class="anchor" href="#log-levels-low--high"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;DEBUG &amp;lt; INFO &amp;lt; WARNING &amp;lt; ERROR &amp;lt; CRITICAL&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="10-error-handling-in-data-pipelines"&gt;10. Error Handling in Data Pipelines:&lt;a class="anchor" href="#10-error-handling-in-data-pipelines"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Exam-relevant pattern&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df = pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;data.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; FileNotFoundError:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logging.error(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Data file missing&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt; pd.errors.EmptyDataError:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logging.error(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;File is empty&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logging.info(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Pipeline step complete&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>8. Python &amp; pandas - Core Operations</title><link>/docs/8.-python--pandas---core-operations/</link><pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/8.-python--pandas---core-operations/</guid><description>&lt;h2 id="8-python--pandas---core-operations"&gt;8. Python &amp;amp; pandas - Core Operations&lt;a class="anchor" href="#8-python--pandas---core-operations"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-detecting-missing-values"&gt;1. Detecting Missing Values:&lt;a class="anchor" href="#1-detecting-missing-values"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.isnull().sum() &lt;span style="color:#007f7f"&gt;# count NaN per column&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.isnull().sum() / &lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(df) * &lt;span style="color:#ff0;font-weight:bold"&gt;100&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# percentage missing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="2-dfcount---count-non-null-values"&gt;2. &lt;code&gt;df.count()&lt;/code&gt; - Count Non-Null Values:&lt;a class="anchor" href="#2-dfcount---count-non-null-values"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.count() &lt;span style="color:#007f7f"&gt;# non-null count per column ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].count() &lt;span style="color:#007f7f"&gt;# for single column&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;code&gt;df.notnull()&lt;/code&gt; → returns boolean mask, not count&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;df.describe()&lt;/code&gt; → summary stats, not just count&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-dfdropna---remove-missing-values"&gt;3. &lt;code&gt;df.dropna()&lt;/code&gt; - Remove Missing Values:&lt;a class="anchor" href="#3-dfdropna---remove-missing-values"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.dropna() &lt;span style="color:#007f7f"&gt;# drop rows with ANY NaN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.dropna(subset=[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;review_text&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# drop rows where specific column is NaN ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.dropna(how=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;all&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# drop only if ALL values are NaN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;dropna(subset=['col'])&lt;/code&gt; - exam answer for targeted column NaN removal&lt;/li&gt;
&lt;li&gt;❌ Replace all NaN with &amp;ldquo;missing&amp;rdquo; → pollutes text analysis&lt;/li&gt;
&lt;li&gt;❌ Delete entire column → loses all data&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-dffillna---fill-missing-values"&gt;4. &lt;code&gt;df.fillna()&lt;/code&gt; - Fill Missing Values:&lt;a class="anchor" href="#4-dffillna---fill-missing-values"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.fillna(&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# fill with constant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].fillna(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].mean()) &lt;span style="color:#007f7f"&gt;# fill with mean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].fillna(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].median()) &lt;span style="color:#007f7f"&gt;# fill with median&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.fillna(method=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ffill&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# forward fill (time series)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.fillna(method=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;bfill&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# backward fill&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-when-to-use-which-fill-strategy"&gt;5. When to Use Which Fill Strategy:&lt;a class="anchor" href="#5-when-to-use-which-fill-strategy"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Strategy&lt;/th&gt;
 &lt;th&gt;When&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Drop rows&lt;/td&gt;
 &lt;td&gt;Text analysis, small % missing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Fill mean&lt;/td&gt;
 &lt;td&gt;Normally distributed numeric&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Fill median&lt;/td&gt;
 &lt;td&gt;Skewed data, outliers present&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Fill mode&lt;/td&gt;
 &lt;td&gt;Categorical data&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Forward fill&lt;/td&gt;
 &lt;td&gt;Time series, ordered data&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="6-columnnunique---count-distinct-values"&gt;6. &lt;code&gt;column.nunique()&lt;/code&gt; - Count Distinct Values:&lt;a class="anchor" href="#6-columnnunique---count-distinct-values"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].nunique() &lt;span style="color:#007f7f"&gt;# number of unique values ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].unique() &lt;span style="color:#007f7f"&gt;# array of unique values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].value_counts() &lt;span style="color:#007f7f"&gt;# count of each unique value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;nunique()&lt;/code&gt; - most efficient for just counting distinct values&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;len(set(column))&lt;/code&gt; → works but memory inefficient for large data&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;column.count()&lt;/code&gt; → counts non-null, NOT unique&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="7-value-inspection-methods"&gt;7. Value Inspection Methods:&lt;a class="anchor" href="#7-value-inspection-methods"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Method&lt;/th&gt;
 &lt;th&gt;Returns&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;nunique()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Integer count of unique values ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;unique()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Array of all unique values&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;value_counts()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Frequency of each unique value&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;count()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Count of non-null values&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="8-groupbymean---aggregation"&gt;8. &lt;code&gt;groupby().mean()&lt;/code&gt; - Aggregation:&lt;a class="anchor" href="#8-groupbymean---aggregation"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;cuisine&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rating&amp;#39;&lt;/span&gt;].mean() &lt;span style="color:#007f7f"&gt;# average rating per cuisine ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;code&gt;df.sort_values('cuisine')&lt;/code&gt; → sorts, doesn&amp;rsquo;t aggregate&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;df.filter('cuisine')&lt;/code&gt; → not valid syntax&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;df.merge('cuisine', 'rating')&lt;/code&gt; → not valid syntax&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="9-all-aggregation-functions"&gt;9. All Aggregation Functions:&lt;a class="anchor" href="#9-all-aggregation-functions"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;].mean() &lt;span style="color:#007f7f"&gt;# average&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;].sum() &lt;span style="color:#007f7f"&gt;# total&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;].count() &lt;span style="color:#007f7f"&gt;# count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;].max() &lt;span style="color:#007f7f"&gt;# maximum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;].min() &lt;span style="color:#007f7f"&gt;# minimum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;].median() &lt;span style="color:#007f7f"&gt;# median&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.groupby(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;)[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;].std() &lt;span style="color:#007f7f"&gt;# standard deviation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="10-drop_duplicates---remove-duplicates"&gt;10. &lt;code&gt;drop_duplicates()&lt;/code&gt; - Remove Duplicates:&lt;a class="anchor" href="#10-drop_duplicates---remove-duplicates"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.drop_duplicates() &lt;span style="color:#007f7f"&gt;# all columns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.drop_duplicates(subset=[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# specific column ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].drop_duplicates().values &lt;span style="color:#007f7f"&gt;# memory-efficient unique values ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="11-correlation-analysis"&gt;11. Correlation Analysis:&lt;a class="anchor" href="#11-correlation-analysis"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.corr() &lt;span style="color:#007f7f"&gt;# correlation matrix for all columns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col1&amp;#39;&lt;/span&gt;].corr(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col2&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# correlation between two columns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# pivot_table + corr for customer similarity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.pivot_table(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; index=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;customer_id&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; columns=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;product_category&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; values=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;purchase_amount&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;).fillna(&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;).corr() &lt;span style="color:#007f7f"&gt;# ✅ exam answer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="12-sorting"&gt;12. Sorting:&lt;a class="anchor" href="#12-sorting"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.sort_values(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ascending&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.sort_values(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;, ascending=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# descending&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.sort_values([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col1&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col2&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# multiple columns&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="13-merging-dataframes"&gt;13. Merging DataFrames:&lt;a class="anchor" href="#13-merging-dataframes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.merge(df1, df2, on=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# inner join (default)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.merge(df1, df2, on=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;, how=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# left join&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.merge(df1, df2, on=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;, how=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;outer&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# outer join&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.concat([df1, df2]) &lt;span style="color:#007f7f"&gt;# stack vertically&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="14-filtering-rows"&gt;14. Filtering Rows:&lt;a class="anchor" href="#14-filtering-rows"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rating&amp;#39;&lt;/span&gt;] &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;3.0&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# single condition ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rating&amp;#39;&lt;/span&gt;] &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;) &amp;amp; (df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;] == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;NYC&amp;#39;&lt;/span&gt;)] &lt;span style="color:#007f7f"&gt;# multiple conditions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].isin([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val1&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val2&amp;#39;&lt;/span&gt;])] &lt;span style="color:#007f7f"&gt;# filter by list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].str.contains(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;pattern&amp;#39;&lt;/span&gt;)] &lt;span style="color:#007f7f"&gt;# string filter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="15-string-operations-on-columns"&gt;15. String Operations on Columns:&lt;a class="anchor" href="#15-string-operations-on-columns"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].str.lower() &lt;span style="color:#007f7f"&gt;# lowercase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].str.upper() &lt;span style="color:#007f7f"&gt;# uppercase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].str.strip() &lt;span style="color:#007f7f"&gt;# remove whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].str.replace(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# replace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].str.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# split&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].str.contains(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;pat&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# boolean mask&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="16-dataframe-exploration"&gt;16. DataFrame Exploration:&lt;a class="anchor" href="#16-dataframe-exploration"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.head() &lt;span style="color:#007f7f"&gt;# first 5 rows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.tail() &lt;span style="color:#007f7f"&gt;# last 5 rows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.info() &lt;span style="color:#007f7f"&gt;# column types + non-null counts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.describe() &lt;span style="color:#007f7f"&gt;# summary statistics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.shape &lt;span style="color:#007f7f"&gt;# (rows, columns)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.dtypes &lt;span style="color:#007f7f"&gt;# data type of each column&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.columns &lt;span style="color:#007f7f"&gt;# column names&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="17-data-types"&gt;17. Data Types:&lt;a class="anchor" href="#17-data-types"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.dtypes &lt;span style="color:#007f7f"&gt;# check all types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].astype(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;int&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# convert to integer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].astype(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;float&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# convert to float&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].astype(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;str&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# convert to string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].astype(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;category&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# convert to category (memory efficient)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.to_datetime(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;date_col&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# convert to datetime&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="18-reading--writing-data"&gt;18. Reading &amp;amp; Writing Data:&lt;a class="anchor" href="#18-reading--writing-data"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.read_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.read_json(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.json&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.read_parquet(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.parquet&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.read_excel(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;file.xlsx&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.read_sql(query, connection)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.to_csv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.csv&amp;#39;&lt;/span&gt;, index=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.to_json(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.json&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.to_parquet(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.parquet&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.to_excel(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;output.xlsx&amp;#39;&lt;/span&gt;, index=&lt;span style="color:#fff;font-weight:bold"&gt;False&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="19-collectionscounter"&gt;19. &lt;code&gt;collections.Counter&lt;/code&gt;:&lt;a class="anchor" href="#19-collectionscounter"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; collections &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; Counter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count frequencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Counter([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# {&amp;#39;a&amp;#39;: 2, &amp;#39;b&amp;#39;: 1, &amp;#39;c&amp;#39;: 1}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Counter.most_common(&lt;span style="color:#ff0;font-weight:bold"&gt;5&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# top 5 most frequent ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count URL segments in log analysis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Counter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;)[&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; url in urls
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(url.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;)) &amp;gt; &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Missing values:
 df.isnull().sum() → count NaN
 df.dropna(subset=[&amp;#39;col&amp;#39;]) → remove targeted NaN ✅
 df.fillna(value) → fill NaN

Unique values:
 df[&amp;#39;col&amp;#39;].nunique() → count distinct ✅
 df[&amp;#39;col&amp;#39;].unique() → array of unique
 df[&amp;#39;col&amp;#39;].value_counts() → frequency table

Aggregation:
 df.groupby(&amp;#39;col&amp;#39;)[&amp;#39;val&amp;#39;].mean() ✅

Duplicates:
 df.drop_duplicates(subset=[&amp;#39;col&amp;#39;]) ✅

Exception handling:
 No exception → try → finally ✅
 Exception → try → except → finally ✅
 finally → ALWAYS runs ✅
 try-catch → Java, NOT Python ❌&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>9. Python datetime &amp; String Operations</title><link>/docs/9.-python-datetime--string-operations/</link><pubDate>Tue, 09 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/9.-python-datetime--string-operations/</guid><description>&lt;h2 id="9-python-datetime--string-operations"&gt;9. Python datetime &amp;amp; String Operations&lt;a class="anchor" href="#9-python-datetime--string-operations"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-datetimestrptime---parse-string-to-datetime"&gt;1. &lt;code&gt;datetime.strptime()&lt;/code&gt; - Parse String to Datetime&lt;a class="anchor" href="#1-datetimestrptime---parse-string-to-datetime"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Converts a &lt;strong&gt;string → datetime object&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Need to specify exact format matching the string&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; datetime &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp = datetime.strptime(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;14/Dec/2024:16:45:11 -0500&amp;#34;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;%d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/%b/%Y:%H:%M:%S %z&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="2-dbyhms-z---apache-log-format"&gt;2. &lt;code&gt;%d/%b/%Y:%H:%M:%S %z&lt;/code&gt; - Apache Log Format&lt;a class="anchor" href="#2-dbyhms-z---apache-log-format"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Most exam-relevant format string&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Used to parse Apache/Nginx log timestamps&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[14/Dec/2024:16:45:11 -0500]
 %d %b %Y %H %M %S %z&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="3-z---timezone-offset-critical"&gt;3. &lt;code&gt;%z&lt;/code&gt; - Timezone Offset (Critical!)&lt;a class="anchor" href="#3-z---timezone-offset-critical"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Parses timezone offset like &lt;code&gt;-0500&lt;/code&gt;, &lt;code&gt;+0530&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Without &lt;code&gt;%z&lt;/code&gt; → parsing fails or ignores timezone&lt;/li&gt;
&lt;li&gt;✅ Always include &lt;code&gt;%z&lt;/code&gt; for Apache log timestamps&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;%Z&lt;/code&gt; → timezone NAME (EST, UTC) - different from offset&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-timestamphour---extract-hour"&gt;4. &lt;code&gt;timestamp.hour&lt;/code&gt; - Extract Hour:&lt;a class="anchor" href="#4-timestamphour---extract-hour"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.hour &lt;span style="color:#007f7f"&gt;# 0-23 integer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.minute &lt;span style="color:#007f7f"&gt;# 0-59&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.second &lt;span style="color:#007f7f"&gt;# 0-59&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.date() &lt;span style="color:#007f7f"&gt;# date part only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.time() &lt;span style="color:#007f7f"&gt;# time part only&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-timestampweekday---day-of-week"&gt;5. &lt;code&gt;timestamp.weekday()&lt;/code&gt; - Day of Week:&lt;a class="anchor" href="#5-timestampweekday---day-of-week"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.weekday() &lt;span style="color:#007f7f"&gt;# returns integer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Mapping:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; Monday
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; Tuesday
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; Wednesday
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; Thursday
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;4&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; Friday
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;5&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; Saturday
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;6&lt;/span&gt; &lt;span style="color:#f00"&gt;→&lt;/span&gt; Sunday&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;weekday() == 6&lt;/code&gt; → Sunday (exam answer JAN_FN)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;weekday() == 5&lt;/code&gt; → Saturday (exam answer JAN_AN)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;weekday() == 0&lt;/code&gt; → Monday&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;timestamp.dayname()&lt;/code&gt; → method doesn&amp;rsquo;t exist&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;timestamp.strftime('%A') == 'Sunday'&lt;/code&gt; → works but less efficient&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="6-time-range-filtering---core-logic"&gt;6. Time Range Filtering - Core Logic:&lt;a class="anchor" href="#6-time-range-filtering---core-logic"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="key-rule"&gt;Key Rule:&lt;a class="anchor" href="#key-rule"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;For range X:00 to Y:59
→ X &amp;lt;= timestamp.hour &amp;lt;= Y

For range X:00 to Y:00 exclusive
→ X &amp;lt;= timestamp.hour &amp;lt; Y+1&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="exam-scenarios"&gt;Exam Scenarios:&lt;a class="anchor" href="#exam-scenarios"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 12:00 to 15:59 (includes 12,13,14,15)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;12&lt;/span&gt; &amp;lt;= timestamp.hour &amp;lt;= &lt;span style="color:#ff0;font-weight:bold"&gt;15&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 16:00 to 18:59 (includes 16,17,18)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;16&lt;/span&gt; &amp;lt;= timestamp.hour &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;19&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅ exam answer JAN_FN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# 14:00 to 16:59 (includes 14,15,16)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;14&lt;/span&gt; &amp;lt;= timestamp.hour &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;17&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅ exam answer JAN_AN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="common-wrong-answers"&gt;Common Wrong Answers:&lt;a class="anchor" href="#common-wrong-answers"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;16&lt;/span&gt; &amp;lt;= timestamp.hour &amp;lt;= &lt;span style="color:#ff0;font-weight:bold"&gt;16&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ❌ only hour 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff0;font-weight:bold"&gt;16&lt;/span&gt; &amp;lt; timestamp.hour &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;19&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ❌ excludes 16:xx entries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.hour in &lt;span style="color:#fff;font-weight:bold"&gt;range&lt;/span&gt;(&lt;span style="color:#ff0;font-weight:bold"&gt;16&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;20&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ❌ includes 19:xx entries&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-format-codes---complete-reference"&gt;7. Format Codes - Complete Reference:&lt;a class="anchor" href="#7-format-codes---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Code&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%d&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Day of month (zero-padded)&lt;/td&gt;
 &lt;td&gt;01–31&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%m&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Month as number&lt;/td&gt;
 &lt;td&gt;01–12&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%b&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Abbreviated month name&lt;/td&gt;
 &lt;td&gt;Jan, Dec&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%B&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Full month name&lt;/td&gt;
 &lt;td&gt;January&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%Y&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;4-digit year&lt;/td&gt;
 &lt;td&gt;2024&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%y&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;2-digit year&lt;/td&gt;
 &lt;td&gt;24&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%H&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hour 24-hr&lt;/td&gt;
 &lt;td&gt;00–23&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%I&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hour 12-hr&lt;/td&gt;
 &lt;td&gt;01–12&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%M&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Minutes&lt;/td&gt;
 &lt;td&gt;00–59&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%S&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Seconds&lt;/td&gt;
 &lt;td&gt;00–59&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%z&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;UTC offset&lt;/td&gt;
 &lt;td&gt;-0500&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%Z&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Timezone name&lt;/td&gt;
 &lt;td&gt;EST, UTC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%A&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Full weekday name&lt;/td&gt;
 &lt;td&gt;Monday&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%a&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Abbreviated weekday&lt;/td&gt;
 &lt;td&gt;Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;%p&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;AM/PM&lt;/td&gt;
 &lt;td&gt;AM, PM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="8-string-splitting---request-field-parsing"&gt;8. String Splitting - Request Field Parsing&lt;a class="anchor" href="#8-string-splitting---request-field-parsing"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="apache-request-field"&gt;Apache Request Field:&lt;a class="anchor" href="#apache-request-field"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;GET /checkout/payment HTTP/1.1&amp;#34;
 [0] [1] [2]&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;request = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;GET /checkout/payment HTTP/1.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;parts = request.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;method = parts[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# &amp;#39;GET&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url = parts[&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# &amp;#39;/checkout/payment&amp;#39; ✅ exam answer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;protocol = parts[&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# &amp;#39;HTTP/1.1&amp;#39; ✅ exam answer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;request.split(' ')[1]&lt;/code&gt; → URL (exam answer JAN_FN Q306)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;request.split(' ')[2]&lt;/code&gt; → Protocol (exam answer JAN_FN Q305)&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;request.split('/')[1]&lt;/code&gt; → splits by slash, gives wrong result&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;request.split(' ')[0]&lt;/code&gt; → gives HTTP method, not URL&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="9-url-path-matching"&gt;9. URL Path Matching:&lt;a class="anchor" href="#9-url-path-matching"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/tamilmp3/song.mp3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url.startswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/tamilmp3/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# ✅ prefix match (exam answer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url.endswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.mp3&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# suffix match&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong approaches:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/tamilmp3/&amp;#39;&lt;/span&gt; in url &lt;span style="color:#007f7f"&gt;# matches anywhere, not just start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/tamilmp3/&amp;#39;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# exact match only, misses sub-paths&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url.endswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/tamilmp3/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# checks end, not start&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="10-string-methods---complete-reference"&gt;10. String Methods - Complete Reference:&lt;a class="anchor" href="#10-string-methods---complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="case-operations"&gt;Case Operations:&lt;a class="anchor" href="#case-operations"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.lower() &lt;span style="color:#007f7f"&gt;# &amp;#39;HELLO&amp;#39; → &amp;#39;hello&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.upper() &lt;span style="color:#007f7f"&gt;# &amp;#39;hello&amp;#39; → &amp;#39;HELLO&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.title() &lt;span style="color:#007f7f"&gt;# &amp;#39;hello world&amp;#39; → &amp;#39;Hello World&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.capitalize() &lt;span style="color:#007f7f"&gt;# &amp;#39;hello world&amp;#39; → &amp;#39;Hello world&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.swapcase() &lt;span style="color:#007f7f"&gt;# &amp;#39;Hello&amp;#39; → &amp;#39;hELLO&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="whitespace"&gt;Whitespace:&lt;a class="anchor" href="#whitespace"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.strip() &lt;span style="color:#007f7f"&gt;# remove leading + trailing whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.lstrip() &lt;span style="color:#007f7f"&gt;# remove leading only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.rstrip() &lt;span style="color:#007f7f"&gt;# remove trailing only&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="search--check"&gt;Search &amp;amp; Check:&lt;a class="anchor" href="#search--check"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.startswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;pre&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# True/False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.endswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;suf&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# True/False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sub&amp;#39;&lt;/span&gt; in s &lt;span style="color:#007f7f"&gt;# True/False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.find(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sub&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# index of first occurrence (-1 if not found)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.index(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sub&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# index (raises ValueError if not found)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.count(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sub&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# count occurrences&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="replace--split"&gt;Replace &amp;amp; Split:&lt;a class="anchor" href="#replace--split"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.replace(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;old&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;new&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# replace all occurrences&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# split by delimiter → list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.split() &lt;span style="color:#007f7f"&gt;# split by whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;.join([&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;,&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;,&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# join list → &amp;#39;a,b,c&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="type-checking"&gt;Type Checking:&lt;a class="anchor" href="#type-checking"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.isdigit() &lt;span style="color:#007f7f"&gt;# all digits?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.isalpha() &lt;span style="color:#007f7f"&gt;# all letters?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.isalnum() &lt;span style="color:#007f7f"&gt;# alphanumeric?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.isnumeric() &lt;span style="color:#007f7f"&gt;# numeric?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.isspace() &lt;span style="color:#007f7f"&gt;# all whitespace?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.islower() &lt;span style="color:#007f7f"&gt;# all lowercase?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.isupper() &lt;span style="color:#007f7f"&gt;# all uppercase?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="format"&gt;Format:&lt;a class="anchor" href="#format"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Hello &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;name&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# f-string ✅ most common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Hello &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;.format(name) &lt;span style="color:#007f7f"&gt;# .format()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Hello &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;%s&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt; % name &lt;span style="color:#007f7f"&gt;# % operator (old style)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.zfill(&lt;span style="color:#ff0;font-weight:bold"&gt;5&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# &amp;#39;42&amp;#39; → &amp;#39;00042&amp;#39; (pad with zeros)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.ljust(&lt;span style="color:#ff0;font-weight:bold"&gt;10&lt;/span&gt;), s.rjust(&lt;span style="color:#ff0;font-weight:bold"&gt;10&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# left/right align&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s.center(&lt;span style="color:#ff0;font-weight:bold"&gt;10&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# center align&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="11-re-module---regular-expressions"&gt;11. &lt;code&gt;re&lt;/code&gt; Module - Regular Expressions&lt;a class="anchor" href="#11-re-module---regular-expressions"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-regex"&gt;What is Regex?&lt;a class="anchor" href="#what-is-regex"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Pattern matching for strings&lt;/li&gt;
&lt;li&gt;Used heavily in log parsing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="core-functions"&gt;Core Functions:&lt;a class="anchor" href="#core-functions"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.search(pattern, string) &lt;span style="color:#007f7f"&gt;# find first match anywhere&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.&lt;span style="color:#fff;font-weight:bold"&gt;match&lt;/span&gt;(pattern, string) &lt;span style="color:#007f7f"&gt;# match only at START&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.findall(pattern, string) &lt;span style="color:#007f7f"&gt;# return ALL matches as list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.sub(pattern, replacement, string) &lt;span style="color:#007f7f"&gt;# replace matches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.split(pattern, string) &lt;span style="color:#007f7f"&gt;# split by pattern&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="common-patterns"&gt;Common Patterns:&lt;a class="anchor" href="#common-patterns"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;\d &lt;span style="color:#007f7f"&gt;# any digit (0-9)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;\d+ &lt;span style="color:#007f7f"&gt;# one or more digits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;\w &lt;span style="color:#007f7f"&gt;# word character (letter, digit, underscore)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;\s &lt;span style="color:#007f7f"&gt;# whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;. &lt;span style="color:#007f7f"&gt;# any character except newline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;^ &lt;span style="color:#007f7f"&gt;# start of string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f00"&gt;$&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# end of string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[A-Z] &lt;span style="color:#007f7f"&gt;# any uppercase letter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;-&lt;span style="color:#ff0;font-weight:bold"&gt;9&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# any digit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(a|b) &lt;span style="color:#007f7f"&gt;# a or b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* &lt;span style="color:#007f7f"&gt;# zero or more&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+ &lt;span style="color:#007f7f"&gt;# one or more&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f00"&gt;?&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# zero or one&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;} &lt;span style="color:#007f7f"&gt;# exactly 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;5&lt;/span&gt;} &lt;span style="color:#007f7f"&gt;# between 2 and 5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="log-relevant-patterns"&gt;Log-Relevant Patterns:&lt;a class="anchor" href="#log-relevant-patterns"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Extract IP address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.findall(&lt;span style="color:#0ff;font-weight:bold"&gt;r&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&amp;#39;&lt;/span&gt;, log_line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Extract HTTP method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.search(&lt;span style="color:#0ff;font-weight:bold"&gt;r&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#34;(GET|POST|PUT|DELETE)&amp;#39;&lt;/span&gt;, log_line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Extract status code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.search(&lt;span style="color:#0ff;font-weight:bold"&gt;r&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&amp;#34; (\d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{3}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;) &amp;#39;&lt;/span&gt;, log_line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Extract timestamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.search(&lt;span style="color:#0ff;font-weight:bold"&gt;r&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;\[(\d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{2}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/\w+/\d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{4}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;:\d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{2}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;:\d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{2}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;:\d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{2}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;)&amp;#39;&lt;/span&gt;, log_line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Match time pattern for grep&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;re.compile(&lt;span style="color:#0ff;font-weight:bold"&gt;r&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;(0[89]|1[0-5]):[0-5][0-9]&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# 08:xx to 15:xx&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="datetime---additional-useful-operations"&gt;datetime - Additional Useful Operations:&lt;a class="anchor" href="#datetime---additional-useful-operations"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; datetime &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; datetime, timedelta
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Current time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;now = datetime.now()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;utc_now = datetime.utcnow()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Date arithmetic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tomorrow = now + timedelta(days=&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;last_week = now - timedelta(weeks=&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;three_hours_later = now + timedelta(hours=&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Compare timestamps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ts1 &amp;gt; ts2 &lt;span style="color:#007f7f"&gt;# is ts1 after ts2?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ts1 &amp;lt; ts2 &lt;span style="color:#007f7f"&gt;# is ts1 before ts2?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Convert to string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timestamp.strftime(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;%d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt; %H:%M:%S&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# pandas datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.to_datetime(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# parse column&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pd.to_datetime(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;], &lt;span style="color:#fff;font-weight:bold"&gt;format&lt;/span&gt;=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;%d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/%b/%Y:%H:%M:%S %z&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].dt.hour &lt;span style="color:#007f7f"&gt;# extract hour&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].dt.weekday &lt;span style="color:#007f7f"&gt;# day of week&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].dt.tz_convert(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;UTC&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# convert timezone&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Apache log format string:
 &amp;#34;%d/%b/%Y:%H:%M:%S %z&amp;#34; ✅

Weekday numbers:
 0=Mon, 1=Tue, 2=Wed, 3=Thu, 4=Fri, 5=Sat, 6=Sun

Time range check:
 12:00-15:59 → 12 &amp;lt;= hour &amp;lt;= 15 ✅
 16:00-18:59 → 16 &amp;lt;= hour &amp;lt; 19 ✅
 14:00-16:59 → 14 &amp;lt;= hour &amp;lt; 17 ✅

Request field splitting:
 split(&amp;#39; &amp;#39;)[0] → method
 split(&amp;#39; &amp;#39;)[1] → URL ✅
 split(&amp;#39; &amp;#39;)[2] → protocol ✅

URL matching:
 url.startswith(&amp;#39;/path/&amp;#39;) ✅
 &amp;#39;/path/&amp;#39; in url ❌ (matches anywhere)&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>10. Apache Log Analysis</title><link>/docs/10.-apache-log-analysis/</link><pubDate>Wed, 10 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/10.-apache-log-analysis/</guid><description>&lt;h2 id="10-apache-log-analysis"&gt;10. Apache Log Analysis&lt;a class="anchor" href="#10-apache-log-analysis"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-apache-log-format---structure"&gt;1. Apache Log Format - Structure&lt;a class="anchor" href="#1-apache-log-format---structure"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="standard-log-entry"&gt;Standard Log Entry:&lt;a class="anchor" href="#standard-log-entry"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;IP RemoteUser AuthUser [Timestamp] &amp;#34;Method URL Protocol&amp;#34; Status Size &amp;#34;Referrer&amp;#34; &amp;#34;UserAgent&amp;#34; VHost ServerIP&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="example-entry"&gt;Example Entry:&lt;a class="anchor" href="#example-entry"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;203.0.113.7 - - [14/Dec/2024:16:45:11 -0500] &amp;#34;GET /index.html HTTP/1.1&amp;#34; 200 3500 &amp;#34;-&amp;#34; &amp;#34;Mozilla/5.0 (iPhone; CPU iPhone OS 15_0)&amp;#34; shop.com 192.168.1.100&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="field-breakdown"&gt;Field Breakdown:&lt;a class="anchor" href="#field-breakdown"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;IP&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;203.0.113.7&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Visitor IP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RemoteUser&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Typically &lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AuthUser&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Typically &lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Timestamp&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[14/Dec/2024:16:45:11 -0500]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Includes timezone&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Method&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP method&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;URL&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/index.html&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Path visited&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Protocol&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;HTTP/1.1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP version&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Status&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP status code&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Size&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;3500&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Response bytes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Referrer&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;-&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Where request came from&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;UserAgent&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;Mozilla/5.0...&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Browser/device info&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;VHost&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;shop.com&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Virtual host&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ServerIP&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;192.168.1.100&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Server IP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="2-valid-log-entry-rules"&gt;2. Valid Log Entry Rules&lt;a class="anchor" href="#2-valid-log-entry-rules"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="valid-entry-must-have"&gt;Valid Entry Must Have:&lt;a class="anchor" href="#valid-entry-must-have"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;✅ Numeric HTTP status code (&lt;code&gt;200&lt;/code&gt;, &lt;code&gt;404&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Valid HTTP method (&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Valid protocol string (&lt;code&gt;HTTP/1.1&lt;/code&gt;, &lt;code&gt;HTTP/2.0&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="invalid-entries"&gt;Invalid Entries:&lt;a class="anchor" href="#invalid-entries"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;POST /image.jpg INVALID&amp;#34; ❌ invalid protocol
&amp;#34;PUT /image.jpg HTTP/1.1&amp;#34; OK ❌ status must be numeric not &amp;#34;OK&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="3-log-filtering-fields"&gt;3. Log Filtering Fields&lt;a class="anchor" href="#3-log-filtering-fields"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="to-filter-post-requests-for-images-from-15001800-on-mondays-need"&gt;To filter &amp;ldquo;POST requests for /images/ from 15:00–18:00 on Mondays&amp;rdquo; need:&lt;a class="anchor" href="#to-filter-post-requests-for-images-from-15001800-on-mondays-need"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Time&lt;/strong&gt; → for hour AND day-of-week filtering&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Method&lt;/strong&gt; → check POST&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;URL&lt;/strong&gt; → check &lt;code&gt;/images/&lt;/code&gt; path&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="not-needed-for-this-filter"&gt;NOT needed for this filter:&lt;a class="anchor" href="#not-needed-for-this-filter"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;❌ Status, Size, Referrer, Server → irrelevant to this filter&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-mobile-detection-from-useragent"&gt;4. Mobile Detection from UserAgent&lt;a class="anchor" href="#4-mobile-detection-from-useragent"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Correct - check multiple mobile indicators&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mobile_indicators = [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;mobile&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;iphone&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;android&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ipad&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;is_mobile = &lt;span style="color:#fff;font-weight:bold"&gt;any&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicator in user_agent.lower()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; indicator in mobile_indicators
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong - too narrow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Mobile&amp;#39;&lt;/span&gt; in user_agent &lt;span style="color:#007f7f"&gt;# case sensitive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user_agent.startswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Mozilla/5.0 (Mobile&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# too specific&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;webkit&amp;#39;&lt;/span&gt; in user_agent.lower() &lt;span style="color:#007f7f"&gt;# webkit used by desktop too&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-counting-url-segments---collectionscounter"&gt;5. Counting URL Segments - &lt;code&gt;collections.Counter&lt;/code&gt;&lt;a class="anchor" href="#5-counting-url-segments---collectionscounter"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; collections &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; Counter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Count checkout transactions by product category&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# URLs like: /checkout/electronics/, /checkout/clothing/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Counter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;)[&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; url in filtered_checkout_urls
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(url.split(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;)) &amp;gt; &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Result: {&amp;#39;electronics&amp;#39;: 45, &amp;#39;clothing&amp;#39;: 32, &amp;#39;food&amp;#39;: 18}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-validate-filters-independently---debugging"&gt;6. Validate Filters Independently - Debugging&lt;a class="anchor" href="#6-validate-filters-independently---debugging"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="systematic-approach"&gt;Systematic Approach:&lt;a class="anchor" href="#systematic-approach"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Validate each filter step by step&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;all_entries = parse_log(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 1: Check time filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;time_filtered = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in all_entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;12&lt;/span&gt; &amp;lt;= e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;].hour &amp;lt;= &lt;span style="color:#ff0;font-weight:bold"&gt;15&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;After time filter: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(time_filtered)&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 2: Check method filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;method_filtered = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in time_filtered
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;method&amp;#39;&lt;/span&gt;] == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;After method filter: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(method_filtered)&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 3: Check URL filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url_filtered = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in method_filtered
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;].startswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/checkout/&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;After URL filter: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(url_filtered)&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 4: Check status filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;final = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in url_filtered
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt; &amp;lt;= e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;] &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;300&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;print&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Final count: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(final)&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Validate each filter independently - exam answer&lt;/li&gt;
&lt;li&gt;❌ Assume data corruption → wrong first assumption&lt;/li&gt;
&lt;li&gt;❌ Reduce dataset randomly → loses data integrity&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="7-any-of-these-could-be-the-reason"&gt;7. &amp;ldquo;Any of These Could Be the Reason&amp;rdquo;&lt;a class="anchor" href="#7-any-of-these-could-be-the-reason"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If log count appears &lt;strong&gt;unexpectedly high&lt;/strong&gt; → any filter could be wrong:
&lt;ul&gt;
&lt;li&gt;Wrong weekday number&lt;/li&gt;
&lt;li&gt;Wrong hour range boundary&lt;/li&gt;
&lt;li&gt;Missing URL path filter&lt;/li&gt;
&lt;li&gt;Wrong HTTP method filter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;✅ &amp;ldquo;Any of these could be the reason&amp;rdquo; - exam answer (JAN_FN Q310, JAN_AN Q429)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="8-double-filter-for-404-count"&gt;8. Double Filter for 404 Count&lt;a class="anchor" href="#8-double-filter-for-404-count"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Must apply BOTH filters before counting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;filtered = [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;].startswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/error/&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# URL filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; and e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;] == &lt;span style="color:#ff0;font-weight:bold"&gt;404&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# status filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;count = &lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(filtered)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong - counts everything in filtered_entries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# without applying the second filter (status==404)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(filtered_entries) &lt;span style="color:#007f7f"&gt;# if filtered_entries only has URL filter applied&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &amp;ldquo;None of these&amp;rdquo; - exam answer (JAN_AN Q428) when options show incomplete filtering&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="9-reading-compressed-logs"&gt;9. Reading Compressed Logs&lt;a class="anchor" href="#9-reading-compressed-logs"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; gzip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Read gzipped log file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; gzip.open(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log.gz&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rt&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f: &lt;span style="color:#007f7f"&gt;# generator - memory efficient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(line)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="10-generator-pattern-for-large-logs"&gt;10. Generator Pattern for Large Logs&lt;a class="anchor" href="#10-generator-pattern-for-large-logs"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Memory efficient - one line at a time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Loads entire file into memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lines = &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log&amp;#39;&lt;/span&gt;).readlines()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="complete-log-parsing---minimal-reference"&gt;Complete Log Parsing - Minimal Reference:&lt;a class="anchor" href="#complete-log-parsing---minimal-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; gzip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; datetime &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; parse_log_line(line):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;Parse single Apache log line&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; shlex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parts = shlex.split(line) &lt;span style="color:#007f7f"&gt;# handles quoted fields correctly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ip&amp;#39;&lt;/span&gt;: parts[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;: datetime.strptime(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parts[&lt;span style="color:#ff0;font-weight:bold"&gt;3&lt;/span&gt;].strip(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;[]&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;%d&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;/%b/%Y:%H:%M:%S %z&amp;#39;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# ✅ exam format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;method&amp;#39;&lt;/span&gt;: parts[&lt;span style="color:#ff0;font-weight:bold"&gt;5&lt;/span&gt;], &lt;span style="color:#007f7f"&gt;# split(&amp;#39; &amp;#39;)[0] of request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;: parts[&lt;span style="color:#ff0;font-weight:bold"&gt;6&lt;/span&gt;], &lt;span style="color:#007f7f"&gt;# split(&amp;#39; &amp;#39;)[1] of request ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;protocol&amp;#39;&lt;/span&gt;: parts[&lt;span style="color:#ff0;font-weight:bold"&gt;7&lt;/span&gt;], &lt;span style="color:#007f7f"&gt;# split(&amp;#39; &amp;#39;)[2] of request ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;: &lt;span style="color:#fff;font-weight:bold"&gt;int&lt;/span&gt;(parts[&lt;span style="color:#ff0;font-weight:bold"&gt;8&lt;/span&gt;]),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;size&amp;#39;&lt;/span&gt;: parts[&lt;span style="color:#ff0;font-weight:bold"&gt;9&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;user_agent&amp;#39;&lt;/span&gt;: parts[&lt;span style="color:#ff0;font-weight:bold"&gt;11&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;except&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; analyze_log(filepath):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007f7f"&gt;# Handle both gzipped and plain files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; opener = gzip.open &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; filepath.endswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;.gz&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;open&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;with&lt;/span&gt; opener(filepath, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;rt&amp;#39;&lt;/span&gt;) &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; line in f: &lt;span style="color:#007f7f"&gt;# ✅ generator pattern&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; entry = parse_log_line(line.strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; entry:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results.append(entry)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="common-log-analysis-patterns"&gt;Common Log Analysis Patterns:&lt;a class="anchor" href="#common-log-analysis-patterns"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;entries = analyze_log(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;access.log.gz&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Filter by time range&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;peak_hour = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;12&lt;/span&gt; &amp;lt;= e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;].hour &amp;lt;= &lt;span style="color:#ff0;font-weight:bold"&gt;15&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Filter by weekday&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mondays = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;].weekday() == &lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ✅ 0=Monday&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Filter POST to /checkout/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;checkouts = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;method&amp;#39;&lt;/span&gt;] == &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; and e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;].startswith(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;/checkout/&amp;#39;&lt;/span&gt;)] &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Filter successful requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;successful = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;200&lt;/span&gt; &amp;lt;= e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;] &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;300&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Filter mobile traffic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mobile = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;any&lt;/span&gt;(m in e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;user_agent&amp;#39;&lt;/span&gt;].lower()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; m in [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;mobile&amp;#39;&lt;/span&gt;,&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;iphone&amp;#39;&lt;/span&gt;,&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;android&amp;#39;&lt;/span&gt;,&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ipad&amp;#39;&lt;/span&gt;])] &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Filter redirects&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;redirects = [e &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; e in entries
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#ff0;font-weight:bold"&gt;300&lt;/span&gt; &amp;lt;= e[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;] &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;400&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Log Format:
 IP - - [Timestamp] &amp;#34;Method URL Protocol&amp;#34; Status Size &amp;#34;Ref&amp;#34; &amp;#34;UA&amp;#34; VHost ServerIP

Valid entry needs:
 ✅ Numeric status code
 ✅ Valid HTTP method
 ✅ Valid protocol string (HTTP/1.1)

Fields for POST/path/time filter:
 ✅ Time + Method + URL

Datetime format:
 &amp;#34;%d/%b/%Y:%H:%M:%S %z&amp;#34; ✅

Weekday numbers:
 0=Mon, 1=Tue, 2=Wed, 3=Thu, 4=Fri, 5=Sat, 6=Sun

Time ranges:
 12:00-15:59 → 12 &amp;lt;= hour &amp;lt;= 15 ✅
 16:00-18:59 → 16 &amp;lt;= hour &amp;lt; 19 ✅

Request field splitting:
 split(&amp;#39; &amp;#39;)[0] → method
 split(&amp;#39; &amp;#39;)[1] → URL ✅
 split(&amp;#39; &amp;#39;)[2] → protocol ✅

URL matching:
 url.startswith(&amp;#39;/path/&amp;#39;) ✅

Status ranges:
 200 &amp;lt;= status &amp;lt; 300 → success ✅
 300 &amp;lt;= status &amp;lt; 400 → redirect ✅

Unexpected high count:
 → Any filter could be wrong ✅

Large file processing:
 → Generator: for line in open() ✅
 → gzip.open() for .gz files ✅&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>11. Data Cleaning &amp; OpenRefine</title><link>/docs/11.-data-cleaning--openrefine/</link><pubDate>Thu, 11 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/11.-data-cleaning--openrefine/</guid><description>&lt;h2 id="11-data-cleaning--openrefine"&gt;11. Data Cleaning &amp;amp; OpenRefine&lt;a class="anchor" href="#11-data-cleaning--openrefine"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-openrefine---overview"&gt;1. OpenRefine - Overview&lt;a class="anchor" href="#1-openrefine---overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Free, open-source tool for &lt;strong&gt;interactive data cleaning and reconciliation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Runs locally in browser (not cloud-based)&lt;/li&gt;
&lt;li&gt;Works like a spreadsheet but far more powerful for messy data&lt;/li&gt;
&lt;li&gt;❌ NOT for model training&lt;/li&gt;
&lt;li&gt;❌ NOT for visual dashboarding&lt;/li&gt;
&lt;li&gt;❌ NOT for source control&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-text-clustering---overview"&gt;2. Text Clustering - Overview&lt;a class="anchor" href="#2-text-clustering---overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Automatically &lt;strong&gt;groups similar text values&lt;/strong&gt; so you can merge them&lt;/li&gt;
&lt;li&gt;Solves inconsistent naming problem:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;Microsoft Corp&amp;#34;
&amp;#34;MICROSOFT CORPORATION&amp;#34;
&amp;#34;microsoft&amp;#34;
&amp;#34;MSFT&amp;#34;
→ All same entity → cluster and merge into one&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="3-clustering-algorithms"&gt;3. Clustering Algorithms&lt;a class="anchor" href="#3-clustering-algorithms"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="fingerprinting-default"&gt;Fingerprinting (default):&lt;a class="anchor" href="#fingerprinting-default"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Normalizes text → lowercase, remove punctuation, sort words, remove duplicates&lt;/li&gt;
&lt;li&gt;Best for: &lt;strong&gt;simple variations in spacing/case&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Example: &amp;ldquo;John Smith&amp;rdquo; and &amp;ldquo;smith john&amp;rdquo; → same fingerprint&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="n-gram-fingerprint"&gt;N-gram Fingerprint:&lt;a class="anchor" href="#n-gram-fingerprint"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Uses character n-grams for comparison&lt;/li&gt;
&lt;li&gt;Best for: &lt;strong&gt;slight spelling differences, abbreviations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Example: &amp;ldquo;Microsoft&amp;rdquo; and &amp;ldquo;Microsoft&amp;rdquo; (typo)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="levenshtein-edit-distance"&gt;Levenshtein (Edit Distance):&lt;a class="anchor" href="#levenshtein-edit-distance"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Counts minimum edits (insert/delete/replace) to transform one string to another&lt;/li&gt;
&lt;li&gt;Best for: &lt;strong&gt;typos, minor errors&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ppm"&gt;PPM:&lt;a class="anchor" href="#ppm"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Compression-based similarity&lt;/p&gt;</description></item><item><title>12. Geospatial Analysis</title><link>/docs/12.-geospatial-analysis/</link><pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/12.-geospatial-analysis/</guid><description>&lt;h2 id="12-geospatial-analysis"&gt;12. Geospatial Analysis&lt;a class="anchor" href="#12-geospatial-analysis"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-geopandas--overview"&gt;1. GeoPandas — Overview&lt;a class="anchor" href="#1-geopandas--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Extends pandas to support &lt;strong&gt;spatial/geographic data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Handles: points, lines, polygons, spatial joins, buffers, distance calculations&lt;/li&gt;
&lt;li&gt;❌ pandas alone cannot do spatial operations&lt;/li&gt;
&lt;li&gt;❌ matplotlib alone cannot do interactive maps&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-creating-geodataframe-from-csv"&gt;2. Creating GeoDataFrame from CSV:&lt;a class="anchor" href="#2-creating-geodataframe-from-csv"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; geopandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; gpd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf = gpd.GeoDataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; geometry=gpd.points_from_xy(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;longitude&amp;#39;&lt;/span&gt;], df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;latitude&amp;#39;&lt;/span&gt;]),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; crs=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;EPSG:4326&amp;#39;&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# always set CRS ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="3-gpdpoints_from_xy"&gt;3. &lt;code&gt;gpd.points_from_xy()&lt;/code&gt;:&lt;a class="anchor" href="#3-gpdpoints_from_xy"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Creates Point geometries from longitude and latitude columns&lt;/li&gt;
&lt;li&gt;Note: &lt;strong&gt;longitude first, latitude second&lt;/strong&gt; (x, y order)&lt;/li&gt;
&lt;li&gt;❌ Common mistake: swapping lat/lon order&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-reprojecting-crs"&gt;4. Reprojecting CRS:&lt;a class="anchor" href="#4-reprojecting-crs"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Reproject to metric before distance calculation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf_metric = gdf.to_crs(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;EPSG:3857&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Distance in meters now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf_metric.geometry.distance(city_center_point)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-crs--coordinate-reference-systems"&gt;5. CRS — Coordinate Reference Systems&lt;a class="anchor" href="#5-crs--coordinate-reference-systems"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="two-main-types"&gt;Two Main Types:&lt;a class="anchor" href="#two-main-types"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;CRS&lt;/th&gt;
 &lt;th&gt;Code&lt;/th&gt;
 &lt;th&gt;Unit&lt;/th&gt;
 &lt;th&gt;Use For&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;WGS84 (Geographic)&lt;/td&gt;
 &lt;td&gt;EPSG:4326&lt;/td&gt;
 &lt;td&gt;Degrees&lt;/td&gt;
 &lt;td&gt;Storing GPS coordinates&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web Mercator (Projected)&lt;/td&gt;
 &lt;td&gt;EPSG:3857&lt;/td&gt;
 &lt;td&gt;Meters&lt;/td&gt;
 &lt;td&gt;Distance calculations ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="the-distance-problem--exam-scenario"&gt;The Distance Problem — Exam Scenario:&lt;a class="anchor" href="#the-distance-problem--exam-scenario"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Symptom: &amp;#34;Stores 1km apart show as 0.01 units apart&amp;#34;
Cause: Using degree-based CRS (EPSG:4326)
Fix: Reproject to metric CRS (EPSG:3857) ✅&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Coordinates in degree-based CRS → reproject to metric for correct distances — exam answer&lt;/li&gt;
&lt;li&gt;❌ Data is corrupted → wrong diagnosis&lt;/li&gt;
&lt;li&gt;❌ GeoPandas doesn&amp;rsquo;t work with lat/lon → false&lt;/li&gt;
&lt;li&gt;❌ Multiply all distances by 100 → wrong fix&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="6-distance-filtering"&gt;6. Distance Filtering:&lt;a class="anchor" href="#6-distance-filtering"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Correct approach — exam answer (TDS Q19)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 1: Create city center point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; shapely.geometry &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; Point
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;city_center = gpd.GeoDataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; geometry=[Point(&lt;span style="color:#ff0;font-weight:bold"&gt;77.2090&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;28.6139&lt;/span&gt;)], &lt;span style="color:#007f7f"&gt;# lon, lat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; crs=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;EPSG:4326&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;).to_crs(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;EPSG:3857&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 2: Reproject stores to metric&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf_metric = gdf.to_crs(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;EPSG:3857&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 3: Calculate distances in meters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf_metric[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;distance_m&amp;#39;&lt;/span&gt;] = gdf_metric.geometry.distance(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; city_center.geometry[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Step 4: Filter stores within 5km&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;within_5km = gdf_metric[gdf_metric[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;distance_m&amp;#39;&lt;/span&gt;] &amp;lt; &lt;span style="color:#ff0;font-weight:bold"&gt;5000&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Create Point → calculate distances → filter where distance &amp;lt; 5000m — exam answer&lt;/li&gt;
&lt;li&gt;❌ Manually calculate latitude difference and compare to 5 → wrong&lt;/li&gt;
&lt;li&gt;❌ Sort by latitude and pick first 5 → wrong&lt;/li&gt;
&lt;li&gt;❌ Use pandas string matching on store names → wrong&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="7-shapely--geometric-objects"&gt;7. Shapely — Geometric Objects&lt;a class="anchor" href="#7-shapely--geometric-objects"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-shapely"&gt;What is Shapely?&lt;a class="anchor" href="#what-is-shapely"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Creates and manipulates &lt;strong&gt;geometric objects&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Works alongside GeoPandas for spatial calculations&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="core-objects"&gt;Core Objects:&lt;a class="anchor" href="#core-objects"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; shapely.geometry &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; Point, LineString, Polygon
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Point(&lt;span style="color:#ff0;font-weight:bold"&gt;77.2090&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;28.6139&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# (longitude, latitude)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LineString([(&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;), (&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;), (&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;)]) &lt;span style="color:#007f7f"&gt;# line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Polygon([(&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;),(&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;),(&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;),(&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;)])&lt;span style="color:#007f7f"&gt;# polygon&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="geometric-relationships"&gt;Geometric Relationships:&lt;a class="anchor" href="#geometric-relationships"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;point.within(polygon) &lt;span style="color:#007f7f"&gt;# is point inside polygon?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;polygon.contains(point) &lt;span style="color:#007f7f"&gt;# does polygon contain point?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;geom1.intersects(geom2) &lt;span style="color:#007f7f"&gt;# do they intersect?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;geom1.distance(geom2) &lt;span style="color:#007f7f"&gt;# distance between geometries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;geom1.buffer(distance) &lt;span style="color:#007f7f"&gt;# create buffer zone&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-pointlon-lat--shapely-coordinate-order"&gt;8. &lt;code&gt;Point(lon, lat)&lt;/code&gt; — Shapely Coordinate Order&lt;a class="anchor" href="#8-pointlon-lat--shapely-coordinate-order"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Shapely uses &lt;strong&gt;(longitude, latitude)&lt;/strong&gt; — x, y order&lt;/li&gt;
&lt;li&gt;❌ Common mistake: putting latitude first&lt;/li&gt;
&lt;li&gt;Folium uses &lt;strong&gt;(latitude, longitude)&lt;/strong&gt; — opposite order&lt;/li&gt;
&lt;li&gt;Always double-check which library you&amp;rsquo;re using&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="9-geopandas-spatial-operations"&gt;9. GeoPandas Spatial Operations:&lt;a class="anchor" href="#9-geopandas-spatial-operations"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf.area &lt;span style="color:#007f7f"&gt;# area of each geometry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf.length &lt;span style="color:#007f7f"&gt;# perimeter/length&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf.centroid &lt;span style="color:#007f7f"&gt;# center point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gdf.buffer(&lt;span style="color:#ff0;font-weight:bold"&gt;500&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# buffer zone (500 meters if metric CRS)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpd.sjoin(gdf1, gdf2) &lt;span style="color:#007f7f"&gt;# spatial join&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="10-folium--interactive-maps"&gt;10. Folium — Interactive Maps&lt;a class="anchor" href="#10-folium--interactive-maps"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-folium"&gt;What is Folium?&lt;a class="anchor" href="#what-is-folium"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Creates &lt;strong&gt;interactive maps&lt;/strong&gt; rendered in web browser&lt;/li&gt;
&lt;li&gt;Based on Leaflet.js&lt;/li&gt;
&lt;li&gt;Output: HTML file viewable in browser&lt;/li&gt;
&lt;li&gt;✅ Best for: stakeholder-facing interactive visualization&lt;/li&gt;
&lt;li&gt;❌ NOT for data manipulation&lt;/li&gt;
&lt;li&gt;❌ NOT for numerical calculations&lt;/li&gt;
&lt;li&gt;❌ NOT for HTTP requests&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="11-adding-elements-to-folium-map"&gt;11. Adding Elements to Folium Map:&lt;a class="anchor" href="#11-adding-elements-to-folium-map"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; folium
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create base map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m = folium.Map(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location=[&lt;span style="color:#ff0;font-weight:bold"&gt;28.6139&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;77.2090&lt;/span&gt;], &lt;span style="color:#007f7f"&gt;# [lat, lon] — note order!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; zoom_start=&lt;span style="color:#ff0;font-weight:bold"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Add marker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;folium.Marker(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location=[&lt;span style="color:#ff0;font-weight:bold"&gt;28.6289&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;77.2167&lt;/span&gt;], &lt;span style="color:#007f7f"&gt;# [lat, lon]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; popup=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Downtown Store&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tooltip=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;S001&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;).add_to(m)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Add circle (radius in meters)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;folium.Circle(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location=[&lt;span style="color:#ff0;font-weight:bold"&gt;28.6139&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;77.2090&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; radius=&lt;span style="color:#ff0;font-weight:bold"&gt;5000&lt;/span&gt;, &lt;span style="color:#007f7f"&gt;# 5km&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; color=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;red&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fill=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fill_opacity=&lt;span style="color:#ff0;font-weight:bold"&gt;0.2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;).add_to(m)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m.save(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;map.html&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="12-colored-markers--coverage-analysis"&gt;12. Colored Markers — Coverage Analysis:&lt;a class="anchor" href="#12-colored-markers--coverage-analysis"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Exam-relevant: different colors for within/outside zone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; _, store in gdf.iterrows():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; color = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;green&amp;#39;&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; store[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;within_5km&amp;#39;&lt;/span&gt;] &lt;span style="color:#fff;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;red&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; folium.Marker(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; location=[store[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;latitude&amp;#39;&lt;/span&gt;], store[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;longitude&amp;#39;&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; popup=store[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;store_name&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; icon=folium.Icon(color=color)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ).add_to(m)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="13-saving-folium-map"&gt;13. Saving Folium Map:&lt;a class="anchor" href="#13-saving-folium-map"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m.save(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;store_map.html&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# save as HTML file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Open in any web browser — interactive ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="14-library-combination--exam-answer"&gt;14. Library Combination — Exam Answer&lt;a class="anchor" href="#14-library-combination--exam-answer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Library&lt;/th&gt;
 &lt;th&gt;Role&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;pandas&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Load CSV, data manipulation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GeoPandas&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Spatial operations, distance, buffers&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Shapely&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Geometric object creation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Folium&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Interactive map visualization&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;✅ GeoPandas + Shapely + Folium = most comprehensive — exam answer (May_FN Q364)&lt;/li&gt;
&lt;li&gt;❌ Matplotlib + NumPy + Pandas → no spatial operations&lt;/li&gt;
&lt;li&gt;❌ Only pandas → no spatial distance&lt;/li&gt;
&lt;li&gt;❌ Only matplotlib → no interactive maps&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="15-haversine-formula--overview"&gt;15. Haversine Formula — Overview&lt;a class="anchor" href="#15-haversine-formula--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-haversine"&gt;What is Haversine?&lt;a class="anchor" href="#what-is-haversine"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Computes &lt;strong&gt;great-circle distance&lt;/strong&gt; between two GPS points on Earth&lt;/li&gt;
&lt;li&gt;Accounts for Earth&amp;rsquo;s spherical shape&lt;/li&gt;
&lt;li&gt;Result in kilometers or miles&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; math
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; haversine(lat1, lon1, lat2, lon2):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; R = &lt;span style="color:#ff0;font-weight:bold"&gt;6371&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# Earth radius in km&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lat1, lon1, lat2, lon2 = &lt;span style="color:#fff;font-weight:bold"&gt;map&lt;/span&gt;(math.radians, [lat1, lon1, lat2, lon2])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dlat = lat2 - lat1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dlon = lon2 - lon1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a = math.sin(dlat/&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)**&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; + math.cos(lat1)*math.cos(lat2)*math.sin(dlon/&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)**&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; R * &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt; * math.asin(math.sqrt(a))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dist = haversine(&lt;span style="color:#ff0;font-weight:bold"&gt;28.6139&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;77.2090&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;28.7041&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;77.1025&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="16-haversine--what-it-does-and-doesnt-do"&gt;16. Haversine — What It Does and Doesn&amp;rsquo;t Do&lt;a class="anchor" href="#16-haversine--what-it-does-and-doesnt-do"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ Provides accurate great-circle distances for GPS coordinates — exam answer&lt;/li&gt;
&lt;li&gt;✅ Works directly with lat/lon&lt;/li&gt;
&lt;li&gt;✅ Does NOT require road network data&lt;/li&gt;
&lt;li&gt;❌ Does NOT calculate exact road distances&lt;/li&gt;
&lt;li&gt;❌ Does NOT calculate travel time&lt;/li&gt;
&lt;li&gt;❌ Does NOT determine elevation changes&lt;/li&gt;
&lt;li&gt;❌ Does NOT measure road surface quality&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="17-networkx--route-optimization"&gt;17. NetworkX — Route Optimization&lt;a class="anchor" href="#17-networkx--route-optimization"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-networkx"&gt;What is NetworkX?&lt;a class="anchor" href="#what-is-networkx"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Python library for &lt;strong&gt;graph analysis and shortest paths&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Models locations as nodes, roads as edges&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; networkx &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; nx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G = nx.Graph()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G.add_edge(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Hospital&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;CommunityA&amp;#39;&lt;/span&gt;, weight=&lt;span style="color:#ff0;font-weight:bold"&gt;15.2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;G.add_edge(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Hospital&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;CommunityB&amp;#39;&lt;/span&gt;, weight=&lt;span style="color:#ff0;font-weight:bold"&gt;8.7&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Shortest path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;path = nx.shortest_path(G, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Hospital&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;CommunityA&amp;#39;&lt;/span&gt;, weight=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;weight&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="18-or-tools--vehicle-routing"&gt;18. OR-Tools — Vehicle Routing&lt;a class="anchor" href="#18-or-tools--vehicle-routing"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-or-tools"&gt;What is OR-Tools?&lt;a class="anchor" href="#what-is-or-tools"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Google&amp;rsquo;s library for &lt;strong&gt;complex optimization problems&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>13. Docker &amp; Containerization</title><link>/docs/13.-docker--containerization/</link><pubDate>Sat, 13 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/13.-docker--containerization/</guid><description>&lt;h2 id="13-docker--containerization"&gt;13. Docker &amp;amp; Containerization&lt;a class="anchor" href="#13-docker--containerization"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-docker--overview"&gt;1. Docker — Overview&lt;a class="anchor" href="#1-docker--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-docker"&gt;What is Docker?&lt;a class="anchor" href="#what-is-docker"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Platform for &lt;strong&gt;packaging applications with all dependencies&lt;/strong&gt; into containers&lt;/li&gt;
&lt;li&gt;Ensures app runs &lt;strong&gt;consistently across different machines&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Build once, run anywhere&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="core-benefits"&gt;Core Benefits:&lt;a class="anchor" href="#core-benefits"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Benefit&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Consistency&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Same environment on dev, staging, production&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Isolation&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Apps don&amp;rsquo;t interfere with each other&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Portability&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Run on any machine with Docker installed&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reproducibility&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Exact same environment every time&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;❌ Does NOT make code run faster&lt;/li&gt;
&lt;li&gt;❌ Does NOT automatically write code&lt;/li&gt;
&lt;li&gt;❌ Does NOT provide free hosting&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-core-docker-components"&gt;2. Core Docker Components:&lt;a class="anchor" href="#2-core-docker-components"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Docker Image
→ Blueprint/template (read-only)
→ Built from Dockerfile
→ Stored in registry (Docker Hub)

Docker Container
→ Running instance of image
→ Isolated environment
→ Has own filesystem, network

Dockerfile
→ Instructions to build image
→ Plain text file

Docker Registry
→ Docker Hub (public)
→ Private registries (ECR, GCR)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="3-docker-run--p--port-mapping"&gt;3. &lt;code&gt;docker run -p&lt;/code&gt; — Port Mapping&lt;a class="anchor" href="#3-docker-run--p--port-mapping"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -p 8501:8501 dashboard
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# │ │&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# │ └── Container port (inside Docker)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# └──────── Host port (your machine)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Access via: http://localhost:8501&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;docker run -p 8501:8501 dashboard&lt;/code&gt; — exam answer (TDS_(1) Q28)&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;docker build -t dashboard .&lt;/code&gt; → builds image, doesn&amp;rsquo;t run&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;docker push dashboard&lt;/code&gt; → pushes to registry, doesn&amp;rsquo;t run&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;docker stop&lt;/code&gt; → stops container&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-docker-logs--view-error-messages"&gt;4. &lt;code&gt;docker logs&lt;/code&gt; — View Error Messages&lt;a class="anchor" href="#4-docker-logs--view-error-messages"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker logs container_id &lt;span style="color:#007f7f"&gt;# view all logs ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker logs -f container_id &lt;span style="color:#007f7f"&gt;# follow/stream logs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker logs --tail &lt;span style="color:#ff0;font-weight:bold"&gt;100&lt;/span&gt; container_id &lt;span style="color:#007f7f"&gt;# last 100 lines&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;docker logs container_id&lt;/code&gt; — exam answer for debugging crashes (TDS_(1) Q29)&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;docker build&lt;/code&gt; → builds image, not view logs&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;docker stop&lt;/code&gt; → stops container&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;docker remove&lt;/code&gt; → removes container&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="5-essential-container-commands"&gt;5. Essential Container Commands:&lt;a class="anchor" href="#5-essential-container-commands"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps &lt;span style="color:#007f7f"&gt;# list RUNNING containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps -a &lt;span style="color:#007f7f"&gt;# list ALL containers (including stopped)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stop container_id &lt;span style="color:#007f7f"&gt;# stop running container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rm container_id &lt;span style="color:#007f7f"&gt;# remove stopped container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rm -f container_id &lt;span style="color:#007f7f"&gt;# force remove running container&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-shell-access-inside-container"&gt;6. Shell Access Inside Container:&lt;a class="anchor" href="#6-shell-access-inside-container"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &lt;span style="color:#fff;font-weight:bold"&gt;exec&lt;/span&gt; -it container_id bash &lt;span style="color:#007f7f"&gt;# open bash shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &lt;span style="color:#fff;font-weight:bold"&gt;exec&lt;/span&gt; -it container_id sh &lt;span style="color:#007f7f"&gt;# if bash not available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &lt;span style="color:#fff;font-weight:bold"&gt;exec&lt;/span&gt; container_id env &lt;span style="color:#007f7f"&gt;# check environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &lt;span style="color:#fff;font-weight:bold"&gt;exec&lt;/span&gt; container_id ls /app &lt;span style="color:#007f7f"&gt;# check file system&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-docker-stats--resource-monitoring"&gt;7. &lt;code&gt;docker stats&lt;/code&gt; — Resource Monitoring:&lt;a class="anchor" href="#7-docker-stats--resource-monitoring"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stats &lt;span style="color:#007f7f"&gt;# all containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stats container_id &lt;span style="color:#007f7f"&gt;# specific container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Shows: CPU%, Memory usage, Network I/O&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="8-dockerfile--instructions-reference"&gt;8. Dockerfile — Instructions Reference&lt;a class="anchor" href="#8-dockerfile--instructions-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;FROM&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;python:3.11.0&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# base image (use specific version ✅)&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;/app&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# set working directory&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;COPY&lt;/span&gt; requirements.txt . &lt;span style="color:#007f7f"&gt;# copy dependency file first&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;RUN&lt;/span&gt; pip install -r requirements.txt &lt;span style="color:#007f7f"&gt;# install packages ✅&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;COPY&lt;/span&gt; . . &lt;span style="color:#007f7f"&gt;# copy application code&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;EXPOSE&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;8501&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# document port (does NOT publish!)&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;ENV&lt;/span&gt; PYTHONUNBUFFERED=&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# set environment variable&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;CMD&lt;/span&gt; [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;streamlit&amp;#34;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;run&amp;#34;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;dashboard.py&amp;#34;&lt;/span&gt;] &lt;span style="color:#007f7f"&gt;# default run command&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="all-dockerfile-instructions"&gt;All Dockerfile Instructions:&lt;a class="anchor" href="#all-dockerfile-instructions"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Instruction&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;FROM&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Base image&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;WORKDIR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Set working directory&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;COPY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Copy files into image&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ADD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Copy + extract archives&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RUN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Execute during build&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default run command&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ENTRYPOINT&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Fixed run command&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EXPOSE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Document port&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ENV&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Set environment variable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ARG&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Build-time variable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;VOLUME&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Mount point&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;USER&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Set user&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;HEALTHCHECK&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Health check command&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="9-run-pip-install--r-requirementstxt--exam-answer"&gt;9. &lt;code&gt;RUN pip install -r requirements.txt&lt;/code&gt; — Exam Answer&lt;a class="anchor" href="#9-run-pip-install--r-requirementstxt--exam-answer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ Installs Python packages in container — exam answer (TDS_(1) Q31)&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;COPY dashboard.py&lt;/code&gt; → copies file, doesn&amp;rsquo;t install&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;EXPOSE 8501&lt;/code&gt; → documents port, doesn&amp;rsquo;t install&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;FROM python:3.11&lt;/code&gt; → sets base image, doesn&amp;rsquo;t install packages&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="10-expose-vs--p--key-distinction"&gt;10. &lt;code&gt;EXPOSE&lt;/code&gt; vs &lt;code&gt;-p&lt;/code&gt; — Key Distinction&lt;a class="anchor" href="#10-expose-vs--p--key-distinction"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;&lt;code&gt;EXPOSE&lt;/code&gt; in Dockerfile&lt;/th&gt;
 &lt;th&gt;&lt;code&gt;-p&lt;/code&gt; in &lt;code&gt;docker run&lt;/code&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Documentation only&lt;/td&gt;
 &lt;td&gt;Actually publish port&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Effect&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;None on its own&lt;/td&gt;
 &lt;td&gt;Maps host→container&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Analogy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;This door exists&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;Open this door&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;EXPOSE&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;8501&lt;/span&gt; &lt;span style="color:#007f7f"&gt;# documents port — does NOT make accessible ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -p 8501:8501 dashboard &lt;span style="color:#007f7f"&gt;# actually publishes port ✅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;EXPOSE&lt;/code&gt; documents the listen port; must still use &lt;code&gt;-p&lt;/code&gt; to publish — exam answer (TDS_(1) Q32)&lt;/li&gt;
&lt;li&gt;❌ Automatically makes app accessible → false&lt;/li&gt;
&lt;li&gt;❌ Closes port for security → false&lt;/li&gt;
&lt;li&gt;❌ Changes application code → false&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="11-layer-caching--best-practice"&gt;11. Layer Caching — Best Practice:&lt;a class="anchor" href="#11-layer-caching--best-practice"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Copy requirements first (changes less often)&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;COPY&lt;/span&gt; requirements.txt .&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;RUN&lt;/span&gt; pip install -r requirements.txt &lt;span style="color:#007f7f"&gt;# cached if requirements unchanged&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;COPY&lt;/span&gt; . . &lt;span style="color:#007f7f"&gt;# only rebuilds on code change&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Copy everything first (rebuilds pip install on every code change)&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;COPY&lt;/span&gt; . .&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;RUN&lt;/span&gt; pip install -r requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="12-multi-stage-builds--service-mesh--exam-answer"&gt;12. Multi-Stage Builds + Service Mesh — Exam Answer&lt;a class="anchor" href="#12-multi-stage-builds--service-mesh--exam-answer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="for-distributed-edge-deployment"&gt;For Distributed Edge Deployment:&lt;a class="anchor" href="#for-distributed-edge-deployment"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Multiple intersections/nodes → each needs container&lt;/li&gt;
&lt;li&gt;Different services → separate containers&lt;/li&gt;
&lt;li&gt;Resource constraints → limit CPU/memory per container&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Stage 1: Build&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;FROM&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;python:3.11&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;AS&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;builder&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;RUN&lt;/span&gt; pip install --user -r requirements.txt&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Stage 2: Production (smaller image)&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;FROM&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;python:3.11-slim&lt;/span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;AS&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;production&lt;/span&gt;&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;COPY&lt;/span&gt; --from=builder /root/.local /root/.local&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;COPY&lt;/span&gt; app.py .&lt;span style="color:#f00"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;CMD&lt;/span&gt; [&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;app.py&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Multi-stage Docker builds with service mesh + resource constraints — exam answer (May_FN Q376)&lt;/li&gt;
&lt;li&gt;❌ Single monolithic container → all services coupled&lt;/li&gt;
&lt;li&gt;❌ Virtual machines → too heavy for edge devices&lt;/li&gt;
&lt;li&gt;❌ Direct installation → no isolation&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="13-resource-constraints"&gt;13. Resource Constraints:&lt;a class="anchor" href="#13-resource-constraints"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run &lt;span style="color:#0ff;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --cpus=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;0.5&amp;#34;&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;\ &lt;/span&gt; &lt;span style="color:#007f7f"&gt;# 50% of one CPU core&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --memory=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;512m&amp;#34;&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;\ &lt;/span&gt; &lt;span style="color:#007f7f"&gt;# 512MB RAM limit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -p 8501:8501 &lt;span style="color:#0ff;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dashboard&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="14-dockerignore--exclude-files"&gt;14. &lt;code&gt;.dockerignore&lt;/code&gt; — Exclude Files:&lt;a class="anchor" href="#14-dockerignore--exclude-files"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.git
.env
.env.*
__pycache__
*.pyc
*.log
secrets/&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="15-docker-compose--multi-container"&gt;15. Docker Compose — Multi-Container:&lt;a class="anchor" href="#15-docker-compose--multi-container"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# docker-compose.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;version&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;dashboard&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;build&lt;/span&gt;: .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;8501:8501&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - API_KEY=${API_KEY}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - database
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;database&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;image&lt;/span&gt;: postgres:15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-weight:bold"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - POSTGRES_DB=analytics&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up -d &lt;span style="color:#007f7f"&gt;# start all services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose down &lt;span style="color:#007f7f"&gt;# stop all services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose logs &lt;span style="color:#007f7f"&gt;# view logs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="common-docker-issues--debugging"&gt;Common Docker Issues &amp;amp; Debugging:&lt;a class="anchor" href="#common-docker-issues--debugging"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Problem&lt;/th&gt;
 &lt;th&gt;Command&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;App crashes on start&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker logs container_id&lt;/code&gt; ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Can&amp;rsquo;t access in browser&lt;/td&gt;
 &lt;td&gt;Check &lt;code&gt;-p&lt;/code&gt; port mapping&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Missing environment var&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker exec container_id env&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;File not found&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker exec container_id ls /app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Out of memory&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker stats container_id&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="docker--complete-command-reference"&gt;Docker — Complete Command Reference:&lt;a class="anchor" href="#docker--complete-command-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker build -t name .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker build -t name:v1.0 .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Run&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -p host:container name &lt;span style="color:#007f7f"&gt;# with port ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d -p 8501:8501 name &lt;span style="color:#007f7f"&gt;# detached mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -e API_KEY=val name &lt;span style="color:#007f7f"&gt;# with env var&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -v /host:/container name &lt;span style="color:#007f7f"&gt;# with volume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Manage containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps &lt;span style="color:#007f7f"&gt;# running&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps -a &lt;span style="color:#007f7f"&gt;# all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stop container_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rm container_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker logs container_id &lt;span style="color:#007f7f"&gt;# debug crashes ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &lt;span style="color:#fff;font-weight:bold"&gt;exec&lt;/span&gt; -it id bash &lt;span style="color:#007f7f"&gt;# shell access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Manage images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker images
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rmi image_name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker pull python:3.11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker push username/app
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Cleanup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker system prune &lt;span style="color:#007f7f"&gt;# remove unused resources&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Core concepts:
 Image → blueprint (built from Dockerfile)
 Container → running instance of image

Key commands:
 docker run -p 8501:8501 name ✅ run with port mapping
 docker logs container_id ✅ debug crashes
 docker ps list running
 docker exec -it id bash shell access

Dockerfile:
 FROM → base image
 RUN pip install -r requirements.txt ✅ install packages
 EXPOSE → document port (NOT publish!) ✅
 CMD → default run command

EXPOSE vs -p:
 EXPOSE → documentation only ✅
 -p → actually publishes port ✅

Layer caching:
 COPY requirements.txt first ✅
 THEN COPY . .

Multi-stage builds:
 → smaller final image
 → separate build and production stages ✅

Edge deployment:
 ✅ Multi-stage + service mesh + resource constraints
 ❌ Single monolithic container
 ❌ Virtual machines&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>14. LLMs, Prompt Engineering &amp; RAG</title><link>/docs/14.-llms-prompt-engineering--rag/</link><pubDate>Sun, 14 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/14.-llms-prompt-engineering--rag/</guid><description>&lt;h2 id="14-llms-prompt-engineering--rag"&gt;14. LLMs, Prompt Engineering &amp;amp; RAG&lt;a class="anchor" href="#14-llms-prompt-engineering--rag"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-llm-system-prompt--overview"&gt;1. LLM System Prompt — Overview&lt;a class="anchor" href="#1-llm-system-prompt--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-a-system-prompt"&gt;What is a System Prompt?&lt;a class="anchor" href="#what-is-a-system-prompt"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Instructions given to LLM &lt;strong&gt;before&lt;/strong&gt; user interaction begins&lt;/li&gt;
&lt;li&gt;Defines model&amp;rsquo;s tone, behavior, response style, knowledge domain&lt;/li&gt;
&lt;li&gt;Most impactful aspect = &lt;strong&gt;knowledge domain + expertise level&lt;/strong&gt; ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="purpose"&gt;Purpose:&lt;a class="anchor" href="#purpose"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;✅ Defines core communication strategy, learning approach, interaction guidelines — exam answer (JAN_AN Q430)&lt;/li&gt;
&lt;li&gt;❌ Does NOT create fixed predetermined responses&lt;/li&gt;
&lt;li&gt;❌ Does NOT prevent model from understanding context&lt;/li&gt;
&lt;li&gt;❌ Does NOT replace human instructor guidance completely&lt;/li&gt;
&lt;li&gt;❌ Does NOT limit AI&amp;rsquo;s ability to understand complex concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-system-prompt--knowledge-domain-impact"&gt;2. System Prompt — Knowledge Domain Impact&lt;a class="anchor" href="#2-system-prompt--knowledge-domain-impact"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;What system prompt instructs LLM to adopt most impacts response&lt;/li&gt;
&lt;li&gt;✅ Knowledge domain + expertise level — exam answer (JAN_AN Q411)&lt;/li&gt;
&lt;li&gt;❌ Character limit set by system prompt → not most impactful&lt;/li&gt;
&lt;li&gt;❌ Formatting requirements → secondary concern&lt;/li&gt;
&lt;li&gt;❌ Language model version → not defined in system prompt&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-system-prompt--what-it-does-not-do"&gt;3. System Prompt — What It Does NOT Do&lt;a class="anchor" href="#3-system-prompt--what-it-does-not-do"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❌ Creates fixed predetermined responses for every query
❌ Prevents deviation from pre-determined responses
❌ Configures LLM to only respond to specific commands
❌ Replaces human instructor guidance completely&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="4-socratic-system-prompt--educational-use"&gt;4. Socratic System Prompt — Educational Use&lt;a class="anchor" href="#4-socratic-system-prompt--educational-use"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="best-system-prompt-for-educational-assistant"&gt;Best System Prompt for Educational Assistant:&lt;a class="anchor" href="#best-system-prompt-for-educational-assistant"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;✅ &amp;#34;You are an interactive learning assistant for climate science.
Guide students through complex concepts by asking reflective
questions. Avoid giving direct solutions. Encourage independent
thinking and help students develop problem-solving skills.&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Balancing information delivery with Socratic questioning — exam answer (May_FN Q371)&lt;/li&gt;
&lt;li&gt;❌ &amp;ldquo;Provide direct answers to maximize efficiency&amp;rdquo; → defeats educational purpose&lt;/li&gt;
&lt;li&gt;❌ &amp;ldquo;Limiting responses to prevent information overload&amp;rdquo; → too restrictive&lt;/li&gt;
&lt;li&gt;❌ &amp;ldquo;Using technical jargon to maintain academic rigor&amp;rdquo; → not pedagogically effective&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="5-direct-vs-socratic-response-style"&gt;5. Direct vs Socratic Response Style:&lt;a class="anchor" href="#5-direct-vs-socratic-response-style"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Style&lt;/th&gt;
 &lt;th&gt;When&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Socratic&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Education, foster critical thinking ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Direct&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Production systems, efficiency needed&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Balanced&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;General purpose use&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="6-llm-post-request--api-inference"&gt;6. LLM POST Request — API Inference&lt;a class="anchor" href="#6-llm-post-request--api-inference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LLM APIs use &lt;strong&gt;POST requests&lt;/strong&gt; for inference&lt;/li&gt;
&lt;li&gt;Request body contains: model, messages, max_tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; requests, os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response = requests.post(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;https://api.anthropic.com/v1/messages&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers={&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;x-api-key&amp;#39;&lt;/span&gt;: os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ANTHROPIC_API_KEY&amp;#39;&lt;/span&gt;)},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json={
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;model&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;claude-3-sonnet-20240229&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;max_tokens&amp;#39;&lt;/span&gt;: &lt;span style="color:#ff0;font-weight:bold"&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;messages&amp;#39;&lt;/span&gt;: [{&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;role&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Classify: Great product!&amp;#39;&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result = response.json()[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;][&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;][&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ POST request with review text in request body — exam answer (TDS Q28)&lt;/li&gt;
&lt;li&gt;❌ GET request → only retrieves, can&amp;rsquo;t send body&lt;/li&gt;
&lt;li&gt;❌ DELETE → removes resource&lt;/li&gt;
&lt;li&gt;❌ PUT → updates existing resource&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="7-prompt-specificity--key-principle"&gt;7. Prompt Specificity — Key Principle&lt;a class="anchor" href="#7-prompt-specificity--key-principle"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="vague-vs-specific"&gt;Vague vs Specific:&lt;a class="anchor" href="#vague-vs-specific"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❌ &amp;#34;Tell me about solar energy&amp;#34;
❌ &amp;#34;Discuss solar energy advancements&amp;#34;
❌ &amp;#34;Write a paragraph about solar energy&amp;#34;

✅ &amp;#34;Outline 4 key solar energy technological breakthroughs
 from 2014-2024, including specific efficiency improvements
 and implementation challenges&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Specific prompt with: count + timeframe + aspects + constraints — exam answer&lt;/li&gt;
&lt;li&gt;More specific = more precise and useful response&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="8-specify-output-format-in-prompt"&gt;8. Specify Output Format in Prompt:&lt;a class="anchor" href="#8-specify-output-format-in-prompt"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❌ &amp;#34;Classify this review&amp;#34;
→ Output: &amp;#34;The sentiment is Negative.&amp;#34;

✅ &amp;#34;Classify sentiment as exactly one word in lowercase:
 positive, negative, or neutral. Review: {text}&amp;#34;
→ Output: &amp;#34;negative&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="9-few-shot-prompting"&gt;9. Few-Shot Prompting:&lt;a class="anchor" href="#9-few-shot-prompting"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;Classify customer tickets:

Example 1:
Input: &amp;#39;App keeps crashing&amp;#39;
Output: technical

Example 2:
Input: &amp;#39;Wrong charge on my card&amp;#39;
Output: billing

Now classify:
Input: &amp;#39;{ticket_text}&amp;#39;
Output:&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="10-chain-of-thought-prompting"&gt;10. Chain of Thought Prompting:&lt;a class="anchor" href="#10-chain-of-thought-prompting"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;Solve this step by step:
1. First identify the main issue
2. Consider possible causes
3. Propose solution

Problem: {problem}&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="11-llm-token-costs--what-matters"&gt;11. LLM Token Costs — What Matters&lt;a class="anchor" href="#11-llm-token-costs--what-matters"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="factors-that-impact-cost"&gt;Factors that Impact Cost:&lt;a class="anchor" href="#factors-that-impact-cost"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;✅ Token count of input prompts — exam answer&lt;/li&gt;
&lt;li&gt;✅ Token count of generated responses — exam answer&lt;/li&gt;
&lt;li&gt;✅ Query complexity requiring deeper reasoning — exam answer&lt;/li&gt;
&lt;li&gt;✅ Context window utilization for multi-turn conversations — exam answer&lt;/li&gt;
&lt;li&gt;❌ Time of day when queries submitted → does NOT affect cost&lt;/li&gt;
&lt;li&gt;❌ Student&amp;rsquo;s academic level → does NOT affect cost&lt;/li&gt;
&lt;li&gt;❌ Fixed regardless of complexity → FALSE&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="12-llm-batch-processing--production"&gt;12. LLM Batch Processing — Production:&lt;a class="anchor" href="#12-llm-batch-processing--production"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; time, os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; anthropic
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;client = anthropic.Anthropic(api_key=os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;ANTHROPIC_API_KEY&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; analyze_reviews(reviews):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results = []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;for&lt;/span&gt; review in reviews:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = client.messages.create(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;claude-3-sonnet-20240229&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_tokens=&lt;span style="color:#ff0;font-weight:bold"&gt;50&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messages=[{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Classify as positive/negative/neutral: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;review&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results.append(response.content[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;].text.strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time.sleep(&lt;span style="color:#ff0;font-weight:bold"&gt;0.5&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# rate limiting ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Process in batches, track costs, handle errors, cache results — exam answer (TDS Q30)&lt;/li&gt;
&lt;li&gt;❌ Send all 500 in single API call → context limit exceeded&lt;/li&gt;
&lt;li&gt;❌ Only analyze 5 to save money → insufficient coverage&lt;/li&gt;
&lt;li&gt;❌ Call API repeatedly for same review → wasteful&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="13-llm-capabilities--limitations"&gt;13. LLM Capabilities &amp;amp; Limitations&lt;a class="anchor" href="#13-llm-capabilities--limitations"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-llms-can-do"&gt;What LLMs CAN Do:&lt;a class="anchor" href="#what-llms-can-do"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;✅ Generate coherent contextual text
✅ Classify sentiment, categories
✅ Summarize documents
✅ Extract information from text
✅ Answer questions based on context
✅ Write and explain code
✅ Evaluate statistical validity when prompted well
✅ Follow formatting instructions&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="what-llms-cannot-do"&gt;What LLMs CANNOT Do:&lt;a class="anchor" href="#what-llms-cannot-do"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❌ Access real-time internet (unless tool-enabled)
❌ Access live databases or patient records
❌ Cite papers published after training cutoff
❌ Guarantee factually correct information (hallucination)
❌ Guarantee consistent output format without prompting
❌ Remember previous conversations (stateless by default)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ LLMs may generate plausible-sounding but incorrect medical info — exam answer (JAN_AN Q412)&lt;/li&gt;
&lt;li&gt;✅ Quality of response depends on prompt specificity — exam answer&lt;/li&gt;
&lt;li&gt;✅ Can evaluate statistical validity when properly prompted — exam answer&lt;/li&gt;
&lt;li&gt;❌ Can directly access post-cutoff studies → false&lt;/li&gt;
&lt;li&gt;❌ Have real-time patient data access → false&lt;/li&gt;
&lt;li&gt;❌ Quality unaffected by vague prompts → false&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="14-llm-output-consistency--enforcement"&gt;14. LLM Output Consistency — Enforcement&lt;a class="anchor" href="#14-llm-output-consistency--enforcement"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="problem"&gt;Problem:&lt;a class="anchor" href="#problem"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;LLM outputs:
&amp;#34;negative&amp;#34; ← correct format
&amp;#34;Negative&amp;#34; ← wrong case
&amp;#34;neg&amp;#34; ← wrong format
&amp;#34;NEGATIVE.&amp;#34; ← wrong case + punctuation&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="solution-1--prompt-engineering-best"&gt;Solution 1 — Prompt Engineering (Best):&lt;a class="anchor" href="#solution-1--prompt-engineering-best"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prompt = &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;Respond with EXACTLY one word in lowercase: positive, negative, or neutral.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;No punctuation. No explanation.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;Review: &lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{text}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="solution-2--post-processing-backup"&gt;Solution 2 — Post-Processing (Backup):&lt;a class="anchor" href="#solution-2--post-processing-backup"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;def&lt;/span&gt; normalize(output):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output = output.strip().lower()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;pos&amp;#39;&lt;/span&gt; in output: &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;positive&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;neg&amp;#39;&lt;/span&gt; in output: &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;negative&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;neu&amp;#39;&lt;/span&gt; in output: &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;neutral&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#fff;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;unknown&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;✅ Use prompt engineering to enforce exact format — exam answer (TDS Q31)&lt;/li&gt;
&lt;li&gt;❌ Manually edit each response → not scalable&lt;/li&gt;
&lt;li&gt;❌ Ignore inconsistencies → breaks downstream analysis&lt;/li&gt;
&lt;li&gt;❌ Switch LLMs for each review → still inconsistent&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="15-rag--overview"&gt;15. RAG — Overview&lt;a class="anchor" href="#15-rag--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-rag"&gt;What is RAG?&lt;a class="anchor" href="#what-is-rag"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retrieval Augmented Generation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Combines retrieval of relevant documents with LLM generation&lt;/li&gt;
&lt;li&gt;Grounds LLM in real, up-to-date knowledge&lt;/li&gt;
&lt;li&gt;Solves: hallucination + knowledge cutoff problems&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="rag-vs-pure-llm"&gt;RAG vs Pure LLM:&lt;a class="anchor" href="#rag-vs-pure-llm"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Aspect&lt;/th&gt;
 &lt;th&gt;Pure LLM&lt;/th&gt;
 &lt;th&gt;RAG&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Knowledge&lt;/td&gt;
 &lt;td&gt;Training data only&lt;/td&gt;
 &lt;td&gt;External knowledge base&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Accuracy&lt;/td&gt;
 &lt;td&gt;May hallucinate&lt;/td&gt;
 &lt;td&gt;Grounded in real docs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Updatable&lt;/td&gt;
 &lt;td&gt;Needs retraining&lt;/td&gt;
 &lt;td&gt;Update knowledge base&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="16-rag-pipeline--process-flow"&gt;16. RAG Pipeline — Process Flow&lt;a class="anchor" href="#16-rag-pipeline--process-flow"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="correct-flow--exam-answer"&gt;Correct Flow — Exam Answer:&lt;a class="anchor" href="#correct-flow--exam-answer"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Student Query
 ↓
Vectorize Query ← convert to embedding
 ↓
Retrieve Content from ← similarity search
Vector Database
 ↓
Pass Retrieved Content ← add as context
to LLM
 ↓
LLM Generates ← context-aware response ✅
Context-Aware Response&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Query → Vectorize → Retrieve from vector DB → Pass to LLM → Response — exam answer (JAN_FN Q314, JAN_AN Q433)&lt;/li&gt;
&lt;li&gt;❌ Student Query → LLM Direct Answer → Response Sent Back → skips retrieval&lt;/li&gt;
&lt;li&gt;❌ Student Query → Chunk Course Material → Vectorize Query → wrong order&lt;/li&gt;
&lt;li&gt;❌ Student Query → Rule-Based System → Pre-Written Response → not RAG&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="17-rag-chunking--strategy"&gt;17. RAG Chunking — Strategy&lt;a class="anchor" href="#17-rag-chunking--strategy"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="why-chunk"&gt;Why Chunk?&lt;a class="anchor" href="#why-chunk"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;LLMs have limited context windows&lt;/li&gt;
&lt;li&gt;Smaller chunks → more precise matching&lt;/li&gt;
&lt;li&gt;Better retrieval accuracy with focused chunks&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="chunk-size--exam-answer"&gt;Chunk Size — Exam Answer:&lt;a class="anchor" href="#chunk-size--exam-answer"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Size&lt;/th&gt;
 &lt;th&gt;Chunks&lt;/th&gt;
 &lt;th&gt;Best For&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Very small (1-2 sentences)&lt;/td&gt;
 &lt;td&gt;Too little context&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Medium (200-500 words)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Balance context + focus&lt;/td&gt;
 &lt;td&gt;✅ customer support&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Very large (entire documents)&lt;/td&gt;
 &lt;td&gt;Too much irrelevant content&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Random sizes&lt;/td&gt;
 &lt;td&gt;Inconsistent retrieval&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;✅ Medium chunks (1-2 paragraphs, ~200-500 words) — exam answer (TDS Q36)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="18-rag-stale-chunks--exam-answer"&gt;18. RAG Stale Chunks — Exam Answer&lt;a class="anchor" href="#18-rag-stale-chunks--exam-answer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="problem-1"&gt;Problem:&lt;a class="anchor" href="#problem-1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Document v1 indexed → answer from v1
Document v2 released → old chunks still in DB
→ Chatbot returns outdated information&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="most-likely-cause"&gt;Most Likely Cause:&lt;a class="anchor" href="#most-likely-cause"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;✅ Old document chunks remain in vector DB and weren&amp;rsquo;t updated — exam answer (TDS Q35)&lt;/li&gt;
&lt;li&gt;❌ LLM relies on outdated training data → LLM uses retrieved context, not training&lt;/li&gt;
&lt;li&gt;❌ Wrong chunking strategy → different problem&lt;/li&gt;
&lt;li&gt;❌ Embedding model too small → different problem&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="19-vector-databases"&gt;19. Vector Databases&lt;a class="anchor" href="#19-vector-databases"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-are-they"&gt;What are They?&lt;a class="anchor" href="#what-are-they"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Specialized databases for &lt;strong&gt;storing and searching embeddings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Find semantically similar content via vector similarity&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="options"&gt;Options:&lt;a class="anchor" href="#options"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Database&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Best For&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;FAISS&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Library&lt;/td&gt;
 &lt;td&gt;Local, fast prototyping&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Weaviate&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Full database&lt;/td&gt;
 &lt;td&gt;Production&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Pinecone&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Managed service&lt;/td&gt;
 &lt;td&gt;Scalable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Chroma&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Open source&lt;/td&gt;
 &lt;td&gt;Simple local use&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;✅ FAISS / Weaviate — exam answer (JAN_FN Q314)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="20-rag--llm-uses-chunks-as-context"&gt;20. RAG — LLM Uses Chunks as Context&lt;a class="anchor" href="#20-rag--llm-uses-chunks-as-context"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LLM uses retrieved chunks as &lt;strong&gt;context to generate response&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>15. Chrome DevTools</title><link>/docs/15.-chrome-devtools/</link><pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/15.-chrome-devtools/</guid><description>&lt;h2 id="15-chrome-devtools"&gt;15. Chrome DevTools&lt;a class="anchor" href="#15-chrome-devtools"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-network-tab--most-exam-relevant"&gt;1. Network Tab — Most Exam-Relevant&lt;a class="anchor" href="#1-network-tab--most-exam-relevant"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-network-tab-shows"&gt;What Network Tab Shows:&lt;a class="anchor" href="#what-network-tab-shows"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ALL HTTP requests&lt;/strong&gt; made by the page&lt;/li&gt;
&lt;li&gt;Request/response headers&lt;/li&gt;
&lt;li&gt;API call details&lt;/li&gt;
&lt;li&gt;Load times and waterfall&lt;/li&gt;
&lt;li&gt;Status codes&lt;/li&gt;
&lt;li&gt;Request payload (body)&lt;/li&gt;
&lt;li&gt;Response data&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="exam-scenarios--network-tab"&gt;Exam Scenarios — Network Tab:&lt;a class="anchor" href="#exam-scenarios--network-tab"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Scenario&lt;/th&gt;
 &lt;th&gt;Answer&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Examine API request headers and responses&lt;/td&gt;
 &lt;td&gt;Network tab ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Debug failing API call&lt;/td&gt;
 &lt;td&gt;Network tab ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Analyze webpage load time and resources&lt;/td&gt;
 &lt;td&gt;Network tab ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Identify rate limiting pattern (429 responses)&lt;/td&gt;
 &lt;td&gt;Network tab ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Request timing analysis + throttling simulation&lt;/td&gt;
 &lt;td&gt;Network tab ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="network-tab--key-features"&gt;Network Tab — Key Features:&lt;a class="anchor" href="#network-tab--key-features"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Request list → all HTTP calls
Filter by type → XHR/Fetch for API calls specifically

Click any request to see:
├── Headers tab
│ ├── Request URL
│ ├── Request Method (GET, POST)
│ ├── Status Code (200, 401, 429)
│ ├── Authorization header (where API key is)
│ └── Content-Type
│
├── Payload tab → request body (POST data)
│
├── Response tab → actual JSON response data
│
└── Timing tab → request timing breakdown
 ├── DNS lookup
 ├── Connection time
 ├── Time to First Byte (TTFB)
 └── Content download time

Throttling → simulate slow network
 (Fast 3G, Slow 3G, Custom)&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="debugging-with-network-tab"&gt;Debugging with Network Tab:&lt;a class="anchor" href="#debugging-with-network-tab"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Problem: API returns 401
→ Network tab → click request → Headers tab
→ Check: is Authorization header present?
→ Check: API key format correct?

Problem: Rate limiting (429)
→ Network tab → filter XHR
→ Look for pattern of 429 responses
→ Timing tab → see request frequency
→ Fix: add time.sleep() between requests

Problem: Wrong data in response
→ Network tab → click request → Response tab
→ See exact JSON returned
→ Compare with expected structure&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Network tab for API debugging — exam answer (JAN_FN Q284)&lt;/li&gt;
&lt;li&gt;✅ Network tab for load time analysis — exam answer (JAN_FN Q287)&lt;/li&gt;
&lt;li&gt;✅ Network tab with timing analysis for rate limiting — exam answer (May_FN Q363)&lt;/li&gt;
&lt;li&gt;❌ Console tab → JavaScript errors, not API headers&lt;/li&gt;
&lt;li&gt;❌ Application tab → storage inspection, not API calls&lt;/li&gt;
&lt;li&gt;❌ Performance tab → CPU/rendering bottlenecks, not API&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-memory-tab--javascript-memory-leaks"&gt;2. Memory Tab — JavaScript Memory Leaks&lt;a class="anchor" href="#2-memory-tab--javascript-memory-leaks"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-memory-tab-does"&gt;What Memory Tab Does:&lt;a class="anchor" href="#what-memory-tab-does"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Detects &lt;strong&gt;JavaScript memory leaks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Heap snapshots → shows all objects in memory&lt;/li&gt;
&lt;li&gt;Allocation timeline → tracks allocations over time&lt;/li&gt;
&lt;li&gt;Compare snapshots → find growing object counts&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="memory-leak-detection-workflow"&gt;Memory Leak Detection Workflow:&lt;a class="anchor" href="#memory-leak-detection-workflow"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1. Open DevTools → Memory tab
2. Take baseline heap snapshot
3. Reproduce the action (navigate pages, click buttons)
4. Take another heap snapshot
5. Select &amp;#34;Comparison&amp;#34; view
6. Look for:
 → Objects with positive &amp;#34;# New&amp;#34; count
 → Large &amp;#34;Size Delta&amp;#34; values&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="common-causes-of-memory-leaks"&gt;Common Causes of Memory Leaks:&lt;a class="anchor" href="#common-causes-of-memory-leaks"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;→ Event listeners not removed
→ Timers not cleared (setInterval without clearInterval)
→ DOM nodes detached but still referenced
→ Global variables holding large data
→ Closures holding references unnecessarily&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Memory tab for JavaScript memory leak debugging — exam answer (JAN_AN Q403)&lt;/li&gt;
&lt;li&gt;❌ Network tab → HTTP requests, not memory&lt;/li&gt;
&lt;li&gt;❌ Application tab → storage, not memory&lt;/li&gt;
&lt;li&gt;❌ Console tab → JS errors, not memory profiling&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-console-tab"&gt;3. Console Tab:&lt;a class="anchor" href="#3-console-tab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript &lt;strong&gt;error messages&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console.log()&lt;/code&gt; output&lt;/li&gt;
&lt;li&gt;Run JavaScript commands interactively&lt;/li&gt;
&lt;li&gt;Error filtering by level (errors, warnings, info)&lt;/li&gt;
&lt;li&gt;❌ NOT for API header inspection&lt;/li&gt;
&lt;li&gt;❌ NOT for memory leak detection&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="4-elements-tab"&gt;4. Elements Tab:&lt;a class="anchor" href="#4-elements-tab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Inspect and &lt;strong&gt;edit HTML and CSS&lt;/strong&gt; in real-time&lt;/li&gt;
&lt;li&gt;View DOM structure&lt;/li&gt;
&lt;li&gt;Debug layout issues&lt;/li&gt;
&lt;li&gt;Computed styles, box model visualization&lt;/li&gt;
&lt;li&gt;❌ NOT for network requests&lt;/li&gt;
&lt;li&gt;❌ NOT for memory profiling&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="5-sources-tab"&gt;5. Sources Tab:&lt;a class="anchor" href="#5-sources-tab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;View JavaScript files&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;breakpoints&lt;/strong&gt; in code&lt;/li&gt;
&lt;li&gt;Step through code execution&lt;/li&gt;
&lt;li&gt;Watch variables&lt;/li&gt;
&lt;li&gt;❌ NOT for HTTP requests&lt;/li&gt;
&lt;li&gt;❌ NOT for memory&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="6-performance-tab"&gt;6. Performance Tab:&lt;a class="anchor" href="#6-performance-tab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU usage profiling&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Rendering performance&lt;/li&gt;
&lt;li&gt;Frame rate analysis&lt;/li&gt;
&lt;li&gt;JavaScript execution timeline&lt;/li&gt;
&lt;li&gt;❌ NOT for API debugging&lt;/li&gt;
&lt;li&gt;❌ NOT for memory leak detection&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="7-application-tab"&gt;7. Application Tab:&lt;a class="anchor" href="#7-application-tab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local storage&lt;/strong&gt; / Session storage&lt;/li&gt;
&lt;li&gt;Cookies&lt;/li&gt;
&lt;li&gt;IndexedDB&lt;/li&gt;
&lt;li&gt;Service workers&lt;/li&gt;
&lt;li&gt;Cache storage&lt;/li&gt;
&lt;li&gt;❌ NOT for network requests&lt;/li&gt;
&lt;li&gt;❌ NOT for memory profiling&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="8-lighthouse-tab"&gt;8. Lighthouse Tab:&lt;a class="anchor" href="#8-lighthouse-tab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automated audits&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Performance score&lt;/li&gt;
&lt;li&gt;Accessibility&lt;/li&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;li&gt;Best practices&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Provides actionable recommendations&lt;/li&gt;
&lt;li&gt;❌ NOT for real-time debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="9-security-tab"&gt;9. Security Tab:&lt;a class="anchor" href="#9-security-tab"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;HTTPS &lt;strong&gt;certificate details&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Mixed content issues&lt;/li&gt;
&lt;li&gt;Security overview&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="all-devtools-tabs--complete-reference"&gt;All DevTools Tabs — Complete Reference:&lt;a class="anchor" href="#all-devtools-tabs--complete-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tab&lt;/th&gt;
 &lt;th&gt;Primary Use&lt;/th&gt;
 &lt;th&gt;Exam Scenario&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;HTTP requests, API debugging, load time&lt;/td&gt;
 &lt;td&gt;API headers, 429 rate limit, load time ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JavaScript memory leaks&lt;/td&gt;
 &lt;td&gt;Memory leak debugging ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Console&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JS errors, console.log output&lt;/td&gt;
 &lt;td&gt;JavaScript errors&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Elements&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;HTML/CSS inspection and editing&lt;/td&gt;
 &lt;td&gt;Layout debugging&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;JS files, breakpoints, step-through&lt;/td&gt;
 &lt;td&gt;Code debugging&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;CPU profiling, rendering, frame rate&lt;/td&gt;
 &lt;td&gt;Performance bottlenecks&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Storage, cookies, service workers&lt;/td&gt;
 &lt;td&gt;Local storage inspection&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Lighthouse&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Automated performance/accessibility audit&lt;/td&gt;
 &lt;td&gt;Site auditing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;HTTPS certificate, mixed content&lt;/td&gt;
 &lt;td&gt;Security issues&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="devtools--exam-answer-mapping"&gt;DevTools — Exam Answer Mapping:&lt;a class="anchor" href="#devtools--exam-answer-mapping"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;API request headers and responses&amp;#34;
→ Network tab ✅

&amp;#34;Webpage load time and resources&amp;#34;
→ Network tab ✅

&amp;#34;Rate limiting pattern (429)&amp;#34;
→ Network tab → timing analysis ✅

&amp;#34;JavaScript memory leak&amp;#34;
→ Memory tab ✅

&amp;#34;JavaScript errors&amp;#34;
→ Console tab

&amp;#34;Inspect/edit HTML and CSS&amp;#34;
→ Elements tab

&amp;#34;Set JavaScript breakpoints&amp;#34;
→ Sources tab

&amp;#34;CPU and rendering performance&amp;#34;
→ Performance tab

&amp;#34;Cookies and local storage&amp;#34;
→ Application tab&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Network tab:
 ✅ API request headers + responses
 ✅ Webpage load time
 ✅ Rate limiting pattern (429)
 ✅ Request timing analysis
 ✅ Request payload (POST body)
 ✅ Response data (JSON)

Memory tab:
 ✅ JavaScript memory leak detection
 ✅ Heap snapshots
 ✅ Allocation timeline

Console tab:
 → JS errors + console.log

Elements tab:
 → HTML/CSS inspection

Sources tab:
 → Breakpoints + step-through

Performance tab:
 → CPU profiling

Application tab:
 → Storage + cookies

Lighthouse tab:
 → Automated audit scores&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>16. IDEs &amp; Development Tools</title><link>/docs/16.-ides--development-tools/</link><pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/16.-ides--development-tools/</guid><description>&lt;h2 id="16-ides--development-tools"&gt;16. IDEs &amp;amp; Development Tools&lt;a class="anchor" href="#16-ides--development-tools"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-ide-built-in-features"&gt;1. IDE Built-In Features&lt;a class="anchor" href="#1-ide-built-in-features"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-an-ide"&gt;What is an IDE?&lt;a class="anchor" href="#what-is-an-ide"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Integrated Development Environment&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;All-in-one tool for writing, testing, debugging code&lt;/li&gt;
&lt;li&gt;Popular for Data Science: VS Code, PyCharm, JupyterLab&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="standard-built-in-features"&gt;Standard Built-In Features:&lt;a class="anchor" href="#standard-built-in-features"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Feature&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Syntax highlighting&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Color-codes different parts of code ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Integrated debugger&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Set breakpoints, step through code ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Version control integration&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Git commands inside IDE ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Terminal access&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Run commands without leaving IDE ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Code completion&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Auto-suggests code as you type ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Linting&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Real-time code error detection ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Refactoring tools&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Rename variables, extract functions ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Search &amp;amp; Replace&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Across entire project ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Extensions/Plugins&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Add extra functionality ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="2-not-built-in--exam-answer"&gt;2. NOT Built-In — Exam Answer&lt;a class="anchor" href="#2-not-built-in--exam-answer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="not-typically-built-in"&gt;NOT Typically Built-In:&lt;a class="anchor" href="#not-typically-built-in"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❌ Native hardware virtualization → needs Docker, VMware, VirtualBox
❌ Automated code review and security scanning ✅ (exam answer JAN_AN Q407)
 → needs external tools: SonarQube, Snyk, GitHub Actions&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;✅ Automated code review and security scanning is NOT built-in — exam answer (JAN_AN Q407)&lt;/li&gt;
&lt;li&gt;✅ Native hardware virtualization is NOT built-in — exam answer (JAN_FN Q288)&lt;/li&gt;
&lt;li&gt;❌ Syntax highlighting → IS built-in&lt;/li&gt;
&lt;li&gt;❌ Integrated debugger → IS built-in&lt;/li&gt;
&lt;li&gt;❌ Version control integration → IS built-in&lt;/li&gt;
&lt;li&gt;❌ Terminal access → IS built-in&lt;/li&gt;
&lt;li&gt;❌ Code completion → IS built-in&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-external-tools-for-code-review"&gt;3. External Tools for Code Review:&lt;a class="anchor" href="#3-external-tools-for-code-review"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SonarQube → static code analysis
Snyk → security vulnerability scanning
GitHub Actions → CI/CD, automated testing
Dependabot → dependency vulnerability alerts
pre-commit → git hooks for code checks&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="4-popular-ides-for-data-science"&gt;4. Popular IDEs for Data Science:&lt;a class="anchor" href="#4-popular-ides-for-data-science"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;IDE&lt;/th&gt;
 &lt;th&gt;Best For&lt;/th&gt;
 &lt;th&gt;Key Features&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;VS Code&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;General purpose&lt;/td&gt;
 &lt;td&gt;Lightweight, huge extension library&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;PyCharm&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Python development&lt;/td&gt;
 &lt;td&gt;Deep Python support, smart debugger&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;JupyterLab&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Data exploration&lt;/td&gt;
 &lt;td&gt;Notebooks, inline visualization&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Google Colab&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Cloud notebooks&lt;/td&gt;
 &lt;td&gt;Free GPU, easy sharing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;RStudio&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;R programming&lt;/td&gt;
 &lt;td&gt;R-specific tools&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Spyder&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Scientific Python&lt;/td&gt;
 &lt;td&gt;MATLAB-like interface&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="5-jupyter-notebooks--best-practices"&gt;5. Jupyter Notebooks — Best Practices&lt;a class="anchor" href="#5-jupyter-notebooks--best-practices"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="structure"&gt;Structure:&lt;a class="anchor" href="#structure"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Cell 1: Imports
Cell 2: Configuration (paths, constants)
Cell 3: Load data
Cell 4: Explore data
Cell 5: Clean data
Cell 6: Analyze
Cell 7: Visualize
Cell 8: Conclusions&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="before-committing-to-git"&gt;Before Committing to Git:&lt;a class="anchor" href="#before-committing-to-git"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Clear outputs before committing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jupyter nbconvert --clear-output notebook.ipynb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# OR use nbstripout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install nbstripout
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nbstripout notebook.ipynb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="why-clear-outputs"&gt;Why Clear Outputs?&lt;a class="anchor" href="#why-clear-outputs"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Outputs can contain sensitive data&lt;/li&gt;
&lt;li&gt;Large outputs bloat git repository&lt;/li&gt;
&lt;li&gt;Avoids merge conflicts in output cells&lt;/li&gt;
&lt;li&gt;Reproducibility — others should run and get same outputs&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="restart-and-run-all"&gt;Restart and Run All:&lt;a class="anchor" href="#restart-and-run-all"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Kernel → Restart &amp;amp; Run All
→ Ensures notebook runs top to bottom without hidden state
→ Always do this before sharing/committing&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="vs-code--key-features-for-data-science"&gt;VS Code — Key Features for Data Science:&lt;a class="anchor" href="#vs-code--key-features-for-data-science"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Extensions useful for TDS:
├── Python → Python language support
├── Pylance → Fast type checking
├── Jupyter → Notebook support in VS Code
├── GitLens → Enhanced git visualization
├── Docker → Docker file support
├── REST Client → Test APIs directly in editor
└── Rainbow CSV → Color-coded CSV viewing&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="debugger--how-to-use"&gt;Debugger — How to Use:&lt;a class="anchor" href="#debugger--how-to-use"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Setting breakpoints:
1. Click left of line number → red dot appears
2. Run in debug mode (F5)
3. Code pauses at breakpoint

Debug controls:
F5 → Continue (run to next breakpoint)
F10 → Step Over (next line, don&amp;#39;t go into function)
F11 → Step Into (go inside function)
F12 → Step Out (exit current function)

Watch panel → monitor variable values
Call stack → see function call chain
Variables panel → all current variables&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="terminal-access-in-ide"&gt;Terminal Access in IDE:&lt;a class="anchor" href="#terminal-access-in-ide"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# VS Code integrated terminal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Ctrl + &lt;span style="color:#0ff;font-weight:bold"&gt;`&lt;/span&gt; (backtick) → open terminal
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Can run:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; python script.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pip install pandas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; git add . &amp;amp;&amp;amp; git commit -m &lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pytest tests/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker build -t app .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="uv--python-package-manager-exam-relevant"&gt;uv — Python Package Manager (Exam-Relevant)&lt;a class="anchor" href="#uv--python-package-manager-exam-relevant"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-uv"&gt;What is &lt;code&gt;uv&lt;/code&gt;?&lt;a class="anchor" href="#what-is-uv"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fast modern Python &lt;strong&gt;package and project manager&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Written in Rust → extremely fast (10-100x faster than pip)&lt;/li&gt;
&lt;li&gt;Replacement for: pip + venv + pyenv combined&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="correct-command-sequence--exam-answer"&gt;Correct Command Sequence — Exam Answer:&lt;a class="anchor" href="#correct-command-sequence--exam-answer"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Correct sequence (exam answer May_FN Q359)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv init &lt;span style="color:#007f7f"&gt;# Step 1: initialize project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv python install 3.11 &lt;span style="color:#007f7f"&gt;# Step 2: install specific Python version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add pandas numpy &lt;span style="color:#007f7f"&gt;# Step 3: add dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ❌ Wrong sequences:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv init python 3.11 → uv add pandas &lt;span style="color:#007f7f"&gt;# wrong&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv create --version 3.11 → uv install &lt;span style="color:#007f7f"&gt;# wrong&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv new --python=3.11 → uv sync pandas &lt;span style="color:#007f7f"&gt;# wrong&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="complete-uv-reference"&gt;Complete &lt;code&gt;uv&lt;/code&gt; Reference:&lt;a class="anchor" href="#complete-uv-reference"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv init &lt;span style="color:#007f7f"&gt;# create new project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv python install 3.11 &lt;span style="color:#007f7f"&gt;# install Python version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add pandas &lt;span style="color:#007f7f"&gt;# add dependency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv remove pandas &lt;span style="color:#007f7f"&gt;# remove dependency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv sync &lt;span style="color:#007f7f"&gt;# install from lockfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv run script.py &lt;span style="color:#007f7f"&gt;# run in project environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv venv &lt;span style="color:#007f7f"&gt;# create virtual environment&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="uv-vs-traditional"&gt;&lt;code&gt;uv&lt;/code&gt; vs Traditional:&lt;a class="anchor" href="#uv-vs-traditional"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Task&lt;/th&gt;
 &lt;th&gt;Traditional&lt;/th&gt;
 &lt;th&gt;uv&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Create venv&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;python -m venv .venv&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv venv&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Install package&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pip install pandas&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv add pandas&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Install Python&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pyenv install 3.11&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv python install 3.11&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Install from requirements&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv sync&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="virtual-environments--overview"&gt;Virtual Environments — Overview:&lt;a class="anchor" href="#virtual-environments--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# venv (built-in Python)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -m venv .venv &lt;span style="color:#007f7f"&gt;# create&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;source&lt;/span&gt; .venv/bin/activate &lt;span style="color:#007f7f"&gt;# activate (Mac/Linux)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv&lt;span style="color:#0ff;font-weight:bold"&gt;\S&lt;/span&gt;cripts&lt;span style="color:#0ff;font-weight:bold"&gt;\a&lt;/span&gt;ctivate &lt;span style="color:#007f7f"&gt;# activate (Windows)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deactivate &lt;span style="color:#007f7f"&gt;# deactivate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# conda&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda create -n myenv python=3.11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda activate myenv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda deactivate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# uv (fastest)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv venv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;source&lt;/span&gt; .venv/bin/activate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="why-virtual-environments"&gt;Why Virtual Environments?&lt;a class="anchor" href="#why-virtual-environments"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Isolate project dependencies&lt;/li&gt;
&lt;li&gt;Avoid conflicts between projects&lt;/li&gt;
&lt;li&gt;Reproducible environments&lt;/li&gt;
&lt;li&gt;Each project has its own Python packages&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="pip--package-management-reference"&gt;&lt;code&gt;pip&lt;/code&gt; — Package Management Reference:&lt;a class="anchor" href="#pip--package-management-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install pandas &lt;span style="color:#007f7f"&gt;# install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install pandas==2.1.0 &lt;span style="color:#007f7f"&gt;# specific version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -r requirements.txt &lt;span style="color:#007f7f"&gt;# from file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip uninstall pandas &lt;span style="color:#007f7f"&gt;# remove&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip list &lt;span style="color:#007f7f"&gt;# list installed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip freeze &amp;gt; requirements.txt &lt;span style="color:#007f7f"&gt;# save current env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip show pandas &lt;span style="color:#007f7f"&gt;# package info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install --upgrade pandas &lt;span style="color:#007f7f"&gt;# upgrade&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;IDE Built-In Features:
 ✅ Syntax highlighting
 ✅ Integrated debugger
 ✅ Version control integration
 ✅ Terminal access
 ✅ Code completion
 ✅ Linting, refactoring, search

NOT Built-In:
 ❌ Native hardware virtualization ✅ (JAN_FN exam answer)
 ❌ Automated code review + security scanning ✅ (JAN_AN exam answer)

Popular IDEs:
 VS Code → general purpose, lightweight
 PyCharm → deep Python support
 JupyterLab → notebooks, data exploration

uv sequence:
 uv init → uv python install 3.11 → uv add pandas ✅

Jupyter best practices:
 ✅ Clear outputs before committing
 ✅ Restart &amp;amp; Run All before sharing
 ✅ Structure cells logically

Virtual environments:
 venv → built-in Python
 conda → data science focused
 uv → fastest, modern ✅&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>17. Kumu</title><link>/docs/17.-kumu/</link><pubDate>Wed, 17 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/17.-kumu/</guid><description>&lt;h2 id="17-kumu"&gt;17. Kumu&lt;a class="anchor" href="#17-kumu"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-kumu--overview"&gt;1. Kumu — Overview&lt;a class="anchor" href="#1-kumu--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-kumu"&gt;What is Kumu?&lt;a class="anchor" href="#what-is-kumu"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Web-based tool for creating &lt;strong&gt;system maps and visualizing relationships&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Used for: network diagrams, stakeholder maps, concept maps, causal loop diagrams&lt;/li&gt;
&lt;li&gt;✅ Primary use = creating system maps and visualizing relationships — exam answer (JAN_FN Q289)&lt;/li&gt;
&lt;li&gt;❌ NOT for building financial models&lt;/li&gt;
&lt;li&gt;❌ NOT for performing real-time data analysis&lt;/li&gt;
&lt;li&gt;❌ NOT for designing geographic navigation maps&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-kumu--use-cases"&gt;2. Kumu — Use Cases:&lt;a class="anchor" href="#2-kumu--use-cases"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Use Case&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;System maps&lt;/td&gt;
 &lt;td&gt;Show interconnected components&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Stakeholder maps&lt;/td&gt;
 &lt;td&gt;Relationships between people/organizations&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Causal loop diagrams&lt;/td&gt;
 &lt;td&gt;Cause-effect relationships&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Network analysis&lt;/td&gt;
 &lt;td&gt;Identify key nodes and connections&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Impact mapping&lt;/td&gt;
 &lt;td&gt;Trace outcomes and impacts&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Concept maps&lt;/td&gt;
 &lt;td&gt;Link related ideas&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="3-focus-filters--exam-answer"&gt;3. Focus Filters — Exam Answer&lt;a class="anchor" href="#3-focus-filters--exam-answer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-are-focus-filters"&gt;What are Focus Filters?&lt;a class="anchor" href="#what-are-focus-filters"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Highlight &lt;strong&gt;specific parts&lt;/strong&gt; of visualization based on element properties&lt;/p&gt;</description></item><item><title>18. Python Package &amp; Environment Management</title><link>/docs/18.-python-package--environment-management/</link><pubDate>Thu, 18 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/18.-python-package--environment-management/</guid><description>&lt;h2 id="18-python-package--environment-management"&gt;18. Python Package &amp;amp; Environment Management&lt;a class="anchor" href="#18-python-package--environment-management"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-uv--overview"&gt;1. &lt;code&gt;uv&lt;/code&gt; — Overview&lt;a class="anchor" href="#1-uv--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fast modern Python &lt;strong&gt;package and project manager&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Written in Rust → &lt;strong&gt;10-100x faster&lt;/strong&gt; than pip&lt;/li&gt;
&lt;li&gt;Replaces: pip + venv + pyenv combined&lt;/li&gt;
&lt;li&gt;Created by Astral (makers of Ruff linter)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-uv--correct-command-sequence--exam-answer"&gt;2. &lt;code&gt;uv&lt;/code&gt; — Correct Command Sequence — Exam Answer:&lt;a class="anchor" href="#2-uv--correct-command-sequence--exam-answer"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# ✅ Correct sequence (exam answer May_FN Q359)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv init &lt;span style="color:#007f7f"&gt;# Step 1: initialize project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv python install 3.11 &lt;span style="color:#007f7f"&gt;# Step 2: install specific Python version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add pandas numpy &lt;span style="color:#007f7f"&gt;# Step 3: add dependencies&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="wrong-sequences"&gt;Wrong Sequences:&lt;a class="anchor" href="#wrong-sequences"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❌ uv init python 3.11 → uv add pandas numpy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❌ uv create --version 3.11 → uv install pandas numpy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❌ uv new --python=3.11 → uv sync pandas numpy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="3-uv--complete-command-reference"&gt;3. &lt;code&gt;uv&lt;/code&gt; — Complete Command Reference:&lt;a class="anchor" href="#3-uv--complete-command-reference"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv init &lt;span style="color:#007f7f"&gt;# create new project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv init my-project &lt;span style="color:#007f7f"&gt;# create in new folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Python versions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv python install 3.11 &lt;span style="color:#007f7f"&gt;# install Python 3.11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv python list &lt;span style="color:#007f7f"&gt;# list available versions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv python pin 3.11 &lt;span style="color:#007f7f"&gt;# pin version for project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add pandas &lt;span style="color:#007f7f"&gt;# add package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add pandas==2.1.0 &lt;span style="color:#007f7f"&gt;# specific version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add pandas numpy scipy &lt;span style="color:#007f7f"&gt;# multiple packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv remove pandas &lt;span style="color:#007f7f"&gt;# remove package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv sync &lt;span style="color:#007f7f"&gt;# install from lockfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Running&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv run script.py &lt;span style="color:#007f7f"&gt;# run in project environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv run jupyter notebook &lt;span style="color:#007f7f"&gt;# run Jupyter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Virtual environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv venv &lt;span style="color:#007f7f"&gt;# create venv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv venv --python 3.11 &lt;span style="color:#007f7f"&gt;# with specific Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# pip compatibility&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv pip install pandas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv pip install -r requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="4-pip--traditional-package-manager"&gt;4. &lt;code&gt;pip&lt;/code&gt; — Traditional Package Manager:&lt;a class="anchor" href="#4-pip--traditional-package-manager"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install pandas &lt;span style="color:#007f7f"&gt;# install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install pandas==2.1.0 &lt;span style="color:#007f7f"&gt;# specific version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -r requirements.txt &lt;span style="color:#007f7f"&gt;# from requirements file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip uninstall pandas &lt;span style="color:#007f7f"&gt;# remove&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip list &lt;span style="color:#007f7f"&gt;# list installed packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip freeze &amp;gt; requirements.txt &lt;span style="color:#007f7f"&gt;# save current environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip show pandas &lt;span style="color:#007f7f"&gt;# package details&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install --upgrade pandas &lt;span style="color:#007f7f"&gt;# upgrade package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install --no-cache-dir pandas &lt;span style="color:#007f7f"&gt;# skip cache&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-venv--built-in-virtual-environment"&gt;5. &lt;code&gt;venv&lt;/code&gt; — Built-in Virtual Environment:&lt;a class="anchor" href="#5-venv--built-in-virtual-environment"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -m venv .venv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Activate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;source&lt;/span&gt; .venv/bin/activate &lt;span style="color:#007f7f"&gt;# Mac/Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv&lt;span style="color:#0ff;font-weight:bold"&gt;\S&lt;/span&gt;cripts&lt;span style="color:#0ff;font-weight:bold"&gt;\a&lt;/span&gt;ctivate &lt;span style="color:#007f7f"&gt;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv&lt;span style="color:#0ff;font-weight:bold"&gt;\S&lt;/span&gt;cripts&lt;span style="color:#0ff;font-weight:bold"&gt;\A&lt;/span&gt;ctivate.ps1 &lt;span style="color:#007f7f"&gt;# Windows PowerShell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Deactivate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deactivate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -rf .venv &lt;span style="color:#007f7f"&gt;# Mac/Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rmdir /s .venv &lt;span style="color:#007f7f"&gt;# Windows&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="360a-conda--data-science-package-manager"&gt;360a. &lt;code&gt;conda&lt;/code&gt; — Data Science Package Manager:&lt;a class="anchor" href="#360a-conda--data-science-package-manager"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda create -n myenv python=3.11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Activate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda activate myenv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Deactivate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda deactivate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Install packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda install pandas numpy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# List environments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda env list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Export environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda env &lt;span style="color:#fff;font-weight:bold"&gt;export&lt;/span&gt; &amp;gt; environment.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Create from file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda env create -f environment.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Remove environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda env remove -n myenv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="conda-vs-pip"&gt;conda vs pip:&lt;a class="anchor" href="#conda-vs-pip"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Feature&lt;/th&gt;
 &lt;th&gt;pip&lt;/th&gt;
 &lt;th&gt;conda&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Package source&lt;/td&gt;
 &lt;td&gt;PyPI&lt;/td&gt;
 &lt;td&gt;Anaconda + PyPI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Environment mgmt&lt;/td&gt;
 &lt;td&gt;Needs venv&lt;/td&gt;
 &lt;td&gt;Built-in&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Non-Python packages&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;✅ (C libraries etc.)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Data science focused&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Speed&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;Slower&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="6-requirementstxt--version-pinning"&gt;6. &lt;code&gt;requirements.txt&lt;/code&gt; — Version Pinning:&lt;a class="anchor" href="#6-requirementstxt--version-pinning"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# ✅ Exact version (fully reproducible)
pandas==2.1.0
numpy==1.24.0
scikit-learn==1.3.0
matplotlib==3.7.0

# ✅ Allow patches (minor updates)
pandas&amp;gt;=2.0.0,&amp;lt;3.0.0

# ❌ Unpinned (unpredictable)
pandas
numpy&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="generate-requirementstxt"&gt;Generate requirements.txt:&lt;a class="anchor" href="#generate-requirementstxt"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip freeze &amp;gt; requirements.txt &lt;span style="color:#007f7f"&gt;# current environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -r requirements.txt &lt;span style="color:#007f7f"&gt;# install from file&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-python-dotenv--load-env-files"&gt;7. &lt;code&gt;python-dotenv&lt;/code&gt; — Load &lt;code&gt;.env&lt;/code&gt; Files:&lt;a class="anchor" href="#7-python-dotenv--load-env-files"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install python-dotenv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;from&lt;/span&gt; dotenv &lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; load_dotenv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;load_dotenv() &lt;span style="color:#007f7f"&gt;# loads .env file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_key = os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;API_KEY&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# read variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;db_url = os.getenv(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;DATABASE_URL&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# .env file (NEVER commit to git!)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;API_KEY=your_key_here
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DATABASE_URL=postgresql://user:pass@localhost/db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DEBUG=&lt;span style="color:#fff;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SECRET_KEY=supersecretkey&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-gitignore" data-lang="gitignore"&gt;# .gitignore — always exclude
.env
.env.*
*.env&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="tool-comparison--complete"&gt;Tool Comparison — Complete:&lt;a class="anchor" href="#tool-comparison--complete"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Task&lt;/th&gt;
 &lt;th&gt;Traditional&lt;/th&gt;
 &lt;th&gt;uv&lt;/th&gt;
 &lt;th&gt;conda&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Create venv&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;python -m venv&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv venv&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;conda create&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Install package&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pip install&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv add&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;conda install&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Install Python&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pyenv install&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv python install&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Built-in&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;From requirements&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pip install -r&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;uv sync&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;conda env create&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Speed&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;✅ Fastest&lt;/td&gt;
 &lt;td&gt;Slowest&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Data science&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="why-virtual-environments"&gt;Why Virtual Environments?&lt;a class="anchor" href="#why-virtual-environments"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Without venv:
Project A needs pandas==1.5.0
Project B needs pandas==2.1.0
→ Conflict! Can only have one globally

With venv:
Project A → its own environment → pandas==1.5.0
Project B → its own environment → pandas==2.1.0
→ No conflict ✅&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;uv sequence (exam answer):
 uv init → uv python install 3.11 → uv add pandas ✅

uv commands:
 uv add → add dependency
 uv remove → remove dependency
 uv sync → install from lockfile
 uv run → run in project environment

pip commands:
 pip install package==version
 pip freeze &amp;gt; requirements.txt
 pip install -r requirements.txt

venv:
 python -m venv .venv
 source .venv/bin/activate (Mac/Linux)
 .venv\Scripts\activate (Windows)

conda:
 conda create -n env python=3.11
 conda activate env
 conda install package

.env file:
 ✅ Store secrets here
 ✅ Load with python-dotenv
 ✅ Always add to .gitignore
 ❌ Never commit to git

requirements.txt:
 pandas==2.1.0 ✅ pinned
 pandas ❌ unpinned&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>19. Visualization Libraries</title><link>/docs/19.-visualization-libraries/</link><pubDate>Fri, 19 Jan 2024 00:00:00 +0000</pubDate><guid>/docs/19.-visualization-libraries/</guid><description>&lt;h2 id="19-visualization-libraries"&gt;19. Visualization Libraries&lt;a class="anchor" href="#19-visualization-libraries"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-seaborn--overview"&gt;1. Seaborn — Overview&lt;a class="anchor" href="#1-seaborn--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-seaborn"&gt;What is Seaborn?&lt;a class="anchor" href="#what-is-seaborn"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Python library for &lt;strong&gt;EDA and statistical visualization&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Built on top of Matplotlib&lt;/li&gt;
&lt;li&gt;Higher-level, less code for better-looking plots&lt;/li&gt;
&lt;li&gt;✅ Primary use = exploratory data analysis and statistical visualization — exam answer (TDS_(1) Q5)&lt;/li&gt;
&lt;li&gt;❌ NOT for web development (Django/Flask)&lt;/li&gt;
&lt;li&gt;❌ NOT for numerical computing (NumPy)&lt;/li&gt;
&lt;li&gt;❌ NOT for HTTP requests (requests)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-seaborn--key-plots"&gt;2. Seaborn — Key Plots:&lt;a class="anchor" href="#2-seaborn--key-plots"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; seaborn &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; sns
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.heatmap(df.corr(), annot=&lt;span style="color:#fff;font-weight:bold"&gt;True&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# correlation heatmap ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.histplot(df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;]) &lt;span style="color:#007f7f"&gt;# histogram&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.boxplot(x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;cat&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;, data=df) &lt;span style="color:#007f7f"&gt;# box plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.scatterplot(x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, data=df) &lt;span style="color:#007f7f"&gt;# scatter plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.barplot(x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;cat&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;, data=df) &lt;span style="color:#007f7f"&gt;# bar plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.pairplot(df) &lt;span style="color:#007f7f"&gt;# pairwise relationships&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.violinplot(x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;cat&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;, data=df) &lt;span style="color:#007f7f"&gt;# violin plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sns.lineplot(x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;val&amp;#39;&lt;/span&gt;, data=df) &lt;span style="color:#007f7f"&gt;# line plot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="3-seaborn--when-to-use-which-plot"&gt;3. Seaborn — When to Use Which Plot:&lt;a class="anchor" href="#3-seaborn--when-to-use-which-plot"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Plot&lt;/th&gt;
 &lt;th&gt;Use Case&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;heatmap&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Correlation matrix visualization ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;histplot&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Distribution of single variable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;boxplot&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Distribution + outliers across groups&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;scatterplot&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Relationship between two variables&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;barplot&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Compare means across categories&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pairplot&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;All pairwise relationships in dataset&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;violinplot&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Distribution shape across groups&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;lineplot&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Trends over time&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="4-matplotlib--overview"&gt;4. Matplotlib — Overview&lt;a class="anchor" href="#4-matplotlib--overview"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-matplotlib"&gt;What is Matplotlib?&lt;a class="anchor" href="#what-is-matplotlib"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Low-level&lt;/strong&gt; Python plotting library&lt;/li&gt;
&lt;li&gt;Foundation for Seaborn and Pandas plotting&lt;/li&gt;
&lt;li&gt;More control, more code required&lt;/li&gt;
&lt;li&gt;Best for: custom plots, fine-tuned control&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; plt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.plot(x, y) &lt;span style="color:#007f7f"&gt;# line plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.scatter(x, y) &lt;span style="color:#007f7f"&gt;# scatter plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.bar(categories, values) &lt;span style="color:#007f7f"&gt;# bar chart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.hist(data, bins=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# histogram&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.pie(values) &lt;span style="color:#007f7f"&gt;# pie chart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.boxplot(data) &lt;span style="color:#007f7f"&gt;# box plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.xlabel(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;X Label&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.ylabel(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Y Label&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.title(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Title&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.legend()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.show()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.savefig(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;plot.png&amp;#39;&lt;/span&gt;, dpi=&lt;span style="color:#ff0;font-weight:bold"&gt;300&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="5-matplotlib--subplots"&gt;5. Matplotlib — Subplots:&lt;a class="anchor" href="#5-matplotlib--subplots"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fig, axes = plt.subplots(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;, figsize=(&lt;span style="color:#ff0;font-weight:bold"&gt;12&lt;/span&gt;, &lt;span style="color:#ff0;font-weight:bold"&gt;10&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;].hist(data, bins=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;].set_title(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Histogram&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;].boxplot(data)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;].set_title(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Box Plot&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;].scatter(x, y)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;0&lt;/span&gt;].set_title(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Scatter&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;].plot(x, y)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;axes[&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;1&lt;/span&gt;].set_title(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Line&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.tight_layout()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plt.show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="6-plotly--interactive-charts"&gt;6. Plotly — Interactive Charts&lt;a class="anchor" href="#6-plotly--interactive-charts"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-plotly"&gt;What is Plotly?&lt;a class="anchor" href="#what-is-plotly"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Creates &lt;strong&gt;interactive charts&lt;/strong&gt; in browser&lt;/li&gt;
&lt;li&gt;Zoom, pan, hover tooltips built-in&lt;/li&gt;
&lt;li&gt;Works in Jupyter notebooks and web apps&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; plotly.express &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; px
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;px.line(df, x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;, title=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Sales Over Time&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;px.bar(df, x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;category&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;revenue&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;px.scatter(df, x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;advertising&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;, color=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;region&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;px.histogram(df, x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;age&amp;#39;&lt;/span&gt;, nbins=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;px.box(df, x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;category&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;price&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;px.choropleth(df, locations=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;country&amp;#39;&lt;/span&gt;, color=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# map&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="7-folium--interactive-maps"&gt;7. Folium — Interactive Maps&lt;a class="anchor" href="#7-folium--interactive-maps"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Covered fully in Section 14 (Geospatial)&lt;/li&gt;
&lt;li&gt;Creates &lt;strong&gt;interactive maps&lt;/strong&gt; in browser&lt;/li&gt;
&lt;li&gt;Best for: geographic data visualization&lt;/li&gt;
&lt;li&gt;✅ Use for store location maps, coverage analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="8-streamlit--data-dashboards"&gt;8. Streamlit — Data Dashboards&lt;a class="anchor" href="#8-streamlit--data-dashboards"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="what-is-streamlit"&gt;What is Streamlit?&lt;a class="anchor" href="#what-is-streamlit"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Python library for building &lt;strong&gt;data dashboards&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;No HTML/CSS/JavaScript needed&lt;/li&gt;
&lt;li&gt;Used with Docker for deployment (exam-relevant)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; streamlit &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; st
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; pandas &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff;font-weight:bold"&gt;import&lt;/span&gt; plotly.express &lt;span style="color:#fff;font-weight:bold"&gt;as&lt;/span&gt; px
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;st.title(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Sales Dashboard&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Sidebar filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;region = st.sidebar.selectbox(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;Region&amp;#39;&lt;/span&gt;, df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;region&amp;#39;&lt;/span&gt;].unique())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;filtered = df[df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;region&amp;#39;&lt;/span&gt;] == region]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;col1, col2 = st.columns(&lt;span style="color:#ff0;font-weight:bold"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;col1.metric(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Total Sales&amp;#34;&lt;/span&gt;, &lt;span style="color:#0ff;font-weight:bold"&gt;f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;$&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;{&lt;/span&gt;filtered[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;].sum()&lt;span style="color:#0ff;font-weight:bold"&gt;:&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;,.0f&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;col2.metric(&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#34;Orders&amp;#34;&lt;/span&gt;, &lt;span style="color:#fff;font-weight:bold"&gt;len&lt;/span&gt;(filtered))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Chart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fig = px.line(filtered, x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;st.plotly_chart(fig)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;st.dataframe(filtered)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="visualization-library-comparison--complete"&gt;Visualization Library Comparison — Complete:&lt;a class="anchor" href="#visualization-library-comparison--complete"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Library&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Interactive&lt;/th&gt;
 &lt;th&gt;Best For&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Seaborn&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Statistical&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;EDA, statistical plots ✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Matplotlib&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;General&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;Custom, fine-tuned plots&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Plotly&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;General&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Interactive charts&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Folium&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Maps&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Geographic visualization&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Streamlit&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Dashboard&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Data apps, dashboards&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Bokeh&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;General&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;Web-based interactive&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="choosing-right-visualization--exam-scenarios"&gt;Choosing Right Visualization — Exam Scenarios:&lt;a class="anchor" href="#choosing-right-visualization--exam-scenarios"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;EDA and statistical visualization&amp;#34;
→ Seaborn ✅

&amp;#34;Interactive map with markers for stakeholders&amp;#34;
→ Folium ✅

&amp;#34;Deploy Python dashboard as web app&amp;#34;
→ Streamlit ✅

&amp;#34;Correlation matrix visualization&amp;#34;
→ sns.heatmap(df.corr()) ✅

&amp;#34;Coverage analysis: 8 stores within 5km&amp;#34;
→ Folium colored markers + radius circle ✅

&amp;#34;Statistical distribution + outliers&amp;#34;
→ sns.boxplot() ✅

&amp;#34;Relationship between two variables&amp;#34;
→ sns.scatterplot() ✅

&amp;#34;Trends over time&amp;#34;
→ px.line() or sns.lineplot() ✅&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="pandas-built-in-plotting"&gt;pandas Built-in Plotting:&lt;a class="anchor" href="#pandas-built-in-plotting"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007f7f"&gt;# Quick plots directly from DataFrame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].plot() &lt;span style="color:#007f7f"&gt;# line plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].plot(kind=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;hist&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# histogram&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;col&amp;#39;&lt;/span&gt;].plot(kind=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# bar chart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.plot(x=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;, y=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# line from DataFrame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.boxplot(column=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;sales&amp;#39;&lt;/span&gt;, by=&lt;span style="color:#0ff;font-weight:bold"&gt;&amp;#39;region&amp;#39;&lt;/span&gt;) &lt;span style="color:#007f7f"&gt;# box plot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df.hist(bins=&lt;span style="color:#ff0;font-weight:bold"&gt;30&lt;/span&gt;, figsize=(&lt;span style="color:#ff0;font-weight:bold"&gt;12&lt;/span&gt;,&lt;span style="color:#ff0;font-weight:bold"&gt;8&lt;/span&gt;)) &lt;span style="color:#007f7f"&gt;# all columns histogram&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="quick-reference"&gt;Quick Reference&lt;a class="anchor" href="#quick-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Library Selection:
 EDA + statistical plots → Seaborn ✅
 Custom/fine-tuned plots → Matplotlib
 Interactive charts → Plotly
 Geographic/map → Folium ✅
 Data dashboards → Streamlit

Seaborn key plots:
 sns.heatmap(df.corr()) → correlation ✅
 sns.boxplot() → distribution + outliers
 sns.scatterplot() → two variable relationship
 sns.pairplot() → all pairwise relationships
 sns.histplot() → single variable distribution

Exam answers:
 &amp;#34;EDA and statistical visualization&amp;#34; → Seaborn ✅
 &amp;#34;Interactive map for stakeholders&amp;#34; → Folium ✅
 &amp;#34;Deploy Python dashboard&amp;#34; → Streamlit ✅
 &amp;#34;Correlation heatmap&amp;#34; → sns.heatmap(df.corr()) ✅&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>