<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Ujjwal Chowdhury</title><link>https://u77w41.github.io/tags/python/</link><description>Recent content in Python on Ujjwal Chowdhury</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 03 Aug 2024 17:37:11 +0000</lastBuildDate><atom:link href="https://u77w41.github.io/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>NSEScraper: An Open-Source Scraper for nseindia.com</title><link>https://u77w41.github.io/p/nsescraper/</link><pubDate>Sat, 03 Aug 2024 17:37:11 +0000</pubDate><guid>https://u77w41.github.io/p/nsescraper/</guid><description>&lt;img src="https://u77w41.github.io/p/nsescraper/nse_homepage.png" alt="Featured image of post NSEScraper: An Open-Source Scraper for nseindia.com" /&gt;&lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://pypi.org/project/nsescraper/" target="_blank" rel="noopener"&#10; &gt;PyPI Package&lt;/a&gt; · &lt;a class="link" href="https://github.com/u77w41/nsescraper" target="_blank" rel="noopener"&#10; &gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="overview"&gt;Overview&#10;&lt;/h2&gt;&lt;p&gt;The National Stock Exchange of India (NSE) website provides live market feeds, but extracting clean intraday price histories for quantitative analysis or algorithmic backtesting often requires navigating session headers, cookie rotation, and nested JSON endpoints.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;nsescraper&lt;/strong&gt; is a lightweight, open-source Python library that queries NSE endpoints directly and returns cleaned, timestamped pandas DataFrames for any listed index or equity. It supports standard 1-minute OHLC bars, custom multi-minute intervals, and second-by-second tick data.&lt;/p&gt;&#10;&lt;h2 id="installation"&gt;Installation&#10;&lt;/h2&gt;&lt;p&gt;Install the package directly from PyPI using pip:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install nsescraper&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Dependencies: Python 3.8+ and &lt;code&gt;pandas&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="features"&gt;Features&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Real-time Intraday Feeds:&lt;/strong&gt; Extract the current trading day&amp;rsquo;s prices for indices (Nifty 50, Bank Nifty, Midcap, Sectoral indices) and all NSE-listed stocks.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;1-Minute OHLC Candles:&lt;/strong&gt; Formats timestamped Open, High, Low, and Close bars across the full market session.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;1-Second Tick Data:&lt;/strong&gt; Capture granular tick-level price changes throughout active market hours.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Custom Candlestick Resampling:&lt;/strong&gt; Parameterize candle intervals to custom durations (e.g., 5-minute, 15-minute, or 60-minute bars).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Direct pandas Integration:&lt;/strong&gt; Every function returns a standard pandas DataFrame ready for technical analysis, plotting, or CSV export.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="usage--examples"&gt;Usage &amp;amp; Examples&#10;&lt;/h2&gt;&lt;p&gt;Import the package functions:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;nsescraper&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;intraday_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intraday_stock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;historical_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;historical_stock&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="1-1-minute-ohlc-candlestick-data"&gt;1. 1-Minute OHLC Candlestick Data&#10;&lt;/h3&gt;&lt;p&gt;To fetch the current day&amp;rsquo;s 1-minute candles for an index:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df_nifty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intraday_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;nifty 50&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df_nifty&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----+---------------------+---------+---------+---------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | DATETIME | open | high | low | close |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+=====+=====================+=========+=========+=========+=========+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 0 | 2024-08-02 09:00:00 | 25010.9 | 25085.6 | 24777.0 | 24945.8 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 1 | 2024-08-02 09:01:00 | 24946.0 | 24950.0 | 24826.8 | 24830.0 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 2 | 2024-08-02 09:02:00 | 24816.5 | 24816.5 | 24784.0 | 24792.3 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 3 | 2024-08-02 09:03:00 | 24791.5 | 24791.5 | 24777.6 | 24789.8 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----+---------------------+---------+---------+---------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;To fetch 1-minute candles for an individual stock:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df_stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intraday_stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;britannia&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df_stock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----+---------------------+---------+---------+---------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | DATETIME | open | high | low | close |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+=====+=====================+=========+=========+=========+=========+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 0 | 2024-08-02 09:15:00 | 5645.9 | 5695.8 | 5645.9 | 5695.8 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 1 | 2024-08-02 09:16:00 | 5707.8 | 5732.95 | 5706.7 | 5729.85 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 2 | 2024-08-02 09:17:00 | 5715.0 | 5737.9 | 5709.15 | 5729.85 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----+---------------------+---------+---------+---------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="2-high-frequency-1-second-tick-data"&gt;2. High-Frequency 1-Second Tick Data&#10;&lt;/h3&gt;&lt;p&gt;Pass &lt;code&gt;tick=True&lt;/code&gt; to retrieve tick-by-tick market logs:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Tick data for index&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df_midcap_ticks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intraday_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;nifty midcap 100&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Tick data for equity&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df_reddy_ticks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intraday_stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dr reddy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df_reddy_ticks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+------+---------------------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | DATETIME | Tick |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+======+=====================+=========+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 0 | 2024-08-02 09:15:24 | 6891.20 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 1 | 2024-08-02 09:15:30 | 6886.10 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 2 | 2024-08-02 09:15:37 | 6900.05 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 3 | 2024-08-02 09:15:44 | 6900.60 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+------+---------------------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="3-custom-timeframe-candlesticks"&gt;3. Custom Timeframe Candlesticks&#10;&lt;/h3&gt;&lt;p&gt;Use the &lt;code&gt;candlestick&lt;/code&gt; argument to specify an arbitrary minute interval (e.g., 10-minute candles):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df_energy_10m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intraday_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;nifty energy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;candlestick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df_energy_10m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----+---------------------+---------+---------+---------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | DATETIME | open | high | low | close |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+====+=====================+=========+=========+=========+=========+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 0 | 2024-08-02 09:00:00 | 44954.4 | 44954.4 | 44481.8 | 44481.8 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 1 | 2024-08-02 09:10:00 | 44481.8 | 44627.7 | 44258.1 | 44625.6 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 2 | 2024-08-02 09:20:00 | 44618.6 | 44684.2 | 44537.8 | 44551.7 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----+---------------------+---------+---------+---------+---------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="4-historical-data-retrieval"&gt;4. Historical Data Retrieval&#10;&lt;/h3&gt;&lt;p&gt;To fetch longer-term end-of-day price histories:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df_hist_nifty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;historical_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;NIFTY 50&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df_hist_abb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;historical_stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ABB&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Analysis on Complete Works of Swami Vivekananda</title><link>https://u77w41.github.io/p/analysis-on-complete-works-of-swami-vivekananda/</link><pubDate>Fri, 08 Dec 2023 00:00:00 +0000</pubDate><guid>https://u77w41.github.io/p/analysis-on-complete-works-of-swami-vivekananda/</guid><description>&lt;img src="https://u77w41.github.io/p/analysis-on-complete-works-of-swami-vivekananda/swami-ji.png" alt="Featured image of post Analysis on Complete Works of Swami Vivekananda" /&gt;&lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/U77w41/Analysis-on-Complete-Works-of-Swami-Vivekananda/" target="_blank" rel="noopener"&#10; &gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="overview"&gt;Overview&#10;&lt;/h2&gt;&lt;p&gt;Calculating the exact count of unique items in a large data stream typically requires maintaining an in-memory hash table of every distinct entry seen so far. As the corpus grows into millions of tokens, memory consumption scales linearly ($O(N)$), creating bottlenecks in streaming and distributed pipelines.&lt;/p&gt;&#10;&lt;p&gt;The &lt;strong&gt;Flajolet-Martin (FM) algorithm&lt;/strong&gt; solves this by probabilistically estimating stream cardinality using a fixed, minimal amount of memory ($O(\log N)$ bits). This project applies the Flajolet-Martin algorithm to estimate the unique vocabulary size across the nine volumes of the &lt;em&gt;Complete Works of Swami Vivekananda&lt;/em&gt;, comparing the probabilistic estimate against exact set cardinality.&lt;/p&gt;&#10;&lt;h2 id="the-flajolet-martin-algorithm"&gt;The Flajolet-Martin Algorithm&#10;&lt;/h2&gt;&lt;p&gt;The algorithm estimates distinct elements by tracking the distribution of trailing zeros in hashed bit representations:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Hash Mapping:&lt;/strong&gt; Each token $w$ in the text stream is hashed to a uniform 32-bit or 64-bit integer $h(w)$.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Trailing Zeros ($\rho$):&lt;/strong&gt; For each hash value, the algorithm determines $\rho(h(w))$—the number of trailing zeros before the first 1-bit. A hash ending in $k$ zeros occurs with probability $2^{-(k+1)}$.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Maximum Tracking ($R$):&lt;/strong&gt; The algorithm maintains $R = \max(\rho(h(w)))$ across all processed tokens. If we observe a sequence ending in $R$ trailing zeros, we can infer that roughly $2^R$ unique elements have passed through the stream.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Correction Factor:&lt;/strong&gt; The raw estimate is adjusted using the Flajolet-Martin correction factor $\phi \approx 0.77351$:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;$$\text{Estimated Cardinality} \approx \frac{2^R}{\phi}$$&lt;/p&gt;&#10;&lt;h3 id="variance-reduction-stochastic-averaging"&gt;Variance Reduction (Stochastic Averaging)&#10;&lt;/h3&gt;&lt;p&gt;A single hash function has significant statistical variance. To produce a stable estimate:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The stream is evaluated across $m$ independent hash functions.&lt;/li&gt;&#10;&lt;li&gt;The hash functions are divided into $g$ distinct groups.&lt;/li&gt;&#10;&lt;li&gt;The arithmetic mean of estimates is computed within each group.&lt;/li&gt;&#10;&lt;li&gt;The overall result is obtained by taking the &lt;strong&gt;median of group averages&lt;/strong&gt;, filtering out extreme outlier hash values.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="processing-pipeline"&gt;Processing Pipeline&#10;&lt;/h2&gt;&lt;p&gt;The text processing pipeline handles the multi-volume corpus in Python:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Text Extraction &amp;amp; Cleaning:&lt;/strong&gt; Reads raw volume texts, stripping metadata, page numbers, and punctuation while normalizing text to lowercase tokens.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Token Streaming:&lt;/strong&gt; Simulates a continuous token stream rather than holding the entire preprocessed vocabulary in memory.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Multi-Hash Simulation:&lt;/strong&gt; Generates independent hash functions using linear congruential generators:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;$$h_i(x) = (a_i \cdot x + b_i) \pmod p$$&lt;/p&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;&lt;strong&gt;Benchmarking:&lt;/strong&gt; Compares the FM probabilistic cardinality against standard Python &lt;code&gt;set()&lt;/code&gt; counting to evaluate error bounds across different numbers of hash buckets.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="key-insights"&gt;Key Insights&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Memory Efficiency:&lt;/strong&gt; While exact counting requires storing hundreds of thousands of unique string tokens in memory, the Flajolet-Martin register array requires only a few bytes of storage.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Accuracy Trade-off:&lt;/strong&gt; Increasing the number of hash functions significantly tightens the standard error, bringing the estimated vocabulary count within 5-10% of the true distinct word count.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>