<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Pandas on Asadbek Kurbonov</title><link>/tags/pandas/</link><description>Recent content in Pandas on Asadbek Kurbonov</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 08 Jul 2026 12:30:00 +0200</lastBuildDate><atom:link href="/tags/pandas/index.xml" rel="self" type="application/rss+xml"/><item><title>Polars vs Pandas, PyO3 vs Cython: Rust Is Rewriting Python's Fast Path</title><link>/posts/rust-under-python/</link><pubDate>Wed, 08 Jul 2026 12:30:00 +0200</pubDate><guid>/posts/rust-under-python/</guid><description>&lt;p>If you list the tools that made Python feel fast lately, a pattern jumps out. The dataframe library everyone is switching to, &lt;a href="https://pola.rs/">Polars&lt;/a>, is written in Rust. The linter that replaced flake8, &lt;a href="https://docs.astral.sh/ruff/">Ruff&lt;/a>, is Rust. The packaging tool eating pip and virtualenv, &lt;a href="https://docs.astral.sh/uv/">uv&lt;/a>, is Rust. Pydantic v2 rewrote its core in Rust; Hugging Face&amp;rsquo;s &lt;code>tokenizers&lt;/code> is Rust; &lt;code>orjson&lt;/code> is Rust; even &lt;code>cryptography&lt;/code> moved its guts to Rust years ago.&lt;/p>
&lt;p>Python isn&amp;rsquo;t going anywhere — it&amp;rsquo;s still the interface. But the &lt;em>engine&lt;/em> underneath the performance-critical parts is quietly being rewritten in Rust. This post looks at that shift from two angles I&amp;rsquo;ve actually measured: &lt;strong>Polars vs Pandas&lt;/strong> (the library you use) and &lt;strong>PyO3 vs Cython&lt;/strong> (how you&amp;rsquo;d build such a library yourself). All numbers below I ran on one 8-core Linux x86-64 box.&lt;/p></description></item><item><title>Pandas vs Polars in Production: Performance Comparison</title><link>/posts/pandas-vs-polars-in-production/</link><pubDate>Sun, 23 Nov 2025 23:02:39 +0100</pubDate><guid>/posts/pandas-vs-polars-in-production/</guid><description>&lt;p>When performance bottlenecks started affecting my production data pipeline, I decided to test whether Polars could deliver on its performance promises. This is what I learned from migrating a real production workload from Pandas to Polars.&lt;/p>
&lt;h2 id="the-workload">The Workload&lt;/h2>
&lt;p>The application was a data aggregation service running as a Kubernetes pod with the following constraints:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Resources&lt;/strong>: 2 CPUs, 3 GB RAM&lt;/li>
&lt;li>&lt;strong>Execution frequency&lt;/strong>: Every 2-2.5 minutes&lt;/li>
&lt;li>&lt;strong>Data volume&lt;/strong>: 5,000-7,000 rows × 100-150 columns per run&lt;/li>
&lt;li>&lt;strong>Operations&lt;/strong>: Multiple database calls, API requests, DataFrame merges, arithmetic operations (additions, multiplications), and group-by aggregations&lt;/li>
&lt;li>&lt;strong>Web server&lt;/strong>: FastAPI with Uvicorn handling production traffic&lt;/li>
&lt;/ul>
&lt;p>All operations were properly vectorized — no row-by-row iteration. The pipeline combined data from various sources into a single DataFrame, transformed it, and output the results.&lt;/p></description></item></channel></rss>