<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>首页 on Python数据分析</title><link>https://www.pythondataanalysis.com/</link><description>Recent content in 首页 on Python数据分析</description><generator>Hugo</generator><language>zh-CN</language><copyright>[jqx](https://jqx.me)</copyright><lastBuildDate>Mon, 14 Jul 2025 16:04:40 +0800</lastBuildDate><atom:link href="https://www.pythondataanalysis.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Polars快速入门</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/quickstart/</link><pubDate>Thu, 20 Mar 2025 13:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/quickstart/</guid><description>&lt;h1 id="polars快速入门"&gt;Polars快速入门&lt;a class="anchor" href="#polars%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="安装"&gt;安装&lt;a class="anchor" href="#%e5%ae%89%e8%a3%85"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;采用 &lt;code&gt;pip install&lt;/code&gt; 即可安装 &lt;code&gt;Polars&lt;/code&gt; 。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pip install polars&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所有的二进制包都是基于 &lt;code&gt;Python&lt;/code&gt; v3.6+ 构建的。&lt;/p&gt;
&lt;h2 id="实例"&gt;实例&lt;a class="anchor" href="#%e5%ae%9e%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下面的例子中我们读入并解析一个 CSV 文件，过滤后紧跟一个 &lt;code&gt;groupby&lt;/code&gt; 分组求和操作（该例子仅在Python中演示，因为对于Rust而言，即时执行的API并不推荐）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;https://j.mp/iriscsv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;sepal_length&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;groupby(&lt;span style="color:#5af78e"&gt;&amp;#34;species&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;all()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum())
&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;p&gt;上面的代码输出如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 5)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭──────────────┬──────────────────┬─────────────────┬──────────────────┬─────────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ species ┆ sepal_length_sum ┆ sepal_width_sum ┆ petal_length_sum ┆ petal_width_sum │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ str ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞══════════════╪══════════════════╪═════════════════╪══════════════════╪═════════════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ &amp;#34;virginica&amp;#34; ┆ 324.5 ┆ 146.2 ┆ 273.1 ┆ 99.6 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ &amp;#34;versicolor&amp;#34; ┆ 281.9 ┆ 131.8 ┆ 202.9 ┆ 63.3 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ &amp;#34;setosa&amp;#34; ┆ 116.9 ┆ 81.7 ┆ 33.2 ┆ 6.1 │
&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;p&gt;如上所示， &lt;code&gt;Polars&lt;/code&gt; 可以格式化输出，包括作为表头的列名和数据类型。&lt;/p&gt;</description></item><item><title>Polars基本操作</title><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/basic-operations/</link><pubDate>Fri, 07 Mar 2025 11:31:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/basic-operations/</guid><description>&lt;h1 id="polars基本操作"&gt;Polars基本操作&lt;a class="anchor" href="#polars%e5%9f%ba%e6%9c%ac%e6%93%8d%e4%bd%9c"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;本节展示如何对dataframe的列执行基本操作，比如进行基本的算术计算、执行比较操作以及其他通用操作。在接下来的示例中，我们将使用以下dataframe：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;random&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;seed(&lt;span style="color:#ff9f43"&gt;42&lt;/span&gt;) &lt;span style="color:#78787e"&gt;# For reproducibility.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;nrs&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;names&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;ham&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;spam&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;egg&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;spam&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;random&amp;#34;&lt;/span&gt;: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;random&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;rand(&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;groups&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;B&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:#ff5c57"&gt;print&lt;/span&gt;(df)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;shape: (5, 4)
┌──────┬───────┬──────────┬────────┐
│ nrs ┆ names ┆ random ┆ groups │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ f64 ┆ str │
╞══════╪═══════╪══════════╪════════╡
│ 1 ┆ foo ┆ 0.37454 ┆ A │
│ 2 ┆ ham ┆ 0.950714 ┆ A │
│ 3 ┆ spam ┆ 0.731994 ┆ B │
│ null ┆ egg ┆ 0.598658 ┆ A │
│ 5 ┆ spam ┆ 0.156019 ┆ B │
└──────┴───────┴──────────┴────────┘&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="基本算术运算"&gt;基本算术运算&lt;a class="anchor" href="#%e5%9f%ba%e6%9c%ac%e7%ae%97%e6%9c%af%e8%bf%90%e7%ae%97"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars 支持相同长度的序列之间进行基本算术运算，也支持序列与字面值之间的基本算术运算。当字面值与序列混合使用时，字面值会被广播扩展，以匹配与之运算的序列的长度。&lt;/p&gt;</description></item><item><title>Polars数据类型和结构</title><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/data-types-and-structures/</link><pubDate>Thu, 06 Mar 2025 23:16:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/data-types-and-structures/</guid><description>&lt;h1 id="polars数据类型和结构"&gt;Polars数据类型和结构&lt;a class="anchor" href="#polars%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e5%92%8c%e7%bb%93%e6%9e%84"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="polars数据类型"&gt;Polars数据类型&lt;a class="anchor" href="#polars%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars支持多种数据类型，大致可分为以下几类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数字数据类型：有符号整数、无符号整数、浮点数和小数。&lt;/li&gt;
&lt;li&gt;嵌套数据类型：列表、结构体和数组。&lt;/li&gt;
&lt;li&gt;时间：日期、日期时间、时间和时间增量。&lt;/li&gt;
&lt;li&gt;杂项：字符串、二进制数据、布尔值、分类、枚举和对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所有类型都支持由特殊值&lt;code&gt;null&lt;/code&gt;表示的缺失值。在浮点数据类型中与特殊值&lt;code&gt;NaN&lt;/code&gt;合并；参考有关&lt;a href="#floating-point-numbers"&gt;浮点数&lt;/a&gt;的更多信息。&lt;/p&gt;
&lt;p&gt;你也可以找到附录中支持的&lt;a href="https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/data-types-and-structures/#%e9%99%84%e5%bd%95%e5%ae%8c%e6%95%b4%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e8%a1%a8"&gt;所有数据类型&lt;/a&gt;的完整表，说明何时使用每种数据类型，并提供指向文档相关部分的链接。&lt;/p&gt;
&lt;h2 id="序列series"&gt;序列(Series)&lt;a class="anchor" href="#%e5%ba%8f%e5%88%97series"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars提供的核心基础数据结构是序列（series）和数据框（dataframe）。序列是一种一维的同构数据结构。这里所说的“同构”是指一个序列中的所有元素都具有相同的数据类型。下面的代码片段展示了如何创建一个带名称的序列：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series(&lt;span style="color:#5af78e"&gt;&amp;#34;ints&amp;#34;&lt;/span&gt;, [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(s)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;shape: (5,)
Series: &amp;#39;ints&amp;#39; [i64]
[
 1
 2
 3
 4
 5
]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建一个序列时，Polars会从你提供的值中推断数据类型。你可以指定一个具体的数据类型来覆盖这种推断机制：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;s1 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series(&lt;span style="color:#5af78e"&gt;&amp;#34;ints&amp;#34;&lt;/span&gt;, [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s2 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series(&lt;span style="color:#5af78e"&gt;&amp;#34;uints&amp;#34;&lt;/span&gt;, [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;], dtype&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;UInt64)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(s1&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;dtype, s2&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;dtype)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Int64 UInt64&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="数据框dataframe"&gt;数据框(Dataframe)&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e6%a1%86dataframe"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;数据框是一种二维的异构数据结构，它包含了具有唯一名称的序列。通过将数据存储在数据框中，你将能够使用Polars API编写用于操作数据的查询。你可以通过使用Polars提供的&lt;a href="https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/expressions-and-contexts/"&gt;上下文和表达式&lt;/a&gt;来实现这一点，我们接下来会讲到这些内容。&lt;/p&gt;
&lt;p&gt;下面的代码片段展示了如何根据一个由列表组成的字典来创建一个数据框：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;from&lt;/span&gt; datetime &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; date
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;Alice Archer&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Ben Brown&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Chloe Cooper&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Daniel Donovan&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;birthdate&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1997&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1985&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1983&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;22&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1981&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&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; &lt;span style="color:#5af78e"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;57.9&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;72.5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;53.6&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;83.1&lt;/span&gt;], &lt;span style="color:#78787e"&gt;# (kg)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1.56&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.77&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.65&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.75&lt;/span&gt;], &lt;span style="color:#78787e"&gt;# (m)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span 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:#ff5c57"&gt;print&lt;/span&gt;(df)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;shape: (4, 4)
┌────────────────┬────────────┬────────┬────────┐
│ name ┆ birthdate ┆ weight ┆ height │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ date ┆ f64 ┆ f64 │
╞════════════════╪════════════╪════════╪════════╡
│ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │
│ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │
│ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │
│ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │
└────────────────┴────────────┴────────┴────────┘&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="检查数据框dataframe"&gt;检查数据框dataframe&lt;a class="anchor" href="#%e6%a3%80%e6%9f%a5%e6%95%b0%e6%8d%ae%e6%a1%86dataframe"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在本小节中，我们将展示一些有用的方法来快速检查一个数据框。我们将以之前创建的数据框作为参考。&lt;/p&gt;</description></item><item><title>第 1 章 准备工作</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-01/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-01/</guid><description>&lt;h1 id="第-1-章-准备工作"&gt;第 1 章 准备工作&lt;a class="anchor" href="#%e7%ac%ac-1-%e7%ab%a0-%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="11-本书的内容"&gt;1.1 本书的内容&lt;a class="anchor" href="#11-%e6%9c%ac%e4%b9%a6%e7%9a%84%e5%86%85%e5%ae%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本书讲的是利用 Python 进行数据控制、处理、整理、分析等方面的具体细节和基本要点。我的目标是介绍 Python 编程和用于数据处理的库和工具环境，掌握这些，可以让你成为一个数据分析专家。虽然本书的标题是“数据分析”，重点却是 Python 编程、库，以及用于数据分析的工具。这就是数据分析要用到的 Python 编程。&lt;/p&gt;
&lt;h3 id="什么样的数据"&gt;什么样的数据？&lt;a class="anchor" href="#%e4%bb%80%e4%b9%88%e6%a0%b7%e7%9a%84%e6%95%b0%e6%8d%ae"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当书中出现“数据”时，究竟指的是什么呢？主要指的是结构化数据（structured data），这个故意含糊其辞的术语代指了所有通用格式的数据，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表格型数据，其中各列可能是不同的类型（字符串、数值、日期等）。比如保存在关系型数据库中或以制表符/逗号为分隔符的文本文件中的那些数据。&lt;/li&gt;
&lt;li&gt;多维数组（矩阵）。&lt;/li&gt;
&lt;li&gt;通过关键列（对于 SQL 用户而言，就是主键和外键）相互联系的多个表。&lt;/li&gt;
&lt;li&gt;间隔平均或不平均的时间序列。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这绝不是一个完整的列表。大部分数据集都能被转化为更加适合分析和建模的结构化形式，虽然有时这并不是很明显。如果不行的话，也可以将数据集的特征提取为某种结构化形式。例如，一组新闻文章可以被处理为一张词频表，而这张词频表就可以用于情感分析。&lt;/p&gt;
&lt;p&gt;大部分电子表格软件（比如 Microsoft Excel，它可能是世界上使用最广泛的数据分析工具了）的用户不会对此类数据感到陌生。&lt;/p&gt;
&lt;h2 id="12-为什么要使用-python-进行数据分析"&gt;1.2 为什么要使用 Python 进行数据分析&lt;a class="anchor" href="#12-%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e4%bd%bf%e7%94%a8-python-%e8%bf%9b%e8%a1%8c%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;许许多多的人（包括我自己）都很容易爱上 Python 这门语言。自从 1991 年诞生以来，Python 现在已经成为最受欢迎的动态编程语言之一，其他还有 Perl、Ruby 等。由于拥有大量的 Web 框架（比如 Rails（Ruby）和 Django（Python）），自从 2005 年，使用 Python 和 Ruby 进行网站建设工作非常流行。这些语言常被称作脚本（scripting）语言，因为它们可以用于编写简短而粗糙的小程序（也就是脚本）。我个人并不喜欢“脚本语言”这个术语，因为它好像在说这些语言无法用于构建严谨的软件。在众多解释型语言中，由于各种历史和文化的原因，Python 发展出了一个巨大而活跃的科学计算（scientific computing）社区。在过去的 10 年，Python 从一个边缘或“自担风险”的科学计算语言，成为了数据科学、机器学习、学界和工业界软件开发最重要的语言之一。&lt;/p&gt;
&lt;p&gt;在数据分析、交互式计算以及数据可视化方面，Python 将不可避免地与其他开源和商业的领域特定编程语言/工具进行对比，如 R、MATLAB、SAS、Stata 等。近年来，由于 Python 的库（例如 pandas 和 scikit-learn）不断改良，使其成为数据分析任务的一个优选方案。结合其在通用编程方面的强大实力，我们完全可以只使用 Python 这一种语言构建以数据为中心的应用。&lt;/p&gt;
&lt;h3 id="python-作为胶水语言"&gt;Python 作为胶水语言&lt;a class="anchor" href="#python-%e4%bd%9c%e4%b8%ba%e8%83%b6%e6%b0%b4%e8%af%ad%e8%a8%80"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Python 成为成功的科学计算工具的部分原因是，它能够轻松地集成 C、C++ 以及 Fortran 代码。大部分现代计算环境都利用了一些 Fortran 和 C 库来实现线性代数、优选、积分、快速傅里叶变换以及其他诸如此类的算法。许多企业和国家实验室也利用 Python 来“粘合”那些已经用了多年的遗留软件系统。&lt;/p&gt;</description></item><item><title>Polars入门</title><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/polars_getting_started/</link><pubDate>Thu, 06 Mar 2025 21:23:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/polars_getting_started/</guid><description>&lt;h1 id="polars入门"&gt;Polars入门&lt;a class="anchor" href="#polars%e5%85%a5%e9%97%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;本章旨在帮助你开始使用Polars。它涵盖了该库的所有基本特性和功能，让新用户能够轻松熟悉从初始安装和设置到核心功能等基础知识。如果你已经是高级用户，或者熟悉数据框，那么可以直接跳至下一章&lt;a href="https://www.pythondataanalysis.com/docs/Polars_user_guide/polars_installation/"&gt;安装Polars&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="安装polars"&gt;安装Polars&lt;a class="anchor" href="#%e5%ae%89%e8%a3%85polars"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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 polars&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="读取--写入"&gt;读取 &amp;amp; 写入&lt;a class="anchor" href="#%e8%af%bb%e5%8f%96--%e5%86%99%e5%85%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars支持读取和写入常见的文件格式（例如，CSV、JSON、Parquet）、云存储（亚马逊S3、微软Azure Blob、谷歌BigQuery）以及数据库（例如，PostgreSQL、MySQL）。下面，我们创建一个小的数据框，并展示如何将其写入磁盘以及再读取回来。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; datetime &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; dt
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;Alice Archer&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Ben Brown&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Chloe Cooper&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Daniel Donovan&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;birthdate&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dt&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;date(&lt;span style="color:#ff9f43"&gt;1997&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dt&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;date(&lt;span style="color:#ff9f43"&gt;1985&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dt&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;date(&lt;span style="color:#ff9f43"&gt;1983&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;22&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dt&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;date(&lt;span style="color:#ff9f43"&gt;1981&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&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; &lt;span style="color:#5af78e"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;57.9&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;72.5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;53.6&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;83.1&lt;/span&gt;], &lt;span style="color:#78787e"&gt;# (kg)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1.56&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.77&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.65&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.75&lt;/span&gt;], &lt;span style="color:#78787e"&gt;# (m)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span 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:#ff5c57"&gt;print&lt;/span&gt;(df)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;shape: (4, 4)
┌────────────────┬────────────┬────────┬────────┐
│ name ┆ birthdate ┆ weight ┆ height │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ date ┆ f64 ┆ f64 │
╞════════════════╪════════════╪════════╪════════╡
│ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │
│ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │
│ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │
│ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │
└────────────────┴────────────┴────────┴────────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;有关CSV文件格式和其他数据格式的更多示例，请参阅用户指南的&lt;a href="io/index.md"&gt;输入输出&lt;/a&gt;部分。&lt;/p&gt;</description></item><item><title>谓词下推</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/optimizations/lazy/predicate-pushdown/</link><pubDate>Fri, 21 Mar 2025 14:45:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/optimizations/lazy/predicate-pushdown/</guid><description>&lt;h1 id="谓词下推"&gt;谓词下推&lt;a class="anchor" href="#%e8%b0%93%e8%af%8d%e4%b8%8b%e6%8e%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;谓词下推是&lt;code&gt;Polars&lt;/code&gt;所做的优化，可以减少查询时间和内存使用。谓词是数据库行话，用于在某个表上应用过滤器，从而减少该表上的行数。&lt;/p&gt;
&lt;p&gt;那么，让我们看看是否可以加载一些Reddit数据并对几个谓词进行过滤。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;from&lt;/span&gt; ..paths &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; DATA_DIR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q1 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_csv(&lt;span style="color:#5af78e"&gt;f&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#5af78e"&gt;{&lt;/span&gt;DATA_DIR&lt;span style="color:#5af78e"&gt;}&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/reddit.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;comment_karma&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;) &lt;span style="color:#78787e"&gt;# 谓词过滤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;link_karma&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;str&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;contains(&lt;span style="color:#5af78e"&gt;r&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;^a&amp;#34;&lt;/span&gt;)) &lt;span style="color:#78787e"&gt;# filter name that start with an &amp;#34;a&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果我们在上面运行这个查询，什么都不会发生！这是由于懒惰的评估。
除非特别要求，否则不会发生任何事情。这使Polars能够看到查询的整个上下文，并及时优化以执行。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.collect&lt;/code&gt;方法请求执行。这将查询所有可用数据。
在编写、优化和检查查询时，这通常是不可取的。另一个调用执行的方法是&lt;code&gt;.fetch&lt;/code&gt;方法。&lt;code&gt;.fetch&lt;/code&gt;接受一个参数&lt;code&gt;n_rows&lt;/code&gt;，并尝试在数据源上&amp;rsquo;获取&amp;rsquo;该数量的行（尽管没有给出任何保证）。&lt;/p&gt;
&lt;p&gt;因此，让我们从源文件中“获取”约1000万行，并应用谓词。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;q1&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;fetch(n_rows&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff5c57"&gt;int&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;1e7&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (656, 6)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────┬─────────────┬─────────────┬────────────┬───────────────┬────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ id ┆ name ┆ created_utc ┆ updated_on ┆ comment_karma ┆ link_karma │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════════╪═════════════╪═════════════╪════════════╪═══════════════╪════════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 77860 ┆ aquarin ┆ 1137474000 ┆ 1536528294 ┆ 150 ┆ 11 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 77974 ┆ aadvaark ┆ 1137301200 ┆ 1536528294 ┆ 26 ┆ 47 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 78004 ┆ apoisel ┆ 1137301200 ┆ 1536497404 ┆ 42 ┆ 2549 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 78041 ┆ aonic ┆ 1137301200 ┆ 1536497404 ┆ 2931 ┆ 2095 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ … ┆ … ┆ … ┆ … ┆ … ┆ … │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1192656 ┆ atothedrian ┆ 1162785880 ┆ 1536497412 ┆ 748 ┆ 585 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1204607 ┆ akbusiness ┆ 1162899425 ┆ 1536532995 ┆ 73 ┆ 512 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1214809 ┆ aaminics ┆ 1162969322 ┆ 1536533034 ┆ 22 ┆ 6 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1225341 ┆ antonulrich ┆ 1163110623 ┆ 1536497412 ┆ 9304 ┆ 1782 │
&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;p&gt;上面我们看到，从1000万行中，61503行匹配我们的谓词。&lt;/p&gt;</description></item><item><title>字符串</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/performance/strings/</link><pubDate>Fri, 21 Mar 2025 13:45:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/performance/strings/</guid><description>&lt;h1 id="字符串"&gt;字符串&lt;a class="anchor" href="#%e5%ad%97%e7%ac%a6%e4%b8%b2"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;了解&lt;code&gt;Arrow&lt;/code&gt;和&lt;code&gt;Polars&lt;/code&gt;使用的内存格式可以真正提高查询的性能. 对于大型字符串数据尤其如此。下图显示了&lt;code&gt;Arrow&lt;/code&gt; &lt;code&gt;UTF8&lt;/code&gt;数组在内存中的布局。&lt;/p&gt;
&lt;p&gt;数组&lt;code&gt;[“foo”、“bar”、“ham”]&lt;/code&gt;由以下编码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;连接字符串&lt;code&gt;foobarham&lt;/code&gt;，&lt;/li&gt;
&lt;li&gt;一个偏移数组，指示每个字符串&lt;code&gt;[0,2,5,8]&lt;/code&gt;的开始（和结束），&lt;/li&gt;
&lt;li&gt;空位图，指示空值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/arrow-string.svg" alt="arrow-string" /&gt;&lt;/p&gt;
&lt;p&gt;如果我们要读取字符串值，这种内存结构的缓存效率非常高。
尤其是如果我们将它与&lt;code&gt;Vec&amp;lt;String&amp;gt;&lt;/code&gt;（在&lt;code&gt;Rust&lt;/code&gt;中由堆分配的字符串数据组成的数组）进行比较。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/pandas-string.svg" alt="pandas-string" /&gt;&lt;/p&gt;
&lt;p&gt;然而，如果我们需要对&lt;code&gt;Arrow&lt;/code&gt; &lt;code&gt;UTF8&lt;/code&gt;数组重新排序，我们需要交换字符串值的所有字节，这在处理大型字符串时可能会非常昂贵。另一方面，对于&lt;code&gt;Vec&amp;lt;String&amp;gt;&lt;/code&gt;，我们只需要交换指针，只需移动8字节的数据，成本很低。
由于一项操作（过滤、连接、分组&lt;em&gt;等&lt;/em&gt;）而嵌入大量&lt;code&gt;Utf8&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt;的&lt;code&gt;DataFrame&lt;/code&gt;的重新排序可能很快变得非常昂贵。&lt;/p&gt;
&lt;h2 id="范畴型"&gt;范畴型&lt;a class="anchor" href="#%e8%8c%83%e7%95%b4%e5%9e%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;因此，&lt;code&gt;Polars&lt;/code&gt;有一个&lt;code&gt;CategoricalType&lt;/code&gt;。&lt;code&gt;category&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt;是一个数组，其中填充了&lt;code&gt;u32&lt;/code&gt;值，每个值代表一个唯一的字符串值。因此，在保持缓存效率的同时，移动值的成本也很低。&lt;/p&gt;
&lt;p&gt;在下面的示例中，我们将演示如何将一个&lt;code&gt;Utf8&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt;列强制转换为一个&lt;code&gt;Categorical&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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[&lt;span style="color:#5af78e"&gt;&amp;#34;utf8-column&amp;#34;&lt;/span&gt;]&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;cast(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Categorical)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="在分类数据上加入多个数据帧"&gt;在分类数据上加入多个数据帧&lt;a class="anchor" href="#%e5%9c%a8%e5%88%86%e7%b1%bb%e6%95%b0%e6%8d%ae%e4%b8%8a%e5%8a%a0%e5%85%a5%e5%a4%9a%e4%b8%aa%e6%95%b0%e6%8d%ae%e5%b8%a7"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当需要基于字符串数据连接两个&lt;code&gt;DataFrame&lt;/code&gt;时，需要同步&lt;code&gt;Category&lt;/code&gt;数据（&lt;code&gt;df1&lt;/code&gt;的&lt;code&gt;A&lt;/code&gt;列中的数据需要指向与&lt;code&gt;df2&lt;/code&gt;中的&lt;code&gt;B&lt;/code&gt;列相同的底层字符串数据）。可以通过在&lt;code&gt;StringCache&lt;/code&gt;上下文管理器中强制转换数据来实现。这将在该上下文管理器期间同步所有可发现的字符串值。如果希望全局字符串缓存在整个运行期间存在，可以将&lt;code&gt;toggle_string_cache&lt;/code&gt;设置为&lt;code&gt;True&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df1 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;ham&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df2 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;spam&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;eggs&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&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:#ff6ac1"&gt;with&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;StringCache():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df1&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;cast(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Categorical))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df2&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;cast(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Categorical))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="惰性连接分类数据上的多个数据帧"&gt;惰性连接分类数据上的多个数据帧&lt;a class="anchor" href="#%e6%83%b0%e6%80%a7%e8%bf%9e%e6%8e%a5%e5%88%86%e7%b1%bb%e6%95%b0%e6%8d%ae%e4%b8%8a%e7%9a%84%e5%a4%9a%e4%b8%aa%e6%95%b0%e6%8d%ae%e5%b8%a7"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在查询期间（直到调用&lt;code&gt;.collect()&lt;/code&gt;），惰性查询始终具有全局字符串缓存（除非您选择退出）。下面的示例显示了如何将两个&lt;code&gt;DataFrame&lt;/code&gt;与&lt;code&gt;Category&lt;/code&gt;类型连接起来。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lf1 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;ham&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;]})&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lf2 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;spam&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;eggs&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;]})&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lf1 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; lf1&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;cast(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Categorical))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lf2 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; lf2&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;cast(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Categorical))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lf1&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;join(lf2, on&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, how&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;inner&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Polars自定义函数</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/apply/udfs/</link><pubDate>Fri, 21 Mar 2025 13:42:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/apply/udfs/</guid><description>&lt;h1 id="polars自定义函数"&gt;Polars自定义函数&lt;a class="anchor" href="#polars%e8%87%aa%e5%ae%9a%e4%b9%89%e5%87%bd%e6%95%b0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;总会有一个操作非常特殊，以至于人们无法用&lt;code&gt;Polars&lt;/code&gt;的公共方法来完成它。幸运的是，polars允许您应用自定义函数。这意味着可以定义一个&lt;code&gt;Python&lt;/code&gt;函数（或&lt;code&gt;lambda&lt;/code&gt;），并将其传递给逻辑计划。&lt;/p&gt;
&lt;p&gt;假设我们想要以一种迫切（eager）的方式将一个映射操作应用于一个&lt;code&gt;Polars&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt;。这可以按如下所示进行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;my_map &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; {&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;ham&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;spam&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;eggs&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;s &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;]) &lt;span style="color:#78787e"&gt;# 构建Series&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; s&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;apply(&lt;span style="color:#ff6ac1"&gt;lambda&lt;/span&gt; x: my_map[x]) &lt;span style="color:#78787e"&gt;# 用lambda表达式添加Series&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;返回：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5,)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Series: &amp;#39;a&amp;#39; [str]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;foo&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;bar&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;ham&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;spam&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;eggs&amp;#34;
&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;p&gt;然而，由于&lt;code&gt;Polars&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt;只能包含一个数据类型，因此存在一些问题。&lt;/p&gt;
&lt;p&gt;在上面的&lt;code&gt;apply()&lt;/code&gt;方法中我们没有指定&lt;code&gt;Series&lt;/code&gt;应该包含的数据类型&lt;code&gt;Polars&lt;/code&gt;试图通过调用提供的函数本身来提前推断输出数据类型。如果它后来得到的数据类型与最初推断的类型不匹配，则该值将被指示为缺失（&lt;code&gt;null&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;如果输出数据类型已知，建议将该信息提供给&lt;code&gt;Polars&lt;/code&gt;（通过&lt;code&gt;.apply()&lt;/code&gt;的&lt;code&gt;dtype&lt;/code&gt;选项）。&lt;/p&gt;
&lt;p&gt;注意，应用函数后可能会更改数据类型：我们上面使用的&lt;code&gt;lambda&lt;/code&gt;得到一个整数作为输入，并在&lt;code&gt;my_map&lt;/code&gt;字典中找到正确的键后返回一个字符串（&lt;code&gt;pl.Utf8&lt;/code&gt;）。&lt;/p&gt;
&lt;h1 id="使用map或者apply"&gt;使用map或者apply?&lt;a class="anchor" href="#%e4%bd%bf%e7%94%a8map%e6%88%96%e8%80%85apply"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;使用自定义函数有两种方法，一种是使用&lt;code&gt;map&lt;/code&gt;，另一种是使用&lt;code&gt;apply&lt;/code&gt;。您需要哪一个取决于使用自定义函数的上下文：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;apply&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选择上下文：自定义函数应用于所有值 &lt;code&gt;Fn(value) -&amp;gt; y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;聚合上下文：自定义函数应用于所有组 &lt;code&gt;Fn([group_value_1, ... group_value_n]) -&amp;gt; y&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选择上下文：自定义函数应用于&lt;code&gt;Series&lt;/code&gt;，并且必须生成一个新的&lt;code&gt;Series&lt;/code&gt; &lt;code&gt;Fn(Series) -&amp;gt; Series&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;聚合上下文：自定义函数应用于&lt;code&gt;Series&lt;/code&gt;，并且必须生成一个新的&lt;code&gt;Series&lt;/code&gt; &lt;code&gt;Fn(Series) -&amp;gt; Series&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>选中行或列</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/row_col_selection/</link><pubDate>Fri, 21 Mar 2025 11:27:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/row_col_selection/</guid><description>&lt;h1 id="选中行或列"&gt;选中行或列&lt;a class="anchor" href="#%e9%80%89%e4%b8%ad%e8%a1%8c%e6%88%96%e5%88%97"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;对行或列进行选择的操作与其他数据框架库类似。&lt;/p&gt;
&lt;h2 id="选中列"&gt;选中列&lt;a class="anchor" href="#%e9%80%89%e4%b8%ad%e5%88%97"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#78787e"&gt;# 推荐写法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;select([&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 也可以写成这样&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df([&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌──────┬──────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞══════╪══════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ foo │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ ham │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ spam │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ null ┆ egg │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 5 ┆ null │
&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;h2 id="选中行"&gt;选中行&lt;a class="anchor" href="#%e9%80%89%e4%b8%ad%e8%a1%8c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff9f43"&gt;0&lt;/span&gt;:&lt;span style="color:#ff9f43"&gt;2&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (2, 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┬──────────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b ┆ c ┆ d │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ f64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╪══════════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ foo ┆ 0.37454 ┆ a │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ ham ┆ 0.950714 ┆ b │
&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;</description></item><item><title>字符串</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/data/strings/</link><pubDate>Fri, 21 Mar 2025 11:26:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/data/strings/</guid><description>&lt;h1 id="字符串"&gt;字符串&lt;a class="anchor" href="#%e5%ad%97%e7%ac%a6%e4%b8%b2"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;由于 &lt;code&gt;Arrow&lt;/code&gt; 后端, &lt;code&gt;Polars&lt;/code&gt;字符串操作比使用&lt;code&gt;NumPy&lt;/code&gt;或&lt;code&gt;Pandas&lt;/code&gt;执行的相同操作快得多。在后者中，字符串存储为&lt;code&gt;Python&lt;/code&gt;对象。 在遍历&lt;code&gt;np.array&lt;/code&gt; or the &lt;code&gt;pd.Series&lt;/code&gt;时，CPU需要跟踪所有字符串指针，并跳转到许多随机内存位置——这是非常低效的缓存。在&lt;code&gt;Polars&lt;/code&gt;（通过&lt;code&gt;Arrow&lt;/code&gt;数据结构）中，字符串在内存中是连续的。因此，对于CPU来说，遍历缓存是最优的，也是可预测的。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt;中可用的字符串处理函数可以在 &lt;a href="POLARS_PY_REF_GUIDE/series.html#strings#strings"&gt;``str` namespace&lt;/a&gt; 中找到。&lt;/p&gt;
&lt;p&gt;下面是几个例子。要计算字符串长度，请执行以下操作：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;shakespeare&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;All that glitters is not gold&amp;#34;&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;split(&lt;span style="color:#5af78e"&gt;&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;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;shakespeare&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;str&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lengths()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;letter_count&amp;#34;&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;返回：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (6, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────┬──────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ shakespeare ┆ letter_count │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ str ┆ u32 │
&lt;/span&gt;&lt;/span&gt;&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 ┆ 3 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ that ┆ 4 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ glitters ┆ 8 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ is ┆ 2 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ not ┆ 3 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ gold ┆ 4 │
&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;p&gt;下面是从句子中过滤出冠词（&lt;code&gt;the&lt;/code&gt;、&lt;code&gt;a&lt;/code&gt;、&lt;code&gt;and&lt;/code&gt;、&lt;em&gt;etc.&lt;/em&gt;）的正则表达式模式：&lt;/p&gt;</description></item><item><title>Arrow</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/interop/arrow/</link><pubDate>Fri, 21 Mar 2025 11:24:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/interop/arrow/</guid><description>&lt;h1 id="arrow"&gt;Arrow&lt;a class="anchor" href="#arrow"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Arrow&lt;/code&gt; 正在迅速地成为列式数据 &lt;em&gt;事实上&lt;/em&gt; 的标准。这意味着对 &lt;code&gt;Arrow&lt;/code&gt; 的支持（包括语言与工具）也在迅速增加。
由于开发者在这种格式的背后投入了大量的努力与支持，使用 &lt;code&gt;Arrow&lt;/code&gt; 可能是完成下面任务最快的方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读写 &lt;code&gt;Parquet&lt;/code&gt; 格式的文件&lt;/li&gt;
&lt;li&gt;从 CSV 读取列式数据&lt;/li&gt;
&lt;li&gt;交换列式数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 使用 &lt;code&gt;Arrow&lt;/code&gt; 内存缓冲作为 &lt;code&gt;Polars&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt; 最基本的构建模块。
这意味着当我们要在 &lt;code&gt;Polars&lt;/code&gt; 和 &lt;code&gt;Arrow&lt;/code&gt; 之间交换数据时，无需对数据进行&lt;strong&gt;拷贝&lt;/strong&gt;操作。
这也意味着 &lt;code&gt;Polars&lt;/code&gt; 获得了 &lt;code&gt;Arrow&lt;/code&gt; 带来的一切性能提升。&lt;/p&gt;
&lt;p&gt;要将 &lt;code&gt;Polars&lt;/code&gt; 的 &lt;code&gt;DataFrame&lt;/code&gt; 或者 &lt;code&gt;Series&lt;/code&gt; 转换为 &lt;code&gt;Arrow&lt;/code&gt;，只需使用 &lt;code&gt;.to_arrow()&lt;/code&gt; 函数。
类似的，要从 &lt;code&gt;Arrow&lt;/code&gt; 格式导入数据，可以调用 &lt;code&gt;.from_arrow()&lt;/code&gt; 函数。&lt;/p&gt;</description></item><item><title>Polars操作CSV文件</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/csv/</link><pubDate>Fri, 21 Mar 2025 10:22:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/csv/</guid><description>&lt;h1 id="polars操作csv文件"&gt;Polars操作CSV文件&lt;a class="anchor" href="#polars%e6%93%8d%e4%bd%9ccsv%e6%96%87%e4%bb%b6"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="读与写"&gt;读与写&lt;a class="anchor" href="#%e8%af%bb%e4%b8%8e%e5%86%99"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;读取CSV文件应该看起来很熟悉:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;path.csv&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CSV文件会有非常多的样式，所以一定要去看一下
&lt;a href="https://pola-rs.github.io/polars/py-polars/html/reference/api/polars.read_csv.html"&gt;&lt;code&gt;read_csv()&lt;/code&gt;&lt;/a&gt; API。&lt;/p&gt;
&lt;p&gt;写入CSV文件可以用
&lt;a href="https://pola-rs.github.io/polars/py-polars/html/reference/api/polars.DataFrame.write_csv.html"&gt;&lt;code&gt;write_csv()&lt;/code&gt;&lt;/a&gt;方法。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;bak&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;write_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;path.csv&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="扫描"&gt;扫描&lt;a class="anchor" href="#%e6%89%ab%e6%8f%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt;允许你&lt;em&gt;扫描&lt;/em&gt;CSV文件。扫描操作延迟了对文件的实际解析，
并返回一个延迟计算的容器&lt;code&gt;LazyFrame&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;path.csv&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你想了解更多这样设计的精妙之处，请移步&lt;code&gt;Polars&lt;/code&gt;&lt;a href="../../optimizations/intro.md"&gt;Optimizations&lt;/a&gt;这一章。&lt;/p&gt;</description></item><item><title>Polars表达式和上下文</title><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/expressions-and-contexts/</link><pubDate>Fri, 07 Mar 2025 10:46:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/expressions-and-contexts/</guid><description>&lt;h1 id="polars表达式和上下文"&gt;Polars表达式和上下文&lt;a class="anchor" href="#polars%e8%a1%a8%e8%be%be%e5%bc%8f%e5%92%8c%e4%b8%8a%e4%b8%8b%e6%96%87"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars开发了其专有的领域特定语言（DSL）用于转换数据。这种语言非常易于使用，能够进行复杂的查询，同时查询语句仍具有可读性。这里将介绍的表达式和上下文，对于实现这种可读性至关重要，同时它们也能让Polars查询引擎对你的查询进行优化，使其尽可能快速地运行。&lt;/p&gt;
&lt;h2 id="polars表达式"&gt;Polars表达式&lt;a class="anchor" href="#polars%e8%a1%a8%e8%be%be%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在Polars中，表达式是数据转换的一种惰性表示形式。表达式具有模块化和灵活性，这意味着你可以将它们用作构建块来构建更复杂的表达式。以下是一个Polars表达式的示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;/&lt;/span&gt; (pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;**&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正如你可能猜到的，这个表达式选取了名为“体重（weight）”的一列，并将该列的值除以“身高（height）”列中值的平方，从而计算出一个人的身体质量指数（BMI）。&lt;/p&gt;
&lt;p&gt;上面的代码表达了一种抽象的计算过程，我们可以将其保存到一个变量中，进一步进行处理，或者直接打印出来：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;bmi_expr &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;/&lt;/span&gt; (pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;**&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(bmi_expr)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;[(col(&amp;#34;weight&amp;#34;)) / (col(&amp;#34;height&amp;#34;).pow([dyn int: 2]))]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;由于表达式是惰性的，目前尚未进行任何计算。这就是我们需要上下文的原因。&lt;/p&gt;
&lt;h2 id="polars上下文"&gt;Polars上下文&lt;a class="anchor" href="#polars%e4%b8%8a%e4%b8%8b%e6%96%87"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars表达式需要在一个上下文中执行才能产生结果。根据其使用的上下文不同，同一个Polars表达式可能会产生不同的结果。在本节中，我们将了解Polars提供的四种最常见的上下文 ：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;select&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;with_columns&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;group_by&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们使用下面的dataframe来展示每种上下文是如何工作的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;from&lt;/span&gt; datetime &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; date
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;Alice Archer&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Ben Brown&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Chloe Cooper&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;Daniel Donovan&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;birthdate&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1997&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1985&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1983&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;22&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date(&lt;span style="color:#ff9f43"&gt;1981&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&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; &lt;span style="color:#5af78e"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;57.9&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;72.5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;53.6&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;83.1&lt;/span&gt;], &lt;span style="color:#78787e"&gt;# (kg)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1.56&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.77&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.65&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.75&lt;/span&gt;], &lt;span style="color:#78787e"&gt;# (m)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span 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:#ff5c57"&gt;print&lt;/span&gt;(df)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;shape: (4, 4)
┌────────────────┬────────────┬────────┬────────┐
│ name ┆ birthdate ┆ weight ┆ height │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ date ┆ f64 ┆ f64 │
╞════════════════╪════════════╪════════╪════════╡
│ Alice Archer ┆ 1997-01-10 ┆ 57.9 ┆ 1.56 │
│ Ben Brown ┆ 1985-02-15 ┆ 72.5 ┆ 1.77 │
│ Chloe Cooper ┆ 1983-03-22 ┆ 53.6 ┆ 1.65 │
│ Daniel Donovan ┆ 1981-04-30 ┆ 83.1 ┆ 1.75 │
└────────────────┴────────────┴────────┴────────┘&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="select"&gt;&lt;code&gt;select&lt;/code&gt;&lt;a class="anchor" href="#select"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;选择上下文 &lt;code&gt;select&lt;/code&gt; 会对列应用表达式。&lt;code&gt;select&lt;/code&gt; 上下文可能会生成新的列，这些新列可以是聚合结果、其他列的组合，或者是字面值：&lt;/p&gt;</description></item><item><title>第 2 章 Python 语法基础</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-02/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-02/</guid><description>&lt;h1 id="第-2-章-python-语法基础"&gt;第 2 章 Python 语法基础&lt;a class="anchor" href="#%e7%ac%ac-2-%e7%ab%a0-python-%e8%af%ad%e6%b3%95%e5%9f%ba%e7%a1%80"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;当我在 2011 年和 2012 年写作本书的第一版时，可用的学习 Python 数据分析的资源很少。这部分上是一个鸡和蛋的问题：我们现在使用的库，比如 pandas、scikit-learn 和 statsmodels，那时相对来说并不成熟。2017 年，数据科学、数据分析和机器学习的资源已经很多，原来通用的科学计算拓展到了计算机科学家、物理学家和其它研究领域的工作人员。学习 Python 和成为软件工程师的优秀书籍也有了。&lt;/p&gt;
&lt;p&gt;因为这本书是专注于 Python 数据处理的，对于一些 Python 的数据结构和库的特性难免不足。因此，本章和第 3 章的内容只够你能学习本书后面的内容。&lt;/p&gt;
&lt;p&gt;在我来看，没有必要为了数据分析而去精通 Python。我鼓励你使用 IPython shell 和 Jupyter 试验示例代码，并学习不同类型、函数和方法的文档。虽然我已尽力让本书内容循序渐进，但读者偶尔仍会碰到没有之前介绍过的内容。&lt;/p&gt;
&lt;p&gt;本书大部分内容关注的是基于表格的分析和处理大规模数据集的数据准备工具。为了使用这些工具，必须首先将混乱的数据规整为整洁的表格（或结构化）形式。幸好，Python 是一个理想的语言，可以快速整理数据。Python 使用得越熟练，越容易准备新数据集以进行分析。&lt;/p&gt;
&lt;p&gt;最好在 IPython 和 Jupyter 中亲自尝试本书中使用的工具。当你学会了如何启动 Ipython 和 Jupyter，我建议你跟随示例代码进行练习。与任何键盘驱动的操作环境一样，记住常见的命令也是学习曲线的一部分。&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;笔记：本章没有介绍 Python 的某些概念，如类和面向对象编程，你可能会发现它们在 Python 数据分析中很有用。 为了加强 Python 知识，我建议你学习&lt;a href="https://docs.python.org/3/"&gt;官方 Python 教程&lt;/a&gt;，或是通用的 Python 教程书籍，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python Cookbook，第 3 版，David Beazley 和 Brian K. Jones 著（O’Reilly）&lt;/li&gt;
&lt;li&gt;流畅的 Python，Luciano Ramalho 著（O’Reilly）&lt;/li&gt;
&lt;li&gt;高效的 Python，Brett Slatkin 著（Pearson）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;h2 id="21-python-解释器"&gt;2.1 Python 解释器&lt;a class="anchor" href="#21-python-%e8%a7%a3%e9%87%8a%e5%99%a8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python 是解释性语言。Python 解释器同一时间只能运行一个程序的一条语句。标准的交互 Python 解释器可以在命令行中通过键入&lt;code&gt;python&lt;/code&gt;命令打开：&lt;/p&gt;</description></item><item><title>安装Polars</title><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/polars_installation/</link><pubDate>Thu, 06 Mar 2025 22:13:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/polars_installation/</guid><description>&lt;h1 id="安装polars"&gt;安装Polars&lt;a class="anchor" href="#%e5%ae%89%e8%a3%85polars"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars是一个库，安装起来就像调用相应编程语言的包管理器一样简单。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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 polars
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#或者对于那些不支持高级矢量扩展指令集2（AVX2）的旧CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install polars-lts-cpu&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo add polars -F lazy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# Or Cargo.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;dependencies&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;polars&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;{&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;version&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff5c57"&gt;features&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;, ...&lt;span style="color:#ff6ac1"&gt;]}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="大索引"&gt;大索引&lt;a class="anchor" href="#%e5%a4%a7%e7%b4%a2%e5%bc%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;默认情况下，Polars dataframes的行数限制为2^32(约43亿)行。通过启用大索引扩展功能，可将此限制提升至2^64(约1800京）行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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 polars-u64-idx&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo add polars -F bigidx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# Or Cargo.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;dependencies&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;polars&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;{&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;version&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff5c57"&gt;features&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;bigidx&amp;#34;&lt;/span&gt;, ...&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="旧款cpu"&gt;旧款CPU&lt;a class="anchor" href="#%e6%97%a7%e6%ac%becpu"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在不支持高级矢量扩展指令集（&lt;a href="https://en.wikipedia.org/wiki/Advanced_Vector_Extensions"&gt;AVX&lt;/a&gt;）的旧款 CPU 上为 Python 安装 Polars，请运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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 polars-lts-cpu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="导入polars"&gt;导入polars&lt;a class="anchor" href="#%e5%af%bc%e5%85%a5polars"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要使用polars库，只需将其导入到你的项目中即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;use&lt;/span&gt; polars::prelude::&lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="特性标志"&gt;特性标志&lt;a class="anchor" href="#%e7%89%b9%e6%80%a7%e6%a0%87%e5%bf%97"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;通过使用上述命令，你可以将 Polars 的核心部分安装到你的系统上。然而，根据你的使用场景，你可能还需要安装一些可选的依赖项。将这些设置为可选的目的是尽量减少占用空间。根据编程语言的不同，相应的标志也有所不同。在整个用户指南中，当所使用的某项功能需要额外的依赖项时，将会提别提醒。&lt;/p&gt;
&lt;h3 id="python"&gt;Python&lt;a class="anchor" href="#python"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# 示例
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install &amp;#39;polars[numpy,fsspec]&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="all"&gt;All&lt;a class="anchor" href="#all"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;标志&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;all&lt;/td&gt;
 &lt;td&gt;安装所有可选的依赖项。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="gpu"&gt;GPU&lt;a class="anchor" href="#gpu"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;标志&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;gpu&lt;/td&gt;
 &lt;td&gt;在英伟达（NVIDIA）图形处理器（GPU）上运行查询。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>投影下推</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/optimizations/lazy/projection-pushdown/</link><pubDate>Fri, 21 Mar 2025 15:25:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/optimizations/lazy/projection-pushdown/</guid><description>&lt;h1 id="投影下推"&gt;投影下推&lt;a class="anchor" href="#%e6%8a%95%e5%bd%b1%e4%b8%8b%e6%8e%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;我们来把上一章节中的查询与在 Runescape （一款游戏）数据中进行 &lt;em&gt;FILTER&lt;/em&gt; 操作的结果结合起来，
来找出以字母 &lt;code&gt;a&lt;/code&gt; 开头且玩过 Runescape 的流行 Reddit 用户名。相信你一定也会对此感兴趣的！&lt;/p&gt;
&lt;p&gt;你可以构建类似于以下的查询：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;from&lt;/span&gt; ..paths &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; DATA_DIR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;reddit &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_csv(&lt;span style="color:#5af78e"&gt;f&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#5af78e"&gt;{&lt;/span&gt;DATA_DIR&lt;span style="color:#5af78e"&gt;}&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/reddit.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;comment_karma&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;link_karma&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;str&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;contains(&lt;span style="color:#5af78e"&gt;r&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;^a&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;runescape &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;data/runescape.csv&amp;#34;&lt;/span&gt;, has_header&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;False&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;select(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;column_1&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;name&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;dataset &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; reddit&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;join(runescape, on&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;, how&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;inner&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;select([&lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;comment_karma&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;link_karma&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;df1 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; dataset&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;fetch(&lt;span style="color:#ff5c57"&gt;int&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;1e7&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df2 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; dataset&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;fetch(&lt;span style="color:#ff5c57"&gt;int&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;1e7&lt;/span&gt;), predicate_pushdown&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;, projection_pushdown&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这将产出以下 DataFrame：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (0, 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌──────┬───────────────┬────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ name ┆ comment_karma ┆ link_karma │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ str ┆ i64 ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span 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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="更近一步"&gt;更近一步&lt;a class="anchor" href="#%e6%9b%b4%e8%bf%91%e4%b8%80%e6%ad%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;让我们再来看看查询计划。&lt;/p&gt;</description></item><item><title>Polars窗口函数</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/apply/window-functions/</link><pubDate>Fri, 21 Mar 2025 13:42:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/apply/window-functions/</guid><description>&lt;h1 id="polars窗口函数"&gt;Polars窗口函数&lt;a class="anchor" href="#polars%e7%aa%97%e5%8f%a3%e5%87%bd%e6%95%b0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 支持窗口函数，灵感来自于&lt;a href="https://www.postgresql.org/docs/current/tutorial-window.html"&gt;PostgreSQL&lt;/a&gt;. &lt;code&gt;Pandas&lt;/code&gt; 用户可能会将其识别为a &lt;code&gt;groupby.transform(aggregation)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 窗口函数比&lt;code&gt;Pandas&lt;/code&gt;转换（transform）函数更加优雅. 我们可以在一个表达式中的多个列上应用多个函数！&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dataset &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;fruits&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;banana&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;banana&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;banana&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;cars&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;beetle&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;audi&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;beetle&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;beetle&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;beetle&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; dataset&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum(&lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;over(&lt;span style="color:#5af78e"&gt;&amp;#34;fruits&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;fruit_sum_A&amp;#34;&lt;/span&gt;), &lt;span style="color:#78787e"&gt;# 在&amp;#34;fruits&amp;#34;列的基础上进行&amp;#34;A&amp;#34;的加和，并另起一列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;first(&lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;over(&lt;span style="color:#5af78e"&gt;&amp;#34;fruits&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;fruit_first_B&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;max(&lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;over(&lt;span style="color:#5af78e"&gt;&amp;#34;cars&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;cars_max_B&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect()&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5, 7)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬────────┬─────┬────────┬─────────────┬───────────────┬────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ A ┆ fruits ┆ B ┆ cars ┆ fruit_sum_A ┆ fruit_first_B ┆ cars_max_B │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ i64 ┆ str ┆ i64 ┆ i64 ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪════════╪═════╪════════╪═════════════╪═══════════════╪════════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ banana ┆ 5 ┆ beetle ┆ 8 ┆ 5 ┆ 5 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ banana ┆ 4 ┆ audi ┆ 8 ┆ 5 ┆ 4 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ apple ┆ 3 ┆ beetle ┆ 7 ┆ 3 ┆ 5 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 4 ┆ apple ┆ 2 ┆ beetle ┆ 7 ┆ 3 ┆ 5 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 5 ┆ banana ┆ 1 ┆ beetle ┆ 8 ┆ 5 ┆ 5 │
&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;</description></item><item><title>常用操作</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/common-manipulations/</link><pubDate>Fri, 21 Mar 2025 11:28:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/common-manipulations/</guid><description>&lt;h1 id="常用操作"&gt;常用操作&lt;a class="anchor" href="#%e5%b8%b8%e7%94%a8%e6%93%8d%e4%bd%9c"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;与许多其他数据框架库一样，Polars 提供了大量的常用函数来对 Dataframe 进行操作。
熟悉 Dataframes 的用户会发现 Polars 与 &lt;code&gt;Pandas&lt;/code&gt; 或 &lt;code&gt;R&lt;/code&gt; 的实现有许多相似之处。&lt;/p&gt;
&lt;h2 id="添加列"&gt;添加列&lt;a class="anchor" href="#%e6%b7%bb%e5%8a%a0%e5%88%97"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series([&lt;span style="color:#5af78e"&gt;&amp;#34;p&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;q&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;s&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;])&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;e&amp;#34;&lt;/span&gt;)) &lt;span style="color:#78787e"&gt;# .alias方法增加一列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5, 5)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌──────┬──────┬──────────┬─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b ┆ c ┆ d ┆ 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;│ i64 ┆ str ┆ f64 ┆ str ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞══════╪══════╪══════════╪═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ foo ┆ 0.37454 ┆ a ┆ p │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ ham ┆ 0.950714 ┆ b ┆ q │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ spam ┆ 0.731994 ┆ c ┆ r │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ null ┆ egg ┆ 0.598658 ┆ d ┆ s │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 5 ┆ null ┆ 0.156019 ┆ e ┆ t │
&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;h2 id="类型转换"&gt;类型转换&lt;a class="anchor" href="#%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这个例子使用的是 Python 数据类型，但我们也可以在 Polars &lt;code&gt;dtypes&lt;/code&gt;
（如 &lt;code&gt;pl.Float32&lt;/code&gt;、&lt;code&gt;pl.Float64&lt;/code&gt;）之间进行转换。&lt;/p&gt;</description></item><item><title>时间戳</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/data/timestamps/</link><pubDate>Fri, 21 Mar 2025 11:27:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/data/timestamps/</guid><description>&lt;h1 id="时间戳"&gt;时间戳&lt;a class="anchor" href="#%e6%97%b6%e9%97%b4%e6%88%b3"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 提供了&lt;code&gt;4&lt;/code&gt;时间数据类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pl.Date&lt;/code&gt;, 用于&lt;strong&gt;日期&lt;/strong&gt;对象：自UNIX纪元以来的天数，为32位有符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pl.Datetime&lt;/code&gt;, 用于&lt;strong&gt;datetime&lt;/strong&gt;项目：自UNIX纪元以来的纳秒数，为64位有符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pl.Time&lt;/code&gt;, 编码为午夜后的纳秒数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 字符串(&lt;code&gt;pl.Utf8&lt;/code&gt;) 数据类型可以解析为它们中的任何一个。您可以让&lt;code&gt;Polars&lt;/code&gt;尝试猜测日期[time]的格式，或者显式提供&lt;code&gt;fmt&lt;/code&gt;规则。&lt;/p&gt;
&lt;p&gt;举例来说（查看此&lt;a href="https://strftime.org/"&gt;此链接&lt;/a&gt;以获取全面列表）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;%Y-%m-%d&amp;quot;&lt;/code&gt; 对于 &lt;code&gt;&amp;quot;2020-12-31&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;%Y/%B/%d&amp;quot;&lt;/code&gt; 对于 &lt;code&gt;&amp;quot;2020/December/31&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;%B %y&amp;quot;&lt;/code&gt; 对于 &lt;code&gt;&amp;quot;December 20&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是一个简单的例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dataset &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;2020-01-02&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;2020-01-03&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;2020-01-04&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&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;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; dataset&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;str&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;strptime(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Date, &lt;span style="color:#5af78e"&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span style="color:#5af78e"&gt;%d&lt;/span&gt;&lt;span style="color:#5af78e"&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;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;返回：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌────────────┬───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ date ┆ index │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ date ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞════════════╪═══════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2020-01-02 ┆ 1 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2020-01-03 ┆ 2 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2020-01-04 ┆ 3 │
&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;p&gt;所有datetime功能都显示在 &lt;a href="POLARS_PY_REF_GUIDE/series.html#timeseries#timeseries"&gt;&lt;code&gt;dt&lt;/code&gt; 命名空间&lt;/a&gt;中。&lt;/p&gt;</description></item><item><title>Numpy</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/interop/numpy/</link><pubDate>Fri, 21 Mar 2025 11:25:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/interop/numpy/</guid><description>&lt;h1 id="numpy"&gt;Numpy&lt;a class="anchor" href="#numpy"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 的 &lt;code&gt;Series&lt;/code&gt; 支持 &lt;code&gt;NumPy&lt;/code&gt; 的
&lt;a href="https://numpy.org/doc/stable/reference/ufuncs.html"&gt;通用函数 (ufuncs)&lt;/a&gt;。
调用元素层面的 (element-wise) 函数，比如 &lt;code&gt;np.exp()&lt;/code&gt;、&lt;code&gt;np.cos()&lt;/code&gt; 或 &lt;code&gt;np.div()&lt;/code&gt;，基本上没有额外开销。&lt;/p&gt;
&lt;p&gt;需要注意的是，&lt;code&gt;Polars&lt;/code&gt; 中的缺失值是一个独立的比特掩码 —— 其在 &lt;code&gt;NumPy&lt;/code&gt; 中是不可见的。
这可能导致窗口函数或 &lt;code&gt;np.convolve()&lt;/code&gt; 输出有缺陷或不完整的结果。&lt;/p&gt;
&lt;p&gt;要将一个 &lt;code&gt;Polars&lt;/code&gt; &lt;code&gt;Series&lt;/code&gt; 转换为 &lt;code&gt;NumPy&lt;/code&gt; 数组，可以调用 &lt;code&gt;.to_numpy()&lt;/code&gt; 函数。
转换时，此函数将会把缺失值替换为 &lt;code&gt;np.nan&lt;/code&gt;。如果 &lt;code&gt;Series&lt;/code&gt; 中没有缺失值，或转换后不再需要这些值，
可以使用 &lt;code&gt;.view()&lt;/code&gt; 函数作为代替，这将为数据生成一个零拷贝的 &lt;code&gt;NumPy&lt;/code&gt; 数组。&lt;/p&gt;</description></item><item><title>Polars操作Parquet文件</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/parquet/</link><pubDate>Fri, 21 Mar 2025 10:23:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/parquet/</guid><description>&lt;h1 id="parquet文件"&gt;Parquet文件&lt;a class="anchor" href="#parquet%e6%96%87%e4%bb%b6"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;加载或写入 &lt;a href="https://parquet.apache.org/"&gt;&lt;code&gt;Parquet&lt;/code&gt;文件&lt;/a&gt;快如闪电。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Pandas&lt;/code&gt; 使用 &lt;a href="https://arrow.apache.org/docs/python/"&gt;&lt;code&gt;PyArrow&lt;/code&gt;&lt;/a&gt;（用于Apache &lt;code&gt;Arrow&lt;/code&gt;的&lt;code&gt;Python&lt;/code&gt;库）将&lt;code&gt;Parquet&lt;/code&gt;数据加载到内存，但不得不将数据复制到了&lt;code&gt;Pandas&lt;/code&gt;的内存空间中。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt;就没有这部分额外的内存开销，因为读取&lt;code&gt;Parquet&lt;/code&gt;时，&lt;code&gt;Polars&lt;/code&gt;会直接复制进&lt;code&gt;Arrow&lt;/code&gt;的内存空间，且&lt;em&gt;始终使用这块内存&lt;/em&gt;。&lt;/p&gt;
&lt;h2 id="读写"&gt;读&amp;amp;写&lt;a class="anchor" href="#%e8%af%bb%e5%86%99"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_parquet(&lt;span style="color:#5af78e"&gt;&amp;#34;path.parquet&amp;#34;&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:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;bak&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;baz&amp;#34;&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;write_parquet(&lt;span style="color:#5af78e"&gt;&amp;#34;path.parquet&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="扫描"&gt;扫描&lt;a class="anchor" href="#%e6%89%ab%e6%8f%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars允许你扫描&lt;code&gt;Parquet&lt;/code&gt;输入。扫描操作延迟了对文件的实际解析，并返回一个延迟计算的容器&lt;code&gt;LazyFrame&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_parquet(&lt;span style="color:#5af78e"&gt;&amp;#34;path.parquet&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你想了解更多这样设计的精妙之处，请移步&lt;code&gt;Polars&lt;/code&gt;&lt;a href="../../optimizations/intro.md"&gt;Optimizations&lt;/a&gt;这一章。&lt;/p&gt;</description></item><item><title>Polars索引</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/indexing/</link><pubDate>Thu, 20 Mar 2025 13:22:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/indexing/</guid><description>&lt;h1 id="polars索引"&gt;Polars索引&lt;a class="anchor" href="#polars%e7%b4%a2%e5%bc%95"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; &lt;code&gt;DataFrame&lt;/code&gt;没有索引，因此索引行为可以是一致的，而不需要 &lt;code&gt;df.loc&lt;/code&gt;,
&lt;code&gt;df.iloc&lt;/code&gt;, or a &lt;code&gt;df.at&lt;/code&gt; 操作。&lt;/p&gt;
&lt;p&gt;规则如下（取决于值的数据类型）:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数值型&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;axis 0: 行（row）&lt;/li&gt;
&lt;li&gt;axis 1: 列（column）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数值型 + 字符串&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;axis 0: 行（这里只接收数字)&lt;/li&gt;
&lt;li&gt;axis 1: 列（接受数字+字符串值）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;仅字符串&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;axis 0: 列（column）&lt;/li&gt;
&lt;li&gt;axis 1: 报错（error）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;表达式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;所有表达式求值都是并行执行的&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;axis 0: 列（column）&lt;/li&gt;
&lt;li&gt;axis 1: 列（column）&lt;/li&gt;
&lt;li&gt;..&lt;/li&gt;
&lt;li&gt;axis n: 列（column）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="与pandas的对比"&gt;与Pandas的对比&lt;a class="anchor" href="#%e4%b8%8epandas%e7%9a%84%e5%af%b9%e6%af%94"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;pandas&lt;/th&gt;
 &lt;th&gt;polars&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;选择列&lt;br&gt; &lt;code&gt;df.iloc[2]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[2, :]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;按索引选择几行&lt;br&gt; &lt;code&gt;df.iloc[[2, 5, 6]]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[[2, 5, 6], :]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;选择行的切片&lt;br&gt; &lt;code&gt;df.iloc[2:6]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[2:6, :]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;使用布尔掩码（boolean mask）选择行&lt;br&gt; &lt;code&gt;df.iloc[True, True, False]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[[True, True, False]]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;按谓词（predicate）条件选择行&lt;br&gt; &lt;code&gt;df.loc[df[&amp;quot;A&amp;quot;] &amp;gt; 3]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[df[&amp;quot;A&amp;quot;] &amp;gt; 3]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;选择列的切片&lt;br&gt; &lt;code&gt;df.iloc[:, 1:3]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[:, 1:3]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;按字符串顺序选择列的切片&lt;br&gt; &lt;code&gt;df.loc[:, &amp;quot;A&amp;quot;:&amp;quot;Z&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[:, &amp;quot;A&amp;quot;:&amp;quot;Z&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;选择单个值（标量）&lt;br&gt; &lt;code&gt;df.loc[2, &amp;quot;A&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[2, &amp;quot;A&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;选择单个值（标量）&lt;br&gt; &lt;code&gt;df.iloc[2, 1]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[2, 1]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;选择单个值（Series或DataFrame）&lt;br&gt; &lt;code&gt;df.loc[2, [&amp;quot;A&amp;quot;]]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[2, [&amp;quot;A&amp;quot;]]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;选择单个值 (Series或DataFrame)&lt;br&gt; &lt;code&gt;df.iloc[2, [1]]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;df[2, [1]]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="表达式"&gt;表达式&lt;a class="anchor" href="#%e8%a1%a8%e8%be%be%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;表达式也可以用于索引（它是&lt;code&gt;df.select&lt;/code&gt;的语法糖）。&lt;/p&gt;</description></item><item><title>Polars表达式</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/expressions/</link><pubDate>Thu, 20 Mar 2025 13:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/expressions/</guid><description>&lt;h1 id="polars-表达式"&gt;Polars 表达式&lt;a class="anchor" href="#polars-%e8%a1%a8%e8%be%be%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;下面是一个表达式：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pl.col(&amp;quot;foo&amp;quot;).sort().head(2)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个表达式的意思是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选择 &lt;code&gt;foo&lt;/code&gt; 列&lt;/li&gt;
&lt;li&gt;给 &lt;code&gt;foo&lt;/code&gt; 排序&lt;/li&gt;
&lt;li&gt;然后取排序后的前两个值&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;表达式的强大之处在于：每一个表达式都会生成一个新的表达式，他们可以被串在一起。
你也可以把多个表达式放入一个 &lt;code&gt;Polars&lt;/code&gt; 的执行上下文中。&lt;/p&gt;
&lt;p&gt;比如，下面我们通过 &lt;code&gt;df.select&lt;/code&gt; 将两个表达式放在同一个执行上下文中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;select([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sort()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;head(&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;==&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum()
&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;p&gt;这里的两个表达式是并行执行的，这就意味着 &lt;code&gt;Polars&lt;/code&gt; 表达式可以&lt;strong&gt;易并行计算&lt;/strong&gt;（即无通讯并行）。
值得注意的是，每一个表达式的执行可能同时存在更多的并行。&lt;/p&gt;
&lt;h2 id="表达式举例"&gt;表达式举例&lt;a class="anchor" href="#%e8%a1%a8%e8%be%be%e5%bc%8f%e4%b8%be%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这一小节我们通过例子了解表达式。首先，创建一个数据集：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;random&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;seed(&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;) &lt;span style="color:#78787e"&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;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;nrs&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;names&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;ham&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;spam&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;egg&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;random&amp;#34;&lt;/span&gt;: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;random&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;rand(&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;groups&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;B&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(df)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5, 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌──────┬───────┬──────────┬────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ nrs ┆ names ┆ random ┆ groups │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ f64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞══════╪═══════╪══════════╪════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ foo ┆ 0.154163 ┆ A │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ ham ┆ 0.74005 ┆ A │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ spam ┆ 0.263315 ┆ B │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ null ┆ egg ┆ 0.533739 ┆ C │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 5 ┆ null ┆ 0.014575 ┆ B │
&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;p&gt;你可以通过表达式做很多事情，他们的表达能力很强以至于很多时候你有多种不同的方法得到同一个计算结果。
为了更好的理解表达式，让我们看更多的例子。&lt;/p&gt;</description></item><item><title>Polars延迟API</title><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/lazy-api/</link><pubDate>Fri, 07 Mar 2025 11:04:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/lazy-api/</guid><description>&lt;h1 id="polars延迟api"&gt;Polars延迟API&lt;a class="anchor" href="#polars%e5%bb%b6%e8%bf%9fapi"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars 支持两种操作模式：立即执行模式（eager）和延迟执行模式（lazy）。到目前为止的示例都使用了立即执行 API，在这种模式下，查询会被立即执行。而在延迟执行 API 中，查询只有在调用 &lt;code&gt;collect&lt;/code&gt; 方法时才会被求值。将执行操作推迟到最后一刻可以带来显著的性能优势，这也是为什么在大多数情况下更倾向于使用延迟执行 API。下面我们通过一个示例来演示这一点：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;docs/assets/data/iris.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df_small &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;sepal_length&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df_agg &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df_small&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;group_by(&lt;span style="color:#5af78e"&gt;&amp;#34;species&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;sepal_width&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;mean())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(df_agg)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在这个示例中，我们使用立即执行 API 来：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;读取鸢尾花&lt;a href="https://archive.ics.uci.edu/dataset/53/iris"&gt;数据集&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;根据花萼长度对数据集进行筛选。&lt;/li&gt;
&lt;li&gt;计算每个品种的花萼宽度的平均值。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每一步都会立即执行并返回中间结果。这可能非常浪费资源，因为我们可能会做一些无用功，或者加载一些未被使用的额外数据。相反，如果我们使用延迟执行 API，并在定义好所有步骤之后再等待执行，那么查询规划器就可以执行各种优化操作。在这种情况下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;谓词下推：在读取数据集时尽早应用筛选条件，这样就只读取花萼长度大于 5 的行。&lt;/li&gt;
&lt;li&gt;投影下推：在读取数据集时只选择所需的列，从而无需加载额外的列（例如，花瓣长度和花瓣宽度）。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;docs/assets/data/iris.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;sepal_length&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;group_by(&lt;span style="color:#5af78e"&gt;&amp;#34;species&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;sepal_width&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;mean())
&lt;/span&gt;&lt;/span&gt;&lt;span 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;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些优化将显著降低内存和中央处理器（CPU）的负载，从而使你能够在内存中处理更大的数据集，并且处理速度更快。一旦定义好查询，你就调用 &lt;code&gt;collect&lt;/code&gt; 方法来告知 Polars 你想要执行该查询。你可以在专门介绍&lt;a href="../lazy/index.md"&gt;延迟执行 API 的章节中&lt;/a&gt;.了解到更多相关信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;:在许多情况下，立即执行 API 实际上在底层调用了延迟执行 API，并且会立即收集结果。这样做的好处是，在查询本身的执行过程中，查询规划器仍然可以进行优化操作。&lt;/p&gt;
&lt;h2 id="何时使用哪种模式"&gt;何时使用哪种模式&lt;a class="anchor" href="#%e4%bd%95%e6%97%b6%e4%bd%bf%e7%94%a8%e5%93%aa%e7%a7%8d%e6%a8%a1%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一般来说，应该优先使用延迟执行 API，除非你对中间结果感兴趣，或者正在进行探索性工作，还不确定你的查询最终会是什么样子。&lt;/p&gt;
&lt;h2 id="预览查询计划"&gt;预览查询计划&lt;a class="anchor" href="#%e9%a2%84%e8%a7%88%e6%9f%a5%e8%af%a2%e8%ae%a1%e5%88%92"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在使用延迟执行 API 时，你可以使用 &lt;code&gt;explain&lt;/code&gt; 函数让 Polars 创建一份查询计划的描述，当你收集结果时，这份查询计划就会被执行。如果你想了解 Polars 对你的查询执行了哪些类型的优化，这个功能会很有用。我们可以让 Polars 解释一下我们上面定义的查询 &lt;code&gt;q&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff5c57"&gt;print&lt;/span&gt;(q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;explain())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;AGGREGATE
 [col(&amp;#34;sepal_width&amp;#34;).mean()] BY [col(&amp;#34;species&amp;#34;)] FROM
 simple π 3/3 [&amp;#34;sepal_width&amp;#34;, &amp;#34;species&amp;#34;, ... 1 other column]
 Csv SCAN [docs/assets/data/iris.csv]
 PROJECT 3/5 COLUMNS
 SELECTION: [(col(&amp;#34;sepal_length&amp;#34;)) &amp;gt; (5.0)]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我们可以从解释中立刻看出，Polars 确实应用了谓词下推，因为它只读取花萼长度大于 5 的行；并且它也应用了投影下推，因为它只读取查询所需的列。&lt;/p&gt;</description></item><item><title>第 3 章 Python 的数据结构、函数和文件</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-03/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-03/</guid><description>&lt;h1 id="第-3-章-python-的数据结构函数和文件"&gt;第 3 章 Python 的数据结构、函数和文件&lt;a class="anchor" href="#%e7%ac%ac-3-%e7%ab%a0-python-%e7%9a%84%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e5%87%bd%e6%95%b0%e5%92%8c%e6%96%87%e4%bb%b6"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;本章讨论 Python 的内置功能，这些功能本书会用到很多。虽然扩展库，比如 pandas 和 Numpy，使处理大数据集很方便，但它们是和 Python 的内置数据处理工具一同使用的。&lt;/p&gt;
&lt;p&gt;我们会从 Python 最基础的数据结构开始：元组、列表、字典和集合。然后会讨论创建你自己的、可重复使用的 Python 函数。最后，会学习 Python 的文件对象，以及如何与本地硬盘交互。&lt;/p&gt;
&lt;h1 id="31-数据结构和序列"&gt;3.1 数据结构和序列&lt;a class="anchor" href="#31-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e5%92%8c%e5%ba%8f%e5%88%97"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Python 的数据结构简单而强大。通晓它们才能成为熟练的 Python 程序员。&lt;/p&gt;
&lt;h2 id="元组"&gt;元组&lt;a class="anchor" href="#%e5%85%83%e7%bb%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;元组是一个固定长度，不可改变的 Python 序列对象。创建元组的最简单方式，是用逗号分隔一列值：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;]: tup &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;]: tup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;]: (&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当用复杂的表达式定义元组，最好将值放到圆括号内，如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;]: nested_tup &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; (&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;), (&lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;]: nested_tup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;]: ((&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;), (&lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用&lt;code&gt;tuple&lt;/code&gt;可以将任意序列或迭代器转换成元组：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;]: &lt;span style="color:#ff5c57"&gt;tuple&lt;/span&gt;([&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;]: (&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&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;In [&lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;]: tup &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;tuple&lt;/span&gt;(&lt;span style="color:#5af78e"&gt;&amp;#39;string&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;In [&lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;]: tup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;]: (&lt;span style="color:#5af78e"&gt;&amp;#39;s&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;i&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;g&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以用方括号访问元组中的元素。和 C、C++、JAVA 等语言一样，序列是从 0 开始的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;]: tup[&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;]: &lt;span style="color:#5af78e"&gt;&amp;#39;s&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;元组中存储的对象可能是可变对象。一旦创建了元组，元组中的对象就不能修改了：&lt;/p&gt;</description></item><item><title>其它优化</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/optimizations/lazy/other-optimizations/</link><pubDate>Fri, 21 Mar 2025 15:35:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/optimizations/lazy/other-optimizations/</guid><description>&lt;h1 id="其它优化"&gt;其它优化&lt;a class="anchor" href="#%e5%85%b6%e5%ae%83%e4%bc%98%e5%8c%96"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;除了谓词和投影下推之外，&lt;code&gt;Polars&lt;/code&gt;还进行其他优化。&lt;/p&gt;
&lt;p&gt;一个重要的主题是可选的缓存和并行化。很容易想象，有两种不同的&lt;code&gt;DataFrame&lt;/code&gt;计算会导致扫描同一个文件&lt;code&gt;Polars&lt;/code&gt;可能会缓存扫描的文件，以防止扫描同一文件两次。但是，如果您愿意，可以重写此行为并强制&lt;code&gt;Polars&lt;/code&gt;读取同一文件。这可能会更快，因为扫描可以并行进行。&lt;/p&gt;
&lt;h2 id="联结并行化"&gt;联结并行化&lt;a class="anchor" href="#%e8%81%94%e7%bb%93%e5%b9%b6%e8%a1%8c%e5%8c%96"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果我们查看上一个查询，就会发现join操作有一个输入带有&lt;code&gt;data/reddit.csv&lt;/code&gt;的计算路径作为根目录，一个路径带有&lt;code&gt;data/runescape.csv&lt;/code&gt;作为根目录。&lt;code&gt;Polars&lt;/code&gt;可以观察到两个&lt;code&gt;DataFrame&lt;/code&gt;之间没有依赖关系，将并行读取这两个文件。如果在加入之前完成了其他操作（例如groupby、filters等），它们也会并行执行。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/graph-optimized.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="简化表达式"&gt;简化表达式&lt;a class="anchor" href="#%e7%ae%80%e5%8c%96%e8%a1%a8%e8%be%be%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;其他一些优化是表达式简化。这些优化的影响比谓词和投影下推的影响小，但它们很可能加起来。你可以&lt;a href="https://github.com/pola-rs/polars/issues/139"&gt;追踪这个问题&lt;/a&gt;查看这些的最新状态。&lt;/p&gt;</description></item><item><title>聚合</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/aggregate/</link><pubDate>Fri, 21 Mar 2025 11:30:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/aggregate/</guid><description>&lt;h1 id="聚合"&gt;聚合&lt;a class="anchor" href="#%e8%81%9a%e5%90%88"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;你可以调用 &lt;code&gt;.select()&lt;/code&gt; 函数或使用 &lt;code&gt;.with_column()&lt;/code&gt;/&lt;code&gt;.with_columns()&lt;/code&gt; 上下文进行列聚合操作。&lt;/p&gt;
&lt;p&gt;要对所有列进行聚合，可以使用通配符表达式：
&lt;code&gt;.select(pl.col(&amp;quot;*&amp;quot;).sum())&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;以下面的代码为例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 扫描级导入csv数据集&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;data/reddit.csv&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;select([pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum(&lt;span style="color:#5af78e"&gt;&amp;#34;comment_karma&amp;#34;&lt;/span&gt;), pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;min(&lt;span style="color:#5af78e"&gt;&amp;#34;link_karma&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;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;fetch()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其结果为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (1, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌───────────────┬────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ comment_karma ┆ link_karma │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═══════════════╪════════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 242649 ┆ -109 │
&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;p&gt;更多内容请参见&lt;a href="POLARS_PY_REF_GUIDE/expression.html#aggregation#aggregation"&gt;表达式&lt;/a&gt; 的 API 文档。&lt;/p&gt;</description></item><item><title>分组</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/groupby/</link><pubDate>Fri, 21 Mar 2025 11:29:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/groupby/</guid><description>&lt;h1 id="分组"&gt;分组&lt;a class="anchor" href="#%e5%88%86%e7%bb%84"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="急性--惰性"&gt;急性 &amp;amp; 惰性&lt;a class="anchor" href="#%e6%80%a5%e6%80%a7--%e6%83%b0%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;分组操作的语法在两个 API 中是类似的 —— 二者中均可使用表达式。
要完成分组操作，先调用 &lt;code&gt;.groupby()&lt;/code&gt; 函数，并跟随一个 &lt;code&gt;.agg()&lt;/code&gt; 函数。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;.agg()&lt;/code&gt; 函数中，你可以对任意数量的列进行任意聚合操作。
要对所有列进行聚合，可以使用通配符表达式：
&lt;code&gt;.agg(pl.col(&amp;quot;*&amp;quot;).sum())&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;来看一个简单的（惰性）例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;scan_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;data/reddit.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;groupby(&lt;span style="color:#5af78e"&gt;&amp;#34;comment_karma&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg([pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;n_unique()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;unique_names&amp;#34;&lt;/span&gt;), pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;max(&lt;span style="color:#5af78e"&gt;&amp;#34;link_karma&amp;#34;&lt;/span&gt;)])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sort(by&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;unique_names&amp;#34;&lt;/span&gt;, descending&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;) &lt;span style="color:#78787e"&gt;# 逆序排列，reverse=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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;fetch()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这将返回下面的结果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (100, 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌───────────────┬──────────────┬────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ comment_karma ┆ unique_names ┆ link_karma │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ u32 ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═══════════════╪══════════════╪════════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 0 ┆ 367 ┆ 611 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ 9 ┆ 22 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ 6 ┆ 1 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 38 ┆ 4 ┆ 291 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ … ┆ … ┆ … │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ -5 ┆ 1 ┆ 0 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 232 ┆ 1 ┆ 47 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 835 ┆ 1 ┆ 1154 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 431 ┆ 1 ┆ 8 │
&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;</description></item><item><title>Polars处理多个文件</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/multiple_files/</link><pubDate>Fri, 21 Mar 2025 10:24:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/multiple_files/</guid><description>&lt;h2 id="处理多个文件"&gt;处理多个文件&lt;a class="anchor" href="#%e5%a4%84%e7%90%86%e5%a4%9a%e4%b8%aa%e6%96%87%e4%bb%b6"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt;可以根据您的需要和内存紧张程度，以不同的方式处理多个文件。&lt;/p&gt;
&lt;p&gt;让我们创建一些文件来使用一些上下文（context）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;ham&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;spam&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:#ff6ac1"&gt;for&lt;/span&gt; i &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;range&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;write_csv(&lt;span style="color:#5af78e"&gt;f&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;my_many_files_&lt;/span&gt;&lt;span style="color:#5af78e"&gt;{&lt;/span&gt;i&lt;span style="color:#5af78e"&gt;}&lt;/span&gt;&lt;span style="color:#5af78e"&gt;.csv&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="读入单个dataframe"&gt;读入单个&lt;code&gt;DataFrame&lt;/code&gt;&lt;a class="anchor" href="#%e8%af%bb%e5%85%a5%e5%8d%95%e4%b8%aadataframe"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要将多个文件读入一个&lt;code&gt;DataFrame&lt;/code&gt;，我们可以使用全局模式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_csv(&lt;span style="color:#5af78e"&gt;&amp;#34;my_many_files_*.csv&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(df)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (15, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬──────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ foo ┆ bar │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪══════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ null │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ ham │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ spam │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ null │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ … ┆ … │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ spam │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ null │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ ham │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ spam │
&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;p&gt;要了解这是如何工作的，我们可以看看查询计划。下面我们可以看到，所有文件都是单独读取并连接成一个&lt;code&gt;DataFrame&lt;/code&gt; 。&lt;code&gt;Polars&lt;/code&gt;将尝试将读取并行化。&lt;/p&gt;</description></item><item><title>Polars上下文</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/contexts/</link><pubDate>Fri, 21 Mar 2025 09:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/contexts/</guid><description>&lt;h1 id="polars上下文"&gt;Polars上下文&lt;a class="anchor" href="#polars%e4%b8%8a%e4%b8%8b%e6%96%87"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;表达式几乎可以在任何地方使用，但是表达式需要一个上下文，这些上下文包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选择: &lt;code&gt;df.select([..])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;分组集合: &lt;code&gt;df.groupby(..).agg([..])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;横向堆叠(hstack) 或者增加列: &lt;code&gt;df.with_columns([..])&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="语法糖"&gt;语法糖&lt;a class="anchor" href="#%e8%af%ad%e6%b3%95%e7%b3%96"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;需要上下文的主要原因是：即使在即时执行中，你也在使用 Polars 的延迟执行API。
比如如下代码实例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;groupby(&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg([pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum()])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;去掉语法糖后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;lazy()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;groupby(&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg([pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum()]))&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种设计可以让 Polars 把表达式推送给查询引擎，进行一些优化和缓存操作。&lt;/p&gt;
&lt;h2 id="select-上下文"&gt;&lt;code&gt;select&lt;/code&gt; 上下文&lt;a class="anchor" href="#select-%e4%b8%8a%e4%b8%8b%e6%96%87"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;select&lt;/code&gt; 上下文中，选择操作是按照列进行的。在选择向下文的表达式必须要返回 &lt;code&gt;Series&lt;/code&gt; 并且这些 &lt;code&gt;Series&lt;/code&gt; 需要有相同的长度或者长度为1。&lt;/p&gt;
&lt;p&gt;一个长度为 1 的 &lt;code&gt;Series&lt;/code&gt; 会将 &lt;code&gt;DataFrame&lt;/code&gt; 的一列赋予完全一样的值(这个值来自&lt;code&gt;Series&lt;/code&gt;)。
注意，&lt;code&gt;select&lt;/code&gt; 可能会返回一个新的列，这个列可能是一些聚合的结果、一些表达式的组合或者常量。&lt;/p&gt;
&lt;h4 id="选择上下文"&gt;选择上下文&lt;a class="anchor" href="#%e9%80%89%e6%8b%a9%e4%b8%8a%e4%b8%8b%e6%96%87"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;select(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum(&lt;span style="color:#5af78e"&gt;&amp;#34;nrs&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;names&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sort(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;names&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;first()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;first name&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;mean(&lt;span style="color:#5af78e"&gt;&amp;#34;nrs&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;10xnrs&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:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5, 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬───────┬────────────┬────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ nrs ┆ names ┆ first name ┆ 10xnrs │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ str ┆ f64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═══════╪════════════╪════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 11 ┆ null ┆ foo ┆ 27.5 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 11 ┆ egg ┆ foo ┆ 27.5 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 11 ┆ foo ┆ foo ┆ 27.5 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 11 ┆ ham ┆ foo ┆ 27.5 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 11 ┆ spam ┆ foo ┆ 27.5 │
&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;p&gt;&lt;strong&gt;添加列&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Polars数据类型</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/datatypes/</link><pubDate>Thu, 20 Mar 2025 13:22:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/datatypes/</guid><description>&lt;h1 id="polars数据类型"&gt;Polars数据类型&lt;a class="anchor" href="#polars%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt;完全基于&lt;code&gt;Arrow&lt;/code&gt;数据类型，并由&lt;code&gt;Arrow&lt;/code&gt;内存阵列支持。这使得数据处理缓存效率高，支持进程间通信。大多数数据类型遵循确切的实现来自&lt;code&gt;Arrow&lt;/code&gt;，除了&lt;code&gt;Utf8&lt;/code&gt;（实际上是&lt;code&gt;LargeUtf8&lt;/code&gt;）、&lt;code&gt;category&lt;/code&gt;和&lt;code&gt;Object&lt;/code&gt;（支持有限）。&lt;/p&gt;
&lt;p&gt;这些数据类型是:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Int8&lt;/code&gt;: 8位有符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Int16&lt;/code&gt;: 16位有符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Int32&lt;/code&gt;: 32位有符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Int64&lt;/code&gt;: 64位有符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UInt8&lt;/code&gt;: 8位有符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UInt16&lt;/code&gt;: 16位无符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UInt32&lt;/code&gt;: 32位无符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UInt64&lt;/code&gt;: 64位无符号整数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Float32&lt;/code&gt;: 32位浮点数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Float64&lt;/code&gt;: 64位浮点数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Boolean&lt;/code&gt;: 布尔型有效位压缩。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Utf8&lt;/code&gt;: 字符串数据（内部实际上是&lt;code&gt;Arrow &lt;/code&gt; &lt;code&gt;LargeUtf8&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;List&lt;/code&gt;: 列表数组包含着包含列表值的子数组和偏移数组。（这实际上是内部的&lt;code&gt;Arrow&lt;/code&gt; &lt;code&gt;LargeList&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Date&lt;/code&gt;: 日期表示，内部表示为自UNIX纪元以来的天数，由32位有符号整数编码。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Datetime&lt;/code&gt;: Datetime表示法，内部表示为自UNIX纪元以来的纳秒，由64位有符号整数编码。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Duration&lt;/code&gt;: 时间型。在减去&lt;code&gt;Date/Datetime&lt;/code&gt;时创建。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Time&lt;/code&gt;: 时间表示法，从午夜开始在内部表示为纳秒。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object&lt;/code&gt;: 受支持的有限数据类型，可以是任何值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要了解有关这些数据类型的内部表示形式的更多信息，请查看&lt;a href="https://arrow.apache.org/docs/format/Columnar.html"&gt;&lt;code&gt;Arrow&lt;/code&gt;柱状格式&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>第 4 章 NumPy 基础：数组和向量计算</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-04/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-04/</guid><description>&lt;h1 id="第-4-章-numpy-基础数组和向量计算"&gt;第 4 章 NumPy 基础：数组和向量计算&lt;a class="anchor" href="#%e7%ac%ac-4-%e7%ab%a0-numpy-%e5%9f%ba%e7%a1%80%e6%95%b0%e7%bb%84%e5%92%8c%e5%90%91%e9%87%8f%e8%ae%a1%e7%ae%97"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;NumPy（Numerical Python 的简称）是 Python 数值计算最重要的基础包。大多数提供科学计算的包都是用 NumPy 的数组作为构建基础。&lt;/p&gt;
&lt;p&gt;NumPy 的部分功能如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ndarray&lt;/code&gt;，一个具有向量算术运算和复杂广播能力的快速且节省空间的多维数组。&lt;/li&gt;
&lt;li&gt;用于对整组数据进行快速运算的标准数学函数（无需编写循环）。&lt;/li&gt;
&lt;li&gt;用于读写磁盘数据的工具以及用于操作内存映射文件的工具。&lt;/li&gt;
&lt;li&gt;线性代数、随机数生成以及傅里叶变换功能。&lt;/li&gt;
&lt;li&gt;用于集成由 C、C++、Fortran 等语言编写的代码的 C API。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于 NumPy 提供了一个简单易用的 C API，因此很容易将数据传递给由低级语言编写的外部库，外部库也能以 NumPy 数组的形式将数据返回给 Python。这个功能使 Python 成为一种包装 C/C++/Fortran 历史代码库的选择，并使被包装库拥有一个动态的、易用的接口。&lt;/p&gt;
&lt;p&gt;NumPy 本身并没有提供多么高级的数据分析功能，理解 NumPy 数组以及面向数组的计算将有助于你更加高效地使用诸如 pandas 之类的工具。因为 NumPy 是一个很大的题目，我会在附录 A 中介绍更多 NumPy 高级功能，比如广播。&lt;/p&gt;
&lt;p&gt;对于大部分数据分析应用而言，我最关注的功能主要集中在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用于数据整理和清理、子集构造和过滤、转换等快速的向量化数组运算。&lt;/li&gt;
&lt;li&gt;常用的数组算法，如排序、唯一化、集合运算等。&lt;/li&gt;
&lt;li&gt;高效的描述统计和数据聚合/摘要运算。&lt;/li&gt;
&lt;li&gt;用于异构数据集的合并/连接运算的数据对齐和关系型数据运算。&lt;/li&gt;
&lt;li&gt;将条件逻辑表述为数组表达式（而不是带有&lt;code&gt;if-elif-else&lt;/code&gt;分支的循环）。&lt;/li&gt;
&lt;li&gt;数据的分组运算（聚合、转换、函数应用等）。。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然 NumPy 提供了通用的数值数据处理的计算基础，但大多数读者可能还是想将 pandas 作为统计和分析工作的基础，尤其是处理表格数据时。pandas 还提供了一些 NumPy 所没有的领域特定的功能，如时间序列处理等。&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;笔记：Python 的面向数组计算可以追溯到 1995 年，Jim Hugunin 创建了 Numeric 库。接下来的 10 年，许多科学编程社区纷纷开始使用 Python 的数组编程，但是进入 21 世纪，库的生态系统变得碎片化了。2005 年，Travis Oliphant 从 Numeric 和 Numarray 项目整了出了 NumPy 项目，进而所有社区都集合到了这个框架下。&lt;/p&gt;</description></item><item><title>过滤</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/filter/</link><pubDate>Fri, 21 Mar 2025 11:32:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/filter/</guid><description>&lt;h1 id="过滤"&gt;过滤&lt;a class="anchor" href="#%e8%bf%87%e6%bb%a4"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="急性"&gt;急性&lt;a class="anchor" href="#%e6%80%a5%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars 的急性过滤操作与 &lt;code&gt;Pandas&lt;/code&gt; 中的非常相似。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&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;mask &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df[&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#78787e"&gt;# 谓词表达式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df[mask] &lt;span style="color:#78787e"&gt;# 谓词过滤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者用下面更符合 &lt;code&gt;Polars&lt;/code&gt; 习惯的方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="惰性"&gt;惰性&lt;a class="anchor" href="#%e6%83%b0%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;惰性过滤操作通常使用以下表达：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff6ac1"&gt;None&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&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;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect() &lt;span style="color:#78787e"&gt;# 惰性过滤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两者的结果都是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (1, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ c │
&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;</description></item><item><title>Polars读取数据库</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/read_db/</link><pubDate>Fri, 21 Mar 2025 10:24:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/read_db/</guid><description>&lt;h1 id="polars读取数据库"&gt;Polars读取数据库&lt;a class="anchor" href="#polars%e8%af%bb%e5%8f%96%e6%95%b0%e6%8d%ae%e5%ba%93"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;读取MySQL、Postgres、Sqlite、Redshift、Clickhouse&lt;/p&gt;
&lt;p&gt;从以上数据库中读取数据，请先安装&lt;code&gt;connector-x&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pip install connectorx&amp;gt;&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;0.2.0a3&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:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conn &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;postgres://username:password@server:port/database&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;query &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;SELECT * FROM foo&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;pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_sql(query, conn)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Polars分组</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/groupby/</link><pubDate>Fri, 21 Mar 2025 09:21:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/groupby/</guid><description>&lt;h1 id="polars分组"&gt;Polars分组&lt;a class="anchor" href="#polars%e5%88%86%e7%bb%84"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="多线程"&gt;多线程&lt;a class="anchor" href="#%e5%a4%9a%e7%ba%bf%e7%a8%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;处理表状数据最高效的方式就是通过“分割-处理-组合”的方式并行地进行。这样的操作正是 &lt;code&gt;Polars&lt;/code&gt; 的
分组操作的核心，也是 &lt;code&gt;Polars&lt;/code&gt; 如此高效的秘密。特别指出，分割和处理都是多线程执行的。&lt;/p&gt;
&lt;p&gt;下面的例子展示了分组操作的流程：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/split-apply-combine.svg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;对于分割阶段的哈希操作，&lt;code&gt;Polars&lt;/code&gt; 使用了无锁多线程方式，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/lock-free-hash.svg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;这样的并行操作可以让分组和联合操作非常非常高效。&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;更多解释参考 &lt;a href="https://www.ritchievink.com/blog/2021/02/28/i-wrote-one-of-the-fastest-dataframe-libraries/"&gt;这篇博客&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="不要杀死并行"&gt;不要“杀死”并行&lt;a class="anchor" href="#%e4%b8%8d%e8%a6%81%e6%9d%80%e6%ad%bb%e5%b9%b6%e8%a1%8c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;众所周知，&lt;code&gt;Python&lt;/code&gt; 慢、水平拓展不好。除了因为是解释型语言，Python 还收到全局解释器锁，GIL。
这就意味着，如果你传入一个 &lt;code&gt;lambda&lt;/code&gt; 或者 &lt;code&gt;Python&lt;/code&gt; 自定义函数，&lt;code&gt;Polars&lt;/code&gt; 速度会被限制，即
无法使用多核进行并行计算。&lt;/p&gt;
&lt;p&gt;这是个很糟糕的情况，特别我们在做 &lt;code&gt;.groupby&lt;/code&gt; 的时候会经常传入 &lt;code&gt;lambda&lt;/code&gt; 函数。虽然 &lt;code&gt;Polars&lt;/code&gt;
支持这种操作，但是请注意 Python 的限制，特别是解释器和GIL。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，&lt;code&gt;Polars&lt;/code&gt; 实现了一种非常强大的语法，在其延迟执行API和即时执行API上都有定义。&lt;/p&gt;
&lt;h2 id="polars-expressions"&gt;Polars Expressions&lt;a class="anchor" href="#polars-expressions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;刚才我们提到自定义 Python 函数会损伤并行能力，&lt;code&gt;Polars&lt;/code&gt; 提供了惰性 API 来应对这种情况。接下来
我们看看这是什么意思。&lt;/p&gt;
&lt;p&gt;我们可以从这个数据集开始：&lt;a href="https://github.com/unitedstates/congress-legislators"&gt;US congress dataset&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;from&lt;/span&gt; .dataset &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; dataset
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataset&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;groupby(&lt;span style="color:#5af78e"&gt;&amp;#34;first_name&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;count(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;gender&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;first(&lt;span style="color:#5af78e"&gt;&amp;#34;last_name&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:#ff6ac1"&gt;.&lt;/span&gt;sort(&lt;span style="color:#5af78e"&gt;&amp;#34;count&amp;#34;&lt;/span&gt;, descending&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;limit(&lt;span style="color:#ff9f43"&gt;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;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="基本聚合操作"&gt;基本聚合操作&lt;a class="anchor" href="#%e5%9f%ba%e6%9c%ac%e8%81%9a%e5%90%88%e6%93%8d%e4%bd%9c"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;你可以轻松地把多个聚合表达式放在一个 &lt;code&gt;list&lt;/code&gt; 里面，并没有数量限制，你可以任意组合你放入任何数量的表达式。
下面这段代码中我们做如下聚合操作：&lt;/p&gt;</description></item><item><title>来自Pandas</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/coming_from_pandas/</link><pubDate>Thu, 20 Mar 2025 13:22:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/coming_from_pandas/</guid><description>&lt;h1 id="来自pandas"&gt;来自Pandas&lt;a class="anchor" href="#%e6%9d%a5%e8%87%aapandas"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;如果你很熟悉&lt;code&gt;Pandas&lt;/code&gt;，那么你只需要知道一件事：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;polars != pandas&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果你的&lt;code&gt;Polars&lt;/code&gt;代码写起来很像&lt;code&gt;Pandas&lt;/code&gt;，程序也许可以运行，但是很有可能会慢于它本该有的速度。&lt;/p&gt;
&lt;p&gt;下面我们就通过几段经典&lt;code&gt;Pandas&lt;/code&gt;代码来对比同样功能的&lt;code&gt;Polars&lt;/code&gt;代码。&lt;/p&gt;
&lt;h2 id="列运算"&gt;列运算&lt;a class="anchor" href="#%e5%88%97%e8%bf%90%e7%ae%97"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="pandas"&gt;&lt;code&gt;Pandas&lt;/code&gt;&lt;a class="anchor" href="#pandas"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#78787e"&gt;# 以下代码是顺序执行的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df[&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df[&lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df[&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="polars"&gt;&lt;code&gt;Polars&lt;/code&gt;&lt;a class="anchor" href="#polars"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#78787e"&gt;# 以下代码是并发执行的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_columns([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;100&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;c&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="基于判定的列运算"&gt;基于判定的列运算&lt;a class="anchor" href="#%e5%9f%ba%e4%ba%8e%e5%88%a4%e5%ae%9a%e7%9a%84%e5%88%97%e8%bf%90%e7%ae%97"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id="pandas-1"&gt;&lt;code&gt;Pandas&lt;/code&gt;&lt;a class="anchor" href="#pandas-1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;loc[df[&lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;==&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;loc[df[&lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;==&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="polars-1"&gt;&lt;code&gt;Polars&lt;/code&gt;&lt;a class="anchor" href="#polars-1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;with_column(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;when(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;==&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;then(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;otherwise(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;))&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;a&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意，&lt;code&gt;Polars&lt;/code&gt;的方式更“干净”，因而原始&lt;code&gt;DataFrame&lt;/code&gt;中的数据并没有被修改。并且，&lt;code&gt;mask&lt;/code&gt;（掩膜）也不像在&lt;code&gt;Pandas&lt;/code&gt;中那样被计算了两次。&lt;/p&gt;
&lt;p&gt;当然，你可以在&lt;code&gt;Pandas&lt;/code&gt;中防止原始&lt;code&gt;DataFrame&lt;/code&gt;中的数据在这一步被修改，但这需要借助临时变量。&lt;/p&gt;
&lt;p&gt;另外，&lt;code&gt;Polars&lt;/code&gt;能并行计算每一个 &lt;code&gt;if -&amp;gt; then -&amp;gt; otherwise&lt;/code&gt;的分支。当分支的计算复杂度提高时，就能体现并行计算的优势了。&lt;/p&gt;
&lt;h2 id="筛选"&gt;筛选&lt;a class="anchor" href="#%e7%ad%9b%e9%80%89"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="pandas-2"&gt;&lt;code&gt;Pandas&lt;/code&gt;&lt;a class="anchor" href="#pandas-2"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;loc[(df[&lt;span style="color:#5af78e"&gt;&amp;#39;sqft_living&amp;#39;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2500&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;amp;&lt;/span&gt; (df[&lt;span style="color:#5af78e"&gt;&amp;#39;price&amp;#39;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;300000&lt;/span&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="polars-2"&gt;&lt;code&gt;Polars&lt;/code&gt;&lt;a class="anchor" href="#polars-2"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;filter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;m2_living&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2500&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;amp;&lt;/span&gt; (pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;price&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;300000&lt;/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;blockquote class='book-hint '&gt;
&lt;p&gt;PS: 这部分内容还在建设中，内容有缺少？欢迎提交PR!&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="没有索引列"&gt;没有索引列&lt;a class="anchor" href="#%e6%b2%a1%e6%9c%89%e7%b4%a2%e5%bc%95%e5%88%97"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;根本不需要索引列！没有索引列会让处理变得更简单。如果你不相信来说服我们吧!&lt;/p&gt;
&lt;h2 id="pandas重塑"&gt;Pandas重塑&lt;a class="anchor" href="#pandas%e9%87%8d%e5%a1%91"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在&lt;code&gt;Pandas&lt;/code&gt;文档中演示了一种聚合操作 &lt;code&gt;transform&lt;/code&gt;（重塑）：&lt;/p&gt;
&lt;h3 id="pandas-3"&gt;&lt;code&gt;Pandas&lt;/code&gt;&lt;a class="anchor" href="#pandas-3"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;m&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;m&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;m&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;n&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;df[&lt;span style="color:#5af78e"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;groupby(&lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;)[&lt;span style="color:#5af78e"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;]&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;transform(&lt;span style="color:#ff5c57"&gt;len&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用&lt;code&gt;Pandas&lt;/code&gt; 要先聚合&lt;code&gt;&amp;quot;c&amp;quot;&lt;/code&gt;列、截取出&lt;code&gt;&amp;quot;type&amp;quot;&lt;/code&gt;列、计算组的&lt;code&gt;长度&lt;/code&gt;，最后将结果拼接回原始&lt;code&gt;DataFrame&lt;/code&gt;中。&lt;/p&gt;
&lt;p&gt;其结果是:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; c type size
0 1 m 3
1 1 n 3
2 1 o 3
3 2 m 4
4 2 m 4
5 2 n 4
6 2 n 4&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="polars-3"&gt;&lt;code&gt;Polars&lt;/code&gt;&lt;a class="anchor" href="#polars-3"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;Polars&lt;/code&gt;中可以用 &lt;code&gt;窗口&lt;/code&gt; 函数来达到相同的目的。&lt;/p&gt;</description></item><item><title>第 5 章 Pandas 入门</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-05/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-05/</guid><description>&lt;h1 id="第-5-章-pandas-入门"&gt;第 5 章 Pandas 入门&lt;a class="anchor" href="#%e7%ac%ac-5-%e7%ab%a0-pandas-%e5%85%a5%e9%97%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Pandas 是本书后续内容的首选库。它含有使数据清洗和分析工作变得更快更简单的数据结构和操作工具。pandas 经常和其它工具一同使用，如数值计算工具 NumPy 和 SciPy，分析库 statsmodels 和 scikit-learn，和数据可视化库 matplotlib。pandas 是基于 NumPy 数组构建的，特别是基于数组的函数和不使用&lt;code&gt;for&lt;/code&gt;循环的数据处理。&lt;/p&gt;
&lt;p&gt;虽然 pandas 采用了大量的 NumPy 编码风格，但二者最大的不同是 pandas 是专门为处理表格和混杂数据设计的。而 NumPy 更适合处理统一的数值数组数据。&lt;/p&gt;
&lt;p&gt;自从 2010 年 pandas 开源以来，pandas 逐渐成长为一个非常大的库，应用于许多真实案例。开发者社区已经有了 800 个独立的贡献者，他们在解决日常数据问题的同时为这个项目提供贡献。&lt;/p&gt;
&lt;p&gt;在本书后续部分中，我将使用下面这样的 pandas 引入约定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; pandas &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;因此，只要你在代码中看到 pd.，就得想到这是 pandas。因为&lt;code&gt;Series&lt;/code&gt;和&lt;code&gt;DataFrame&lt;/code&gt;用的次数非常多，所以将其引入本地命名空间中会更方便：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;from&lt;/span&gt; pandas &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; Series, DataFrame&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="51-pandas-的数据结构介绍"&gt;5.1 pandas 的数据结构介绍&lt;a class="anchor" href="#51-pandas-%e7%9a%84%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%bb%8b%e7%bb%8d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要使用 pandas，你首先就得熟悉它的两个主要数据结构：&lt;code&gt;Series&lt;/code&gt;和&lt;code&gt;DataFrame&lt;/code&gt;。虽然它们并不能解决所有问题，但它们为大多数应用提供了一种可靠的、易于使用的基础。&lt;/p&gt;
&lt;h2 id="series"&gt;&lt;code&gt;Series&lt;/code&gt;&lt;a class="anchor" href="#series"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Series&lt;/code&gt;是一种类似于一维数组的对象，它由一组数据（各种 NumPy 数据类型）以及一组与之相关的数据标签（即索引）组成。仅由一组数据即可产生最简单的&lt;code&gt;Series&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: obj &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series([&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&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;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: obj
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: int64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Series&lt;/code&gt;的字符串表现形式为：索引在左边，值在右边。由于我们没有为数据指定索引，于是会自动创建一个 0 到&lt;code&gt;N-1&lt;/code&gt;（&lt;code&gt;N&lt;/code&gt;为数据的长度）的整数型索引。你可以通过&lt;code&gt;Series&lt;/code&gt;的&lt;code&gt;values&lt;/code&gt;和&lt;code&gt;index&lt;/code&gt;属性获取其数组表示形式和索引对象：&lt;/p&gt;</description></item><item><title>连接</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/join/</link><pubDate>Fri, 21 Mar 2025 11:33:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/join/</guid><description>&lt;h1 id="连接"&gt;连接&lt;a class="anchor" href="#%e8%bf%9e%e6%8e%a5"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;类似于其他数据框架库，Polars 支持一系列连接操作。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在单个或多个列上进行连接&lt;/li&gt;
&lt;li&gt;左连接&lt;/li&gt;
&lt;li&gt;内连接&lt;/li&gt;
&lt;li&gt;外连接&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="数据集"&gt;数据集&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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_a &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&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;df_b &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;ham&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;let&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;var&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;const&amp;#34;&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(df_a)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (4, 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b ┆ 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;│ i64 ┆ str ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a ┆ 0 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ b ┆ 1 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 2 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 3 │
&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;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff5c57"&gt;print&lt;/span&gt;(df_b)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┬───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ foo ┆ bar ┆ ham │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╪═══════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a ┆ let │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ var │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ const │
&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;h2 id="急性"&gt;急性&lt;a class="anchor" href="#%e6%80%a5%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df_a&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;join(df_b, left_on&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;], right_on&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;], how&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (6, 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┬─────┬───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b ┆ c ┆ ham │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╪═════╪═══════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a ┆ 0 ┆ let │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ b ┆ 1 ┆ null │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 2 ┆ var │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 2 ┆ const │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 3 ┆ var │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 3 ┆ const │
&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;h2 id="惰性"&gt;惰性&lt;a class="anchor" href="#%e6%83%b0%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df_a&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;join(df_b&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy(), left_on&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, right_on&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, how&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;outer&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (10, 5)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┬─────┬──────┬───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b ┆ c ┆ bar ┆ ham │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ i64 ┆ str ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╪═════╪══════╪═══════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a ┆ 0 ┆ a ┆ let │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a ┆ 0 ┆ c ┆ var │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a ┆ 0 ┆ c ┆ const │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ b ┆ 1 ┆ null ┆ null │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ … ┆ … ┆ … ┆ … ┆ … │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 2 ┆ c ┆ const │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 3 ┆ a ┆ let │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 3 ┆ c ┆ var │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ c ┆ 3 ┆ c ┆ const │
&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;</description></item><item><title>Polars与AWS交互</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/aws/</link><pubDate>Fri, 21 Mar 2025 10:25:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/aws/</guid><description>&lt;h1 id="polars与aws交互"&gt;Polars与AWS交互&lt;a class="anchor" href="#polars%e4%b8%8eaws%e4%ba%a4%e4%ba%92"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;要读取或写入AWS存储桶，需要额外的依赖项：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pip install s3fs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在接下来的几个片段中，我们将演示如何与&lt;code&gt;Parquet&lt;/code&gt;文件交互位于AWS桶上。&lt;/p&gt;
&lt;h2 id="读入"&gt;读入&lt;a class="anchor" href="#%e8%af%bb%e5%85%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用如下加载一个&lt;code&gt;.parquet&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; pyarrow.parquet &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pq
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; s3fs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fs &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; s3fs&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;S3FileSystem()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bucket &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;&amp;lt;YOUR_BUCKET&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;path &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;&amp;lt;YOUR_PATH&amp;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;dataset &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pq&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;ParquetDataset(&lt;span style="color:#5af78e"&gt;f&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;s3://&lt;/span&gt;&lt;span style="color:#5af78e"&gt;{&lt;/span&gt;bucket&lt;span style="color:#5af78e"&gt;}&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/&lt;/span&gt;&lt;span style="color:#5af78e"&gt;{&lt;/span&gt;path&lt;span style="color:#5af78e"&gt;}&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;&lt;/span&gt;, filesystem&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;fs)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;from_arrow(dataset&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Polars折叠</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/folds/</link><pubDate>Fri, 21 Mar 2025 09:21:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/folds/</guid><description>&lt;h1 id="polars折叠"&gt;Polars折叠&lt;a class="anchor" href="#polars%e6%8a%98%e5%8f%a0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 提供了横向表达式或者方法，比如&lt;a href="POLARS_PY_REF_GUIDE/api/polars.DataFrame.sum.html"&gt;&lt;code&gt;sum&lt;/code&gt;&lt;/a&gt;,
&lt;a href="POLARS_PY_REF_GUIDE/api/polars.DataFrame.min.html"&gt;&lt;code&gt;min&lt;/code&gt;&lt;/a&gt;, &lt;a href="POLARS_PY_REF_GUIDE/api/polars.DataFrame.mean.html"&gt;&lt;code&gt;mean&lt;/code&gt;&lt;/a&gt; 等等，
我们只需要设置 &lt;code&gt;axis=1&lt;/code&gt; 即可实现横向聚合。但是，当我们需要复杂的聚合模式时，&lt;code&gt;Polars&lt;/code&gt; 提供的基本函数可能不能胜任，这时候我们需要 &lt;code&gt;fold&lt;/code&gt; 函数。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fold&lt;/code&gt; 函数在列方向的性能最佳，它很好的利用了数据的内存格局，通常还会伴随向量化操作。&lt;/p&gt;
&lt;p&gt;让我们通过里一个例子看看如何受使用 &lt;code&gt;fold&lt;/code&gt; 实现 &lt;code&gt;sum&lt;/code&gt; 函数。&lt;/p&gt;
&lt;h2 id="手工-sum"&gt;手工 &lt;code&gt;sum&lt;/code&gt;&lt;a class="anchor" href="#%e6%89%8b%e5%b7%a5-sum"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;20&lt;/span&gt;, &lt;span style="color:#ff9f43"&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;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;select(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;fold(acc&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lit(&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;), function&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;lambda&lt;/span&gt; acc, x: acc &lt;span style="color:#ff6ac1"&gt;+&lt;/span&gt; x, exprs&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;))&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;sum&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:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 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;│ sum │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 11 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 22 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 33 │
&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;p&gt;上面的例子中，函数 &lt;code&gt;f(acc, x) -&amp;gt; acc&lt;/code&gt; 被反复调用并把结果累加到 &lt;code&gt;acc&lt;/code&gt; 变量，最终把结果放入 x 列。
这个函数按照列执行，并且充分利用了缓存和向量化操作。&lt;/p&gt;</description></item><item><title>来自ApacheSpark</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/coming_from_spark/</link><pubDate>Thu, 20 Mar 2025 13:22:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/coming_from_spark/</guid><description>&lt;h1 id="来自apachespark"&gt;来自ApacheSpark&lt;a class="anchor" href="#%e6%9d%a5%e8%87%aaapachespark"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="基于列的方法-vs-基于行的方法"&gt;基于列的方法 vs. 基于行的方法&lt;a class="anchor" href="#%e5%9f%ba%e4%ba%8e%e5%88%97%e7%9a%84%e6%96%b9%e6%b3%95-vs-%e5%9f%ba%e4%ba%8e%e8%a1%8c%e7%9a%84%e6%96%b9%e6%b3%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Spark&lt;/code&gt; &lt;code&gt;DataFrame&lt;/code&gt; 类似于一个行的集合，而 &lt;code&gt;Polars&lt;/code&gt; &lt;code&gt;DataFrame&lt;/code&gt; 更接近于一个列的集合。这意味着你可以在 &lt;code&gt;Polars&lt;/code&gt; 中以 &lt;code&gt;Spark&lt;/code&gt; 中不可能的方式组合列，因为 &lt;code&gt;Spark&lt;/code&gt; 保留了每一行中的数据关系。&lt;/p&gt;
&lt;p&gt;考虑下面这个样本数据集。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;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;dfs &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; spark&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;createDataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;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; schema&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;bar&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="案例-1-合并-head-与-sum"&gt;案例 1: 合并 &lt;code&gt;head&lt;/code&gt; 与 &lt;code&gt;sum&lt;/code&gt;&lt;a class="anchor" href="#%e6%a1%88%e4%be%8b-1-%e5%90%88%e5%b9%b6-head-%e4%b8%8e-sum"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;Polars&lt;/code&gt; 中你可以写出下面的语句：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;select([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sort()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;head(&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;filter(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;==&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sum()
&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;p&gt;该代码段输出:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;shape: (2, 2)
┌─────┬─────┐
│ foo ┆ bar │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════╪═════╡
│ a ┆ 9 │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ b ┆ 9 │
└─────┴─────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;列 &lt;code&gt;foo&lt;/code&gt; 和 &lt;code&gt;bar&lt;/code&gt; 上的表达式是完全独立的。由于 &lt;code&gt;bar&lt;/code&gt; 上的表达式返回一个单一的值，这个值在 &lt;code&gt;foo&lt;/code&gt; 表达式输出的每个值中都会重复，但是 &lt;code&gt;a&lt;/code&gt; 和 &lt;code&gt;b&lt;/code&gt; 与产生 &lt;code&gt;9&lt;/code&gt; 没有关系。&lt;/p&gt;</description></item><item><title>第 6 章 数据加载、存储与文件格式</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-06/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-06/</guid><description>&lt;h1 id="第-6-章-数据加载存储与文件格式"&gt;第 6 章 数据加载、存储与文件格式&lt;a class="anchor" href="#%e7%ac%ac-6-%e7%ab%a0-%e6%95%b0%e6%8d%ae%e5%8a%a0%e8%bd%bd%e5%ad%98%e5%82%a8%e4%b8%8e%e6%96%87%e4%bb%b6%e6%a0%bc%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;访问数据是使用本书所介绍的这些工具的第一步。我会着重介绍 pandas 的数据输入与输出，虽然别的库中也有不少以此为目的的工具。&lt;/p&gt;
&lt;p&gt;输入输出通常可以划分为几个大类：读取文本文件和其他更高效的磁盘存储格式，加载数据库中的数据，利用 Web API 操作网络资源。&lt;/p&gt;
&lt;h2 id="61-读写文本格式的数据"&gt;6.1 读写文本格式的数据&lt;a class="anchor" href="#61-%e8%af%bb%e5%86%99%e6%96%87%e6%9c%ac%e6%a0%bc%e5%bc%8f%e7%9a%84%e6%95%b0%e6%8d%ae"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;pandas 提供了一些用于将表格型数据读取为&lt;code&gt;DataFrame&lt;/code&gt;对象的函数。表 6-1 对它们进行了总结，其中&lt;code&gt;read_csv&lt;/code&gt;和&lt;code&gt;read_table&lt;/code&gt;可能会是你今后用得最多的。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;函数&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;read_csv&lt;/td&gt;
 &lt;td&gt;从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_table&lt;/td&gt;
 &lt;td&gt;从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(&amp;rsquo;\t')&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_fwf&lt;/td&gt;
 &lt;td&gt;读取定宽列格式数据(也就是说没有分隔符)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_clipboard&lt;/td&gt;
 &lt;td&gt;读取剪贴板中的数据，可以看做read table的剪贴板版。将网页转换为表格时很有用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_excel&lt;/td&gt;
 &lt;td&gt;从 Excel XLS 或 XLSX读取表格数据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_hdf&lt;/td&gt;
 &lt;td&gt;读取 pandas 写的 HDF5 文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_html&lt;/td&gt;
 &lt;td&gt;读取 HTMI 文档中的所有表格&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_json&lt;/td&gt;
 &lt;td&gt;读取 JSON (JavaScript Object Notation)字符串中的数据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_msgpack&lt;/td&gt;
 &lt;td&gt;二进制格式编码的 pandas 数据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_pickle&lt;/td&gt;
 &lt;td&gt;读取 Python pickle格式中存储的任意对象&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_sas&lt;/td&gt;
 &lt;td&gt;读取存储于 SAS 系统自定义存储格式的 SAS 数据集&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_sql&lt;/td&gt;
 &lt;td&gt;使用 SQLAlchemy读取 SQL查询结果为 pandas 的 DataFrame&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_stata&lt;/td&gt;
 &lt;td&gt;读取 Stata 文件格式的数据集&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;read_feather&lt;/td&gt;
 &lt;td&gt;读取 Feather 二进制文件格式&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我将大致介绍一下这些函数在将文本数据转换为&lt;code&gt;DataFrame&lt;/code&gt;时所用到的一些技术。这些函数的选项可以划分为以下几个大类：&lt;/p&gt;</description></item><item><title>重塑</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/melt/</link><pubDate>Fri, 21 Mar 2025 11:35:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/melt/</guid><description>&lt;h1 id="重塑"&gt;重塑&lt;a class="anchor" href="#%e9%87%8d%e5%a1%91"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;重塑操作将一个宽格式的 DataFrame 逆透视为长格式。&lt;/p&gt;
&lt;h2 id="数据集"&gt;数据集&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;D&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(df)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┬─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ A ┆ B ┆ C ┆ D │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ str ┆ i64 ┆ i64 ┆ i64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╪═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ 1 ┆ 10 ┆ 2 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ b ┆ 3 ┆ 11 ┆ 4 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ 5 ┆ 12 ┆ 6 │
&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;h2 id="急性--惰性"&gt;急性 + 惰性&lt;a class="anchor" href="#%e6%80%a5%e6%80%a7--%e6%83%b0%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;急性&lt;/code&gt; 与 &lt;code&gt;惰性&lt;/code&gt; 操作的 API 相同。&lt;/p&gt;</description></item><item><title>Polars与Google BigQuery交互</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/google-big-query/</link><pubDate>Fri, 21 Mar 2025 11:16:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/google-big-query/</guid><description>&lt;h1 id="polars与google-bigquery交互"&gt;Polars与Google BigQuery交互&lt;a class="anchor" href="#polars%e4%b8%8egoogle-bigquery%e4%ba%a4%e4%ba%92"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;读写BigQuery数据库，需要额外依赖项：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pip install google-cloud-bigquery&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="读取"&gt;读取&lt;a class="anchor" href="#%e8%af%bb%e5%8f%96"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从BigQuery查询并得到&lt;code&gt;DataFrame&lt;/code&gt;，可以像这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;from&lt;/span&gt; google.cloud &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; bigquery
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; bigquery&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Client()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 执行查询&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;QUERY &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#39;SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#39;WHERE state = &amp;#34;TX&amp;#34; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#39;LIMIT 100&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;query_job &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; client&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;query(QUERY) &lt;span style="color:#78787e"&gt;# API 请求&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rows &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; query_job&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;result() &lt;span style="color:#78787e"&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;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;from_arrow(rows&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;to_arrow())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="写入"&gt;写入&lt;a class="anchor" href="#%e5%86%99%e5%85%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;from&lt;/span&gt; google.cloud &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; bigquery
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; bigquery&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Client()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;with&lt;/span&gt; io&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;BytesIO() &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; stream:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;write_parquet(stream)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stream&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;seek(&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; client&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;load_table_from_file(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stream,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destination&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#39;tablename&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; project&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#39;projectname&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; job_config&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;bigquery&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;LoadJobConfig(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source_format&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;bigquery&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;SourceFormat&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;PARQUET,
&lt;/span&gt;&lt;/span&gt;&lt;span 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;job&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;result() &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Polars自定义函数</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/custom_functions/</link><pubDate>Fri, 21 Mar 2025 09:21:39 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/custom_functions/</guid><description>&lt;h1 id="polars自定义函数"&gt;Polars自定义函数&lt;a class="anchor" href="#polars%e8%87%aa%e5%ae%9a%e4%b9%89%e5%87%bd%e6%95%b0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;现在你应该相信，polar表达式是如此的强大和灵活，以至于对自定义python函数的需求比你在其他库中可能需要的要少得多。&lt;/p&gt;
&lt;p&gt;尽管如此，你仍然需要有能力将表达式传递给第三方库，或者将你的黑匣子函数应用于polar数据。&lt;/p&gt;
&lt;p&gt;为此，我们提供了以下几种表达式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;map&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apply&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="map"&gt;map&lt;a class="anchor" href="#map"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在操作方式上和最终向用户传递的数据上，&lt;code&gt;map&lt;/code&gt;和&lt;code&gt;apply&lt;/code&gt;函数有重要的区别。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt;函数将表达式所支持的&lt;code&gt;Series&lt;/code&gt;数据原封不动的传递。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt;函数在&lt;code&gt;select&lt;/code&gt;和&lt;code&gt;groupby&lt;/code&gt;中遵循相同的规则，这将意味着&lt;code&gt;Series&lt;/code&gt;代表&lt;code&gt;DataFrame&lt;/code&gt;中的一个列。注意，在&lt;code&gt;groupby&lt;/code&gt;情况下，该列还没有被分组！&lt;/p&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt;函数的用法是将表达式中的&lt;code&gt;Series&lt;/code&gt;传递给第三方库。下面我们展示了如何使用&lt;code&gt;map&lt;/code&gt;将一个表达式列传递给神经网络模型。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;.&lt;/span&gt;with_column([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;features&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;map(&lt;span style="color:#ff6ac1"&gt;lambda&lt;/span&gt; s: MyNeuralNetwork&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;forward(s&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;to_numpy()))&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;activations&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在&lt;code&gt;groupby&lt;/code&gt;中，&lt;code&gt;map&lt;/code&gt;的使用情况很有限。它们只用于性能方面，但很容易导致不正确的结果。让我们来解释一下原因。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;keys&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;, &lt;span style="color:#ff9f43"&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;groupby(&lt;span style="color:#5af78e"&gt;&amp;#34;keys&amp;#34;&lt;/span&gt;, maintain_order&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;agg(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;values&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;map(&lt;span style="color:#ff6ac1"&gt;lambda&lt;/span&gt; s: s&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;shift())&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;shift_map&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;values&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;shift()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;alias(&lt;span style="color:#5af78e"&gt;&amp;#34;shift_expression&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:#ff5c57"&gt;print&lt;/span&gt;(df)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;┌──────┬────────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;│&lt;/span&gt; keys &lt;span style="color:#ff5c57"&gt;┆&lt;/span&gt; values &lt;span style="color:#ff5c57"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;│&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;---&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;┆&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;---&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;│&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;str&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;┆&lt;/span&gt; i64 &lt;span style="color:#ff5c57"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;╞══════╪════════╡&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;│&lt;/span&gt; a &lt;span style="color:#ff5c57"&gt;┆&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;│&lt;/span&gt; a &lt;span style="color:#ff5c57"&gt;┆&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;7&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;│&lt;/span&gt; b &lt;span style="color:#ff5c57"&gt;┆&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;└──────┴────────┘&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上面的片段中，我们按&lt;code&gt;&amp;quot;keys&amp;quot;&lt;/code&gt;列分组。这意味着我们有以下几个组。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&amp;gt;&lt;/span&gt; [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&amp;gt;&lt;/span&gt; [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果我们再向右应用一个&lt;code&gt;shift&lt;/code&gt;操作，我们就会发现。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&amp;gt;&lt;/span&gt; [null, &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&amp;gt;&lt;/span&gt; [null]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，让我们打印一下得到的结果：&lt;/p&gt;</description></item><item><title>第 7 章 数据清洗和准备</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-07/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-07/</guid><description>&lt;h1 id="第-7-章-数据清洗和准备"&gt;第 7 章 数据清洗和准备&lt;a class="anchor" href="#%e7%ac%ac-7-%e7%ab%a0-%e6%95%b0%e6%8d%ae%e6%b8%85%e6%b4%97%e5%92%8c%e5%87%86%e5%a4%87"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;在数据分析和建模的过程中，相当多的时间要用在数据准备上：加载、清理、转换以及重塑。这些工作会占到分析师时间的 80%或更多。有时，存储在文件和数据库中的数据的格式不适合某个特定的任务。许多研究者都选择使用通用编程语言（如 Python、Perl、R 或 Java）或 UNIX 文本处理工具（如&lt;code&gt;sed&lt;/code&gt;或&lt;code&gt;awk&lt;/code&gt;）对数据格式进行专门处理。幸运的是，pandas 和内置的 Python 标准库提供了一组高级的、灵活的、快速的工具，可以让你轻松地将数据规整为想要的格式。&lt;/p&gt;
&lt;p&gt;如果你发现了一种本书或 pandas 库中没有的数据操作方式，请在邮件列表或 GitHub 网站上提出。实际上，pandas 的许多设计和实现都是由真实应用的需求所驱动的。&lt;/p&gt;
&lt;p&gt;在本章中，我会讨论处理缺失数据、重复数据、字符串操作和其它分析数据转换的工具。下一章，我会关注于用多种方法合并、重塑数据集。&lt;/p&gt;
&lt;h1 id="71-处理缺失数据"&gt;7.1 处理缺失数据&lt;a class="anchor" href="#71-%e5%a4%84%e7%90%86%e7%bc%ba%e5%a4%b1%e6%95%b0%e6%8d%ae"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;在许多数据分析工作中，缺失数据是经常发生的。pandas 的目标之一就是尽量轻松地处理缺失数据。例如，pandas 对象的所有描述性统计默认都不包括缺失数据。&lt;/p&gt;
&lt;p&gt;缺失数据在 pandas 中呈现的方式有些不完美，但对于大多数用户可以保证功能正常。对于数值数据，pandas 使用浮点值&lt;code&gt;NaN&lt;/code&gt;（Not a Number）表示缺失数据。我们称其为哨兵值，可以方便的检测出来：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: string_data &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series([&lt;span style="color:#5af78e"&gt;&amp;#39;aardvark&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;artichoke&amp;#39;&lt;/span&gt;, np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;nan, &lt;span style="color:#5af78e"&gt;&amp;#39;avocado&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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: string_data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; aardvark
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; artichoke
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; NaN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; avocado
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: &lt;span style="color:#ff5c57"&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: string_data&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;isnull()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: &lt;span style="color:#ff5c57"&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 pandas 中，我们采用了 R 语言中的惯用法，即将缺失值表示为 NA，它表示不可用（not available）。在统计应用中，NA 数据可能是不存在的数据或者虽然存在，但是没有观察到（例如，数据采集中发生了问题）。当进行数据清洗以进行分析时，最好直接对缺失数据进行分析，以判断数据采集的问题或缺失数据可能导致的偏差。&lt;/p&gt;
&lt;p&gt;Python 内置的&lt;code&gt;None&lt;/code&gt;值在对象数组中也可以作为 NA：&lt;/p&gt;</description></item><item><title>条件应用</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/conditionally-apply/</link><pubDate>Fri, 21 Mar 2025 11:42:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/conditionally-apply/</guid><description>&lt;h1 id="条件应用"&gt;条件应用&lt;a class="anchor" href="#%e6%9d%a1%e4%bb%b6%e5%ba%94%e7%94%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;要修改一个 &lt;code&gt;Series&lt;/code&gt; 或 &lt;code&gt;DataFrame&lt;/code&gt; 中的一列，需要以下两步。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基于一些谓词创建一个 &lt;code&gt;boolean&lt;/code&gt; 掩码&lt;/li&gt;
&lt;li&gt;替换掉掩码评估为 &lt;code&gt;True&lt;/code&gt; 的值&lt;/li&gt;
&lt;li&gt;（仅当惰性操作时） 定义掩码评估为 &lt;code&gt;False&lt;/code&gt; 的值&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="数据集"&gt;数据集&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 构造数据帧&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;range&amp;#34;&lt;/span&gt;: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;arange(&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;), &lt;span style="color:#5af78e"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;head()&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5, 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌───────┬──────┬───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ range ┆ left ┆ right │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═══════╪══════╪═══════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 0 ┆ foo ┆ bar │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ foo ┆ bar │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ foo ┆ bar │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ foo ┆ bar │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 4 ┆ foo ┆ bar │
&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;p&gt;我们可以使用 &lt;code&gt;.when()&lt;/code&gt;/&lt;code&gt;.then()&lt;/code&gt;/&lt;code&gt;.otherwise()&lt;/code&gt; 表达式。&lt;/p&gt;</description></item><item><title>Polars实例</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/introduction_polars/</link><pubDate>Fri, 21 Mar 2025 09:25:39 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/introduction_polars/</guid><description>&lt;h1 id="polars实例"&gt;Polars实例&lt;a class="anchor" href="#polars%e5%ae%9e%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pythondataanalysis.com/pola-rs/introduction_polars-py.ipynb"&gt;介绍 Python 版本的 polars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pythondataanalysis.com/pola-rs/introduction_polars-rs.ipynb"&gt;介绍 Rust 版本的 polars&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>第 10 章 数据聚合与分组运算</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-10/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-10/</guid><description>&lt;h1 id="第-10-章-数据聚合与分组运算"&gt;第 10 章 数据聚合与分组运算&lt;a class="anchor" href="#%e7%ac%ac-10-%e7%ab%a0-%e6%95%b0%e6%8d%ae%e8%81%9a%e5%90%88%e4%b8%8e%e5%88%86%e7%bb%84%e8%bf%90%e7%ae%97"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;对数据集进行分组并对各组应用一个函数（无论是聚合还是转换），通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后，通常就是计算分组统计或生成透视表。pandas 提供了一个灵活高效的&lt;code&gt;gruopby&lt;/code&gt;功能，它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。&lt;/p&gt;
&lt;p&gt;关系型数据库和 SQL（Structured Query Language，结构化查询语言）能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是，像 SQL 这样的查询语言所能执行的分组运算的种类很有限。在本章中你将会看到，由于 Python 和 pandas 强大的表达能力，我们可以执行复杂得多的分组运算（利用任何可以接受 pandas 对象或 NumPy 数组的函数）。在本章中，你将会学到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用一个或多个键（形式可以是函数、数组或&lt;code&gt;DataFrame&lt;/code&gt;列名）分割 pandas 对象。&lt;/li&gt;
&lt;li&gt;计算分组的概述统计，比如数量、平均值或标准差，或是用户定义的函数。&lt;/li&gt;
&lt;li&gt;应用组内转换或其他运算，如规格化、线性回归、排名或选取子集等。&lt;/li&gt;
&lt;li&gt;计算透视表或交叉表。&lt;/li&gt;
&lt;li&gt;执行分位数分析以及其它统计分组分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;笔记：对时间序列数据的聚合（&lt;code&gt;groupby&lt;/code&gt;的特殊用法之一）也称作重采样（resampling），本书将在第 11 章中单独对其进行讲解。&lt;/p&gt;
&lt;/blockquote&gt;&lt;h1 id="101-groupby机制"&gt;10.1 &lt;code&gt;GroupBy&lt;/code&gt;机制&lt;a class="anchor" href="#101-groupby%e6%9c%ba%e5%88%b6"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Hadley Wickham（许多热门 R 语言包的作者）创造了一个用于表示分组运算的术语拆分－应用－合并（split-apply-combine）。第一个阶段，pandas 对象（无论是&lt;code&gt;Series&lt;/code&gt;、&lt;code&gt;DataFrame&lt;/code&gt;还是其他的）中的数据会根据你所提供的一个或多个键被拆分（split）为多组。拆分操作是在对象的特定轴上执行的。例如，&lt;code&gt;DataFrame&lt;/code&gt;可以在其行（&lt;code&gt;axis=0&lt;/code&gt;）或列（&lt;code&gt;axis=1&lt;/code&gt;）上进行分组。然后，将一个函数应用（apply）到各个分组并产生一个新值。最后，所有这些函数的执行结果会被合并（combine）到最终的结果对象中。结果对象的形式一般取决于数据上所执行的操作。图 10-1 大致说明了一个简单的分组聚合过程。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/imgs2/7178691-e5c671e09ecf94be.png" alt="图 10-1 分组聚合演示" /&gt;&lt;/p&gt;
&lt;p&gt;分组键可以有多种形式，且类型不必相同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;列表或数组，其长度与待分组的轴一样。&lt;/li&gt;
&lt;li&gt;表示&lt;code&gt;DataFrame&lt;/code&gt;某个列名的值。&lt;/li&gt;
&lt;li&gt;字典或&lt;code&gt;Series&lt;/code&gt;，给出待分组轴上的值与分组名之间的对应关系。&lt;/li&gt;
&lt;li&gt;函数，用于处理轴索引或索引中的各个标签。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，后三种都只是快捷方式而已，其最终目的仍然是产生一组用于拆分对象的值。如果觉得这些东西看起来很抽象，不用担心，我将在本章中给出大量有关于此的示例。首先来看看下面这个非常简单的表格型数据集（以&lt;code&gt;DataFrame&lt;/code&gt;的形式）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#39;key1&amp;#39;&lt;/span&gt; : [&lt;span style="color:#5af78e"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;....&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#39;key2&amp;#39;&lt;/span&gt; : [&lt;span style="color:#5af78e"&gt;&amp;#39;one&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;two&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;one&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;two&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;one&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;....&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#39;data1&amp;#39;&lt;/span&gt; : np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;random&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;randn(&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;....&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#39;data2&amp;#39;&lt;/span&gt; : np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;random&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;randn(&lt;span style="color:#ff9f43"&gt;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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: df
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data1 data2 key1 key2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.204708&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.393406&lt;/span&gt; a one
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.478943&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.092908&lt;/span&gt; a two
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.519439&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.281746&lt;/span&gt; b one
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.555730&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.769023&lt;/span&gt; b two
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.965781&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.246435&lt;/span&gt; a one&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设你想要按&lt;code&gt;key1&lt;/code&gt;进行分组，并计算&lt;code&gt;data1&lt;/code&gt;列的平均值。实现该功能的方式有很多，而我们这里要用的是：访问&lt;code&gt;data1&lt;/code&gt;，并根据&lt;code&gt;key1&lt;/code&gt;调用&lt;code&gt;groupby&lt;/code&gt;：&lt;/p&gt;</description></item><item><title>Polars表达式方法</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/api/</link><pubDate>Fri, 21 Mar 2025 09:27:39 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/api/</guid><description>&lt;h1 id="polars表达式方法"&gt;Polars表达式方法&lt;a class="anchor" href="#polars%e8%a1%a8%e8%be%be%e5%bc%8f%e6%96%b9%e6%b3%95"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;可以在&lt;a href="POLARS_PY_REF_GUIDE/expression.html"&gt;&lt;code&gt;Expr&lt;/code&gt;&lt;/a&gt;上找到可能的表达式的完整列表，参考指南中的定义。&lt;/p&gt;</description></item><item><title>第 11 章 时间序列</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-11/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-11/</guid><description>&lt;h1 id="第-11-章-时间序列"&gt;第 11 章 时间序列&lt;a class="anchor" href="#%e7%ac%ac-11-%e7%ab%a0-%e6%97%b6%e9%97%b4%e5%ba%8f%e5%88%97"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;时间序列（time series）数据是一种重要的结构化数据形式，应用于多个领域，包括金融学、经济学、生态学、神经科学、物理学等。在多个时间点观察或测量到的任何事物都可以形成一段时间序列。很多时间序列是固定频率的，也就是说，数据点是根据某种规律定期出现的（比如每 15 秒、每 5 分钟、每月出现一次）。时间序列也可以是不定期的，没有固定的时间单位或单位之间的偏移量。时间序列数据的意义取决于具体的应用场景，主要有以下几种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;时间戳（timestamp），特定的时刻。&lt;/li&gt;
&lt;li&gt;固定时期（period），如 2007 年 1 月或 2010 年全年。&lt;/li&gt;
&lt;li&gt;时间间隔（interval），由起始和结束时间戳表示。时期（period）可以被看做间隔（interval）的特例。&lt;/li&gt;
&lt;li&gt;实验或过程时间，每个时间点都是相对于特定起始时间的一个度量。例如，从放入烤箱时起，每秒钟饼干的直径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本章主要讲解前 3 种时间序列。许多技术都可用于处理实验型时间序列，其索引可能是一个整数或浮点数（表示从实验开始算起已经过去的时间）。最简单也最常见的时间序列都是用时间戳进行索引的。&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;提示：pandas 也支持基于&lt;code&gt;timedeltas&lt;/code&gt;的指数，它可以有效代表实验或经过的时间。这本书不涉及&lt;code&gt;timedelta&lt;/code&gt;指数，但你可以学习 &lt;a href="http://pandas.pydata.org/"&gt;pandas 的文档&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;pandas 提供了许多内置的时间序列处理工具和数据算法。因此，你可以高效处理非常大的时间序列，轻松地进行切片/切块、聚合、对定期/不定期的时间序列进行重采样等。有些工具特别适合金融和经济应用，你当然也可以用它们来分析服务器日志数据。&lt;/p&gt;
&lt;h1 id="111-日期和时间数据类型及工具"&gt;11.1 日期和时间数据类型及工具&lt;a class="anchor" href="#111-%e6%97%a5%e6%9c%9f%e5%92%8c%e6%97%b6%e9%97%b4%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e5%8f%8a%e5%b7%a5%e5%85%b7"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Python 标准库包含用于日期（date）和时间（time）数据的数据类型，而且还有日历方面的功能。我们主要会用到&lt;code&gt;datetime&lt;/code&gt;、&lt;code&gt;time&lt;/code&gt;以及&lt;code&gt;calendar&lt;/code&gt;模块。&lt;code&gt;datetime.datetime&lt;/code&gt;（也可以简写为&lt;code&gt;datetime&lt;/code&gt;）是用得最多的数据类型：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;from&lt;/span&gt; datetime &lt;span style="color:#ff6ac1"&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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: now &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; datetime&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;now()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: now
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: datetime&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;datetime(&lt;span style="color:#ff9f43"&gt;2017&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;9&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;25&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;52&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;72973&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: now&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;year, now&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;month, now&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;day
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: (&lt;span style="color:#ff9f43"&gt;2017&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;9&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;25&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;datetime&lt;/code&gt;以毫秒形式存储日期和时间。&lt;code&gt;timedelta&lt;/code&gt;表示两个&lt;code&gt;datetime&lt;/code&gt;对象之间的时间差：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: delta &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; datetime(&lt;span style="color:#ff9f43"&gt;2011&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;) &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt; datetime(&lt;span style="color:#ff9f43"&gt;2008&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;24&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: delta
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: datetime&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;timedelta(&lt;span style="color:#ff9f43"&gt;926&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;56700&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;16&lt;/span&gt;]: delta&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;days
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;16&lt;/span&gt;]: &lt;span style="color:#ff9f43"&gt;926&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;17&lt;/span&gt;]: delta&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;seconds
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;17&lt;/span&gt;]: &lt;span style="color:#ff9f43"&gt;56700&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以给&lt;code&gt;datetime&lt;/code&gt;对象加上（或减去）一个或多个&lt;code&gt;timedelta&lt;/code&gt;，这样会产生一个新对象：&lt;/p&gt;</description></item><item><title>Polars视频介绍</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/video_intro/</link><pubDate>Fri, 21 Mar 2025 09:27:39 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/video_intro/</guid><description>&lt;h1 id="polars视频介绍"&gt;Polars视频介绍&lt;a class="anchor" href="#polars%e8%a7%86%e9%a2%91%e4%bb%8b%e7%bb%8d"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;你不喜欢阅读文档吗？看看这段关于&lt;code&gt;Polars&lt;/code&gt;及其表达的介绍视频。&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/iwGIuGk5nCE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;</description></item><item><title>Polars参考指南</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/references/</link><pubDate>Thu, 20 Mar 2025 13:22:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/references/</guid><description>&lt;h1 id="polars参考指南"&gt;Polars参考指南&lt;a class="anchor" href="#polars%e5%8f%82%e8%80%83%e6%8c%87%e5%8d%97"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;需要查看&lt;code&gt;Polars&lt;/code&gt;的所有可用方法/功能吗？我们有&lt;code&gt;Rust&lt;/code&gt;和&lt;code&gt;Python&lt;/code&gt;的参考向导：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="POLARS_RS_REF_GUIDE"&gt;&lt;code&gt;Rust&lt;/code&gt; 发行版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="POLARS_PY_REF_GUIDE"&gt;&lt;code&gt;Python&lt;/code&gt; API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>第 12 章 pandas 高级应用</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-12/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-12/</guid><description>&lt;h1 id="第-12-章-pandas-高级应用"&gt;第 12 章 pandas 高级应用&lt;a class="anchor" href="#%e7%ac%ac-12-%e7%ab%a0-pandas-%e9%ab%98%e7%ba%a7%e5%ba%94%e7%94%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;前面的章节关注于不同类型的数据规整流程和 NumPy、pandas 与其它库的特点。随着时间的发展，pandas 发展出了更多适合高级用户的功能。本章就要深入学习 pandas 的高级功能。&lt;/p&gt;
&lt;h1 id="121-分类数据"&gt;12.1 分类数据&lt;a class="anchor" href="#121-%e5%88%86%e7%b1%bb%e6%95%b0%e6%8d%ae"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;这一节介绍的是 pandas 的分类类型。我会向你展示通过使用它，提高性能和内存的使用率。我还会介绍一些在统计和机器学习中使用分类数据的工具。&lt;/p&gt;
&lt;h2 id="背景和目的"&gt;背景和目的&lt;a class="anchor" href="#%e8%83%8c%e6%99%af%e5%92%8c%e7%9b%ae%e7%9a%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;表中的一列通常会有重复的包含不同值的小集合的情况。我们已经学过了&lt;code&gt;unique&lt;/code&gt;和&lt;code&gt;value_counts&lt;/code&gt;，它们可以从数组提取出不同的值，并分别计算频率：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np; &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; pandas &lt;span style="color:#ff6ac1"&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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: values &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series([&lt;span style="color:#5af78e"&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;orange&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;....&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&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;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: values
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; apple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; orange
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; apple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; apple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt; apple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt; orange
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;6&lt;/span&gt; apple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;7&lt;/span&gt; apple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: &lt;span style="color:#ff5c57"&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;unique(values)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: array([&lt;span style="color:#5af78e"&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;orange&amp;#39;&lt;/span&gt;], dtype&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff5c57"&gt;object&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;value_counts(values)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apple &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;orange &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: int64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;许多数据系统（数据仓库、统计计算或其它应用）都发展出了特定的表征重复值的方法，以进行高效的存储和计算。在数据仓库中，最好的方法是使用所谓的包含不同值的维表（Dimension Table），将主要的参数存储为引用维表整数键：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: values &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series([&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;] &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt; &lt;span style="color:#ff9f43"&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;In [&lt;span style="color:#ff9f43"&gt;16&lt;/span&gt;]: dim &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series([&lt;span style="color:#5af78e"&gt;&amp;#39;apple&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;orange&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;In [&lt;span style="color:#ff9f43"&gt;17&lt;/span&gt;]: values
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;17&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;6&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;7&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: int64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;18&lt;/span&gt;]: dim
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;18&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; apple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; orange
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: &lt;span style="color:#ff5c57"&gt;object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以使用&lt;code&gt;take&lt;/code&gt;方法存储原始的字符串&lt;code&gt;Series&lt;/code&gt;：&lt;/p&gt;</description></item><item><title>第 13 章 Python 建模库介绍</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-13/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-13/</guid><description>&lt;h1 id="第-13-章-python-建模库介绍"&gt;第 13 章 Python 建模库介绍&lt;a class="anchor" href="#%e7%ac%ac-13-%e7%ab%a0-python-%e5%bb%ba%e6%a8%a1%e5%ba%93%e4%bb%8b%e7%bb%8d"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;本书中，我已经介绍了 Python 数据分析的编程基础。因为数据分析师和科学家总是在数据规整和准备上花费大量时间，这本书的重点在于掌握这些功能。&lt;/p&gt;
&lt;p&gt;开发模型选用什么库取决于应用本身。许多统计问题可以用简单方法解决，比如普通的最小二乘回归，其它问题可能需要复杂的机器学习方法。幸运的是，Python 已经成为了运用这些分析方法的语言之一，因此读完此书，你可以探索许多工具。&lt;/p&gt;
&lt;p&gt;本章中，我会回顾一些 pandas 的特点，在你胶着于 pandas 数据规整和模型拟合和评分时，它们可能派上用场。然后我会简短介绍两个流行的建模工具，statsmodels 和 scikit-learn。这二者每个都值得再写一本书，我就不做全面的介绍，而是建议你学习两个项目的线上文档和其它基于 Python 的数据科学、统计和机器学习的书籍。&lt;/p&gt;
&lt;h1 id="131-pandas-与模型代码的接口"&gt;13.1 pandas 与模型代码的接口&lt;a class="anchor" href="#131-pandas-%e4%b8%8e%e6%a8%a1%e5%9e%8b%e4%bb%a3%e7%a0%81%e7%9a%84%e6%8e%a5%e5%8f%a3"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;模型开发的通常工作流是使用 pandas 进行数据加载和清洗，然后切换到建模库进行建模。开发模型的重要一环是机器学习中的“特征工程”。它可以描述从原始数据集中提取信息的任何数据转换或分析，这些数据集可能在建模中有用。本书中学习的数据聚合和&lt;code&gt;GroupBy&lt;/code&gt;工具常用于特征工程中。&lt;/p&gt;
&lt;p&gt;优秀的特征工程超出了本书的范围，我会尽量直白地介绍一些用于数据操作和建模切换的方法。&lt;/p&gt;
&lt;p&gt;pandas 与其它分析库通常是靠 NumPy 的数组联系起来的。将&lt;code&gt;DataFrame&lt;/code&gt;转换为 NumPy 数组，可以使用&lt;code&gt;.values&lt;/code&gt;属性：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; pandas &lt;span style="color:#ff6ac1"&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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: data &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;....&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#39;x0&amp;#39;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;....&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#39;x1&amp;#39;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;0.01&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.01&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0.25&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;4.1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0.&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;....&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;: [&lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;1.5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0.&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3.6&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1.3&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&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;In [&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x0 x1 y
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.01&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;1.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.01&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.25&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;3.6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;4.10&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.00&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;2.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;In [&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: data&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;columns
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: Index([&lt;span style="color:#5af78e"&gt;&amp;#39;x0&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;x1&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;], dtype&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#39;object&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;In [&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: data&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;values
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;array([[ &lt;span style="color:#ff9f43"&gt;1.&lt;/span&gt; , &lt;span style="color:#ff9f43"&gt;0.01&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;1.5&lt;/span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [ &lt;span style="color:#ff9f43"&gt;2.&lt;/span&gt; , &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.01&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0.&lt;/span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [ &lt;span style="color:#ff9f43"&gt;3.&lt;/span&gt; , &lt;span style="color:#ff9f43"&gt;0.25&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3.6&lt;/span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [ &lt;span style="color:#ff9f43"&gt;4.&lt;/span&gt; , &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;4.1&lt;/span&gt; , &lt;span style="color:#ff9f43"&gt;1.3&lt;/span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [ &lt;span style="color:#ff9f43"&gt;5.&lt;/span&gt; , &lt;span style="color:#ff9f43"&gt;0.&lt;/span&gt; , &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;2.&lt;/span&gt; ]])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要转换回&lt;code&gt;DataFrame&lt;/code&gt;，可以传递一个二维&lt;code&gt;ndarray&lt;/code&gt;，可带有列名：&lt;/p&gt;</description></item><item><title> 第 14 章 数据分析案例</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-14/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-14/</guid><description>&lt;h1 id="第-14-章-数据分析案例"&gt;第 14 章 数据分析案例&lt;a class="anchor" href="#%e7%ac%ac-14-%e7%ab%a0-%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90%e6%a1%88%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;本书正文的最后一章，我们来看一些真实世界的数据集。对于每个数据集，我们会用之前介绍的方法，从原始数据中提取有意义的内容。展示的方法适用于其它数据集，也包括你的。本章包含了一些各种各样的案例数据集，可以用来练习。&lt;/p&gt;
&lt;p&gt;案例数据集可以在 Github 仓库找到，见第一章。&lt;/p&gt;
&lt;h1 id="141-来自-bitly-的-usagov-数据"&gt;14.1 来自 Bitly 的 USA.gov 数据&lt;a class="anchor" href="#141-%e6%9d%a5%e8%87%aa-bitly-%e7%9a%84-usagov-%e6%95%b0%e6%8d%ae"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;2011 年，URL 缩短服务 Bitly 跟美国政府网站 USA.gov 合作，提供了一份从生成&lt;code&gt;.gov&lt;/code&gt;或&lt;code&gt;.mil&lt;/code&gt;短链接的用户那里收集来的匿名数据。在 2011 年，除实时数据之外，还可以下载文本文件形式的每小时快照。写作此书时（2017 年），这项服务已经关闭，但我们保存一份数据用于本书的案例。&lt;/p&gt;
&lt;p&gt;以每小时快照为例，文件中各行的格式为 JSON（即 JavaScript Object Notation，这是一种常用的 Web 数据格式）。例如，如果我们只读取某个文件中的第一行，那么所看到的结果应该是下面这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;]: path &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#39;datasets/bitly_usagov/example.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;In [&lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;]: &lt;span style="color:#ff5c57"&gt;open&lt;/span&gt;(path)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;readline()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;]: &lt;span style="color:#5af78e"&gt;&amp;#39;{ &amp;#34;a&amp;#34;: &amp;#34;Mozilla&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/5.0 (Windows NT 6.1; WOW64) AppleWebKit&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/535.11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(KHTML, like Gecko) Chrome\\&lt;span style="color:#ff6ac1"&gt;/&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;17.0.963.78&lt;/span&gt; Safari\\&lt;span style="color:#ff6ac1"&gt;/&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;535.11&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;, &amp;#34;&lt;/span&gt;c&lt;span style="color:#5af78e"&gt;&amp;#34;: &amp;#34;&lt;/span&gt;US&lt;span style="color:#5af78e"&gt;&amp;#34;, &amp;#34;&lt;/span&gt;nk&lt;span style="color:#5af78e"&gt;&amp;#34;: 1,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;tz&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;America&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/New_York&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;gr&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;MA&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;g&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;A6qOVH&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;h&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;wfLQtf&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;l&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;orofrog&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;al&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;en-US,en;q=0.8&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;hh&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;1.usa.gov&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;http:&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/www.facebook.com&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/l&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/7AQEFzjSi&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/1.usa.gov&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/wfLQtf&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;u&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;http:&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/www.ncbi.nlm.nih.gov&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/pubmed&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\\&lt;/span&gt;&lt;span style="color:#5af78e"&gt;/22415991&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff9f43"&gt;1331923247&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;hc&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1331822918&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;cy&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;Danvers&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;ll&amp;#34;&lt;/span&gt;: [ &lt;span style="color:#ff9f43"&gt;42.576698&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;70.954903&lt;/span&gt; ] }\n&lt;span style="color:#5af78e"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python 有内置或第三方模块可以将 JSON 字符串转换成 Python 字典对象。这里，我将使用&lt;code&gt;json&lt;/code&gt;模块及其&lt;code&gt;loads&lt;/code&gt;函数逐行加载已经下载好的数据文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;path &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#39;datasets/bitly_usagov/example.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;records &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; [json&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;loads(line) &lt;span style="color:#ff6ac1"&gt;for&lt;/span&gt; line &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;open&lt;/span&gt;(path)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，&lt;code&gt;records&lt;/code&gt;对象就成为一组 Python 字典了：&lt;/p&gt;</description></item><item><title> 附录 A NumPy 高级应用</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Appendix-A/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Appendix-A/</guid><description>&lt;h1 id="附录-a-numpy-高级应用"&gt;附录 A NumPy 高级应用&lt;a class="anchor" href="#%e9%99%84%e5%bd%95-a-numpy-%e9%ab%98%e7%ba%a7%e5%ba%94%e7%94%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;在这篇附录中，我会深入 NumPy 库的数组计算。这会包括&lt;code&gt;ndarray&lt;/code&gt;更内部的细节，和更高级的数组操作和算法。&lt;/p&gt;
&lt;p&gt;本章包括了一些杂乱的章节，不需要仔细研究。&lt;/p&gt;
&lt;h1 id="a1-ndarray对象的内部机理"&gt;A.1 &lt;code&gt;ndarray&lt;/code&gt;对象的内部机理&lt;a class="anchor" href="#a1-ndarray%e5%af%b9%e8%b1%a1%e7%9a%84%e5%86%85%e9%83%a8%e6%9c%ba%e7%90%86"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;NumPy 的&lt;code&gt;ndarray&lt;/code&gt;提供了一种将同质数据块（可以是连续或跨越）解释为多维数组对象的方式。正如你之前所看到的那样，数据类型（&lt;code&gt;dtype&lt;/code&gt;）决定了数据的解释方式，比如浮点数、整数、布尔值等。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ndarray&lt;/code&gt;如此强大的部分原因是所有数组对象都是数据块的一个跨度视图（strided view）。你可能想知道数组视图&lt;code&gt;arr[::2,::-1]&lt;/code&gt;不复制任何数据的原因是什么。简单地说，&lt;code&gt;ndarray&lt;/code&gt;不只是一块内存和一个&lt;code&gt;dtype&lt;/code&gt;，它还有跨度信息，这使得数组能以各种步幅（step size）在内存中移动。更准确地讲，&lt;code&gt;ndarray&lt;/code&gt;内部由以下内容组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个指向数据（内存或内存映射文件中的一块数据）的指针。&lt;/li&gt;
&lt;li&gt;数据类型或&lt;code&gt;dtype&lt;/code&gt;，描述在数组中的固定大小值的格子。&lt;/li&gt;
&lt;li&gt;一个表示数组形状（&lt;code&gt;shape&lt;/code&gt;）的元组。&lt;/li&gt;
&lt;li&gt;一个跨度元组（&lt;code&gt;stride&lt;/code&gt;），其中的整数指的是为了前进到当前维度下一个元素需要“跨过”的字节数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;图 A-1 简单地说明了&lt;code&gt;ndarray&lt;/code&gt; 的内部结构。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/imgs2/7178691-43452f2f413e5094.png" alt="图 A-1 Numpy 的ndarray对象" /&gt;&lt;/p&gt;
&lt;p&gt;例如，一个&lt;code&gt;10×5&lt;/code&gt;的数组，其形状为&lt;code&gt;(10,5)&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;ones((&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;))&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;shape
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: (&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个典型的（C 顺序，稍后将详细讲解）&lt;code&gt;3×4×5&lt;/code&gt;的&lt;code&gt;float64&lt;/code&gt;（8 个字节）数组，其跨度为&lt;code&gt;(160,40,8)&lt;/code&gt; —— 知道跨度是非常有用的，通常，跨度在一个轴上越大，沿这个轴进行计算的开销就越大：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;ones((&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;), dtype&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;float64)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;strides
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: (&lt;span style="color:#ff9f43"&gt;160&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;40&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;虽然 NumPy 用户很少会对数组的跨度信息感兴趣，但它们却是构建非复制式数组视图的重要因素。跨度甚至可以是负数，这样会使数组在内存中后向移动，比如在切片&lt;code&gt;obj[::-1]&lt;/code&gt;或&lt;code&gt;obj[:,::-1]&lt;/code&gt;中就是这样的。&lt;/p&gt;
&lt;h2 id="numpy-数据类型体系"&gt;NumPy 数据类型体系&lt;a class="anchor" href="#numpy-%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e4%bd%93%e7%b3%bb"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;你可能偶尔需要检查数组中所包含的是否是整数、浮点数、字符串或 Python 对象。因为浮点数的种类很多（从&lt;code&gt;float16&lt;/code&gt;到&lt;code&gt;float128&lt;/code&gt;），判断&lt;code&gt;dtype&lt;/code&gt;是否属于某个大类的工作非常繁琐。幸运的是，&lt;code&gt;dtype&lt;/code&gt;都有一个超类（比如&lt;code&gt;np.integer&lt;/code&gt;和&lt;code&gt;np.floating&lt;/code&gt;），它们可以跟&lt;code&gt;np.issubdtype&lt;/code&gt;函数结合使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: ints &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;ones(&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, dtype&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;uint16)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: floats &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;ones(&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;, dtype&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;float32)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;issubdtype(ints&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;dtype, np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;integer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&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;In [&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;issubdtype(floats&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;dtype, np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;floating)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;调用&lt;code&gt;dtype&lt;/code&gt;的&lt;code&gt;mro&lt;/code&gt;方法即可查看其所有的父类：&lt;/p&gt;</description></item><item><title> 附录 B 更多关于 IPython 的内容</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Appendix-B/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Appendix-B/</guid><description>&lt;h1 id="附录-b-更多关于-ipython-的内容"&gt;附录 B 更多关于 IPython 的内容&lt;a class="anchor" href="#%e9%99%84%e5%bd%95-b-%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8e-ipython-%e7%9a%84%e5%86%85%e5%ae%b9"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;第 2 章中，我们学习了 IPython shell 和 Jupyter 笔记本的基础。本章中，我们会探索 IPython 更深层次的功能，可以从控制台或在 jupyter 使用。&lt;/p&gt;
&lt;h1 id="b1-使用命令历史"&gt;B.1 使用命令历史&lt;a class="anchor" href="#b1-%e4%bd%bf%e7%94%a8%e5%91%bd%e4%bb%a4%e5%8e%86%e5%8f%b2"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ipython 维护了一个位于磁盘的小型数据库，用于保存执行的每条指令。它的用途有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只用最少的输入，就能搜索、补全和执行先前运行过的指令；&lt;/li&gt;
&lt;li&gt;在不同会话间保存命令历史；&lt;/li&gt;
&lt;li&gt;将日志输入/输出历史到一个文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些功能在 shell 中，要比笔记本更为有用，因为笔记本从设计上是将输入和输出的代码放到每个代码格子中。&lt;/p&gt;
&lt;h2 id="搜索和重复使用命令历史"&gt;搜索和重复使用命令历史&lt;a class="anchor" href="#%e6%90%9c%e7%b4%a2%e5%92%8c%e9%87%8d%e5%a4%8d%e4%bd%bf%e7%94%a8%e5%91%bd%e4%bb%a4%e5%8e%86%e5%8f%b2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ipython 可以让你搜索和执行之前的代码或其他命令。这个功能非常有用，因为你可能需要重复执行同样的命令，例如&lt;code&gt;%run&lt;/code&gt;命令，或其它代码。假设你必须要执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In[&lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;%&lt;/span&gt;run first&lt;span style="color:#ff6ac1"&gt;/&lt;/span&gt;second&lt;span style="color:#ff6ac1"&gt;/&lt;/span&gt;third&lt;span style="color:#ff6ac1"&gt;/&lt;/span&gt;data_script&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行成功，然后检查结果，发现计算有错。解决完问题，然后修改了&lt;code&gt;data_script.py&lt;/code&gt;，你就可以输入一些&lt;code&gt;%run&lt;/code&gt;命令，然后按&lt;code&gt;Ctrl+P&lt;/code&gt;或上箭头。这样就可以搜索历史命令，匹配输入字符的命令。多次按&lt;code&gt;Ctrl+P&lt;/code&gt;或上箭头，会继续搜索命令。如果你要执行你想要执行的命令，不要害怕。你可以按下&lt;code&gt;Ctrl-N&lt;/code&gt;或下箭头，向前移动历史命令。这样做了几次后，你可以不假思索地按下这些键！&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl-R&lt;/code&gt;可以带来如同 Unix 风格 shell（比如 bash shell）的&lt;code&gt;readline&lt;/code&gt;的部分增量搜索功能。在 Windows 上，&lt;code&gt;readline&lt;/code&gt;功能是被 IPython 模仿的。要使用这个功能，先按&lt;code&gt;Ctrl-R&lt;/code&gt;，然后输入一些包含于输入行的想要搜索的字符：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;]: a_command &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; foo(x, y, z)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(reverse&lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;i&lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;search)&lt;span style="color:#ff5c57"&gt;`&lt;/span&gt;com&lt;span style="color:#5af78e"&gt;&amp;#39;: a_command = foo(x, y, z)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Ctrl-R&lt;/code&gt;会循环历史，找到匹配字符的每一行。&lt;/p&gt;
&lt;h2 id="输入和输出变量"&gt;输入和输出变量&lt;a class="anchor" href="#%e8%be%93%e5%85%a5%e5%92%8c%e8%be%93%e5%87%ba%e5%8f%98%e9%87%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;忘记将函数调用的结果分配给变量是非常烦人的。IPython 的一个会话会在一个特殊变量，存储输入和输出 Python 对象的引用。前面两个输出会分别存储在&lt;code&gt;_&lt;/code&gt;（一个下划线）和&lt;code&gt;__&lt;/code&gt;（两个下划线）变量：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;24&lt;/span&gt;]: &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;**&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;27&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;24&lt;/span&gt;]: &lt;span style="color:#ff9f43"&gt;134217728&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;25&lt;/span&gt;]: _
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;25&lt;/span&gt;]: &lt;span style="color:#ff9f43"&gt;134217728&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入变量是存储在名字类似&lt;code&gt;_iX&lt;/code&gt;的变量中，&lt;code&gt;X&lt;/code&gt;是输入行的编号。对于每个输入变量，都有一个对应的输出变量&lt;code&gt;_X&lt;/code&gt;。因此在输入第 27 行之后，会有两个新变量&lt;code&gt;_27&lt;/code&gt;（输出）和&lt;code&gt;_i27&lt;/code&gt;（输入）:&lt;/p&gt;</description></item><item><title>Polars与pandas差异对比</title><link>https://www.pythondataanalysis.com/posts/polars-vs-pandas/</link><pubDate>Tue, 15 Apr 2025 12:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/posts/polars-vs-pandas/</guid><description>&lt;p&gt;如果您有关注过去一年中 Python DataFrame 的进展，那么您一定听说过 Polars，专为处理大型数据集而设计的强大 DataFrame 库。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.jetbrains.com/wp-content/uploads/2023/08/Preview-page-1280x720-2x-1.jpg" alt="Preview-page" /&gt;&lt;/p&gt;
&lt;p&gt;与 Spark、Dask 和 Ray 等处理大型数据集的其他库有所不同，Polars 在单台机器上使用，也因此引起许多与 pandas 的比较。 事实上，Polars 在许多重要方面都与 pandas 存在差异，包括数据处理方式以及最佳应用。 下文将探讨这两种 DataFrame 库的技术细节区别，并分析其各自优点和局限。&lt;/p&gt;
&lt;p&gt;如果您想听 Polars 的缔造者 Ritchie Vink 亲口讲述，您可以在此处找到我们对他的采访！&lt;/p&gt;
&lt;h2 id="为什么使用-polars-而不是-pandas"&gt;为什么使用 Polars 而不是 pandas？&lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bd%bf%e7%94%a8-polars-%e8%80%8c%e4%b8%8d%e6%98%af-pandas"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;两个字：性能。 Polars 从一开始就速度极快，执行常见运算的速度是 pandas 的 5 到 10 倍。 另外，Polars 运算的内存需求明显小于 pandas：pandas 需要数据集大小的 5 到 10 倍左右的 RAM 来执行运算，而 Polars 需要 2 到 4 倍。&lt;/p&gt;
&lt;p&gt;您可以在这里了解 Polars 与其他 DataFrame 库的性能对比。 对于常见运算，Polars 的速度是 pandas 的 10 到 100 倍，也是最快的 DataFrame 库之一。 此外，在内存不足错误之前，它可以处理比 pandas 更大的数据集。&lt;/p&gt;</description></item><item><title>排序</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/sorting/</link><pubDate>Fri, 21 Mar 2025 11:39:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/sorting/</guid><description>&lt;h1 id="排序"&gt;排序&lt;a class="anchor" href="#%e6%8e%92%e5%ba%8f"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars 支持与其他数据框架库类似的排序行为，即按一个或多个列以及多个（不同的）顺序进行排序。&lt;/p&gt;
&lt;h2 id="数据集"&gt;数据集&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;arange(&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;), &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;]}) &lt;span style="color:#78787e"&gt;# np.arange(1, 4): 生成[1, 4)的数组&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(df)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ a │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ b │
&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;h2 id="急性"&gt;急性&lt;a class="anchor" href="#%e6%80%a5%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sort([&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;], descending&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;False&lt;/span&gt;]) &lt;span style="color:#78787e"&gt;# 分别对两列&amp;#34;b&amp;#34;, &amp;#34;a&amp;#34;进行排序，&amp;#34;b&amp;#34;逆序，&amp;#34;a&amp;#34;顺序&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ a │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ b │
&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;h2 id="惰性"&gt;惰性&lt;a class="anchor" href="#%e6%83%b0%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;lazy()&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;sort(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;col(&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;), descending&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;) &lt;span style="color:#78787e"&gt;# 惰性排序，对&amp;#34;a&amp;#34;列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; q&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;collect()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a ┆ b │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ b │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ a │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ a │
&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;</description></item><item><title>透视</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/pivot/</link><pubDate>Fri, 21 Mar 2025 11:37:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/df/pivot/</guid><description>&lt;h1 id="透视"&gt;透视&lt;a class="anchor" href="#%e9%80%8f%e8%a7%86"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;在 &lt;code&gt;DataFrame&lt;/code&gt; 中透视一列，并执行下列其中一种聚合。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first：第一项&lt;/li&gt;
&lt;li&gt;sum：求和&lt;/li&gt;
&lt;li&gt;min：最小值&lt;/li&gt;
&lt;li&gt;max：最大值&lt;/li&gt;
&lt;li&gt;mean：平均值&lt;/li&gt;
&lt;li&gt;median：中位数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;透视操作包括一个或多个列的分组（它们将成为新的 y 轴），将被透视的列（它们将成为新的 x 轴）以及一个聚合。&lt;/p&gt;
&lt;h2 id="数据集"&gt;数据集&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 构造DataFrame（数据帧）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;N&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;k&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;l&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;m&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;o&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:#ff5c57"&gt;print&lt;/span&gt;(df)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (5, 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬─────┬─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ foo ┆ N ┆ bar │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ str ┆ i64 ┆ str │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═════╪═════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ A ┆ 1 ┆ k │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ A ┆ 2 ┆ l │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ B ┆ 2 ┆ m │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ B ┆ 4 ┆ n │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ C ┆ 2 ┆ o │
&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;h2 id="急性"&gt;急性&lt;a class="anchor" href="#%e6%80%a5%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;pivot(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; index&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; columns&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; values&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;N&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="惰性"&gt;惰性&lt;a class="anchor" href="#%e6%83%b0%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;惰性操作的 API 中并不包含转置操作，因此想要&lt;code&gt;惰性地&lt;/code&gt;使用转置，我们可以使用 &lt;code&gt;map&lt;/code&gt; 来
在惰性计算节点中执行一个急性的自定义函数。&lt;/p&gt;</description></item><item><title>Polars与Postgres交互</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/postgres/</link><pubDate>Fri, 21 Mar 2025 11:17:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/howcani/io/postgres/</guid><description>&lt;h1 id="polars与postgres交互"&gt;Polars与Postgres交互&lt;a class="anchor" href="#polars%e4%b8%8epostgres%e4%ba%a4%e4%ba%92"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="读取"&gt;读取&lt;a class="anchor" href="#%e8%af%bb%e5%8f%96"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从postgres数据库中读取数据，需要额外依赖项:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pip install connectorx&amp;gt;&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;0.2.0a3&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:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conn &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;postgresql://username:password@server:port/database&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;query &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;SELECT * FROM foo&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;pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_sql(query, conn)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="写入"&gt;写入&lt;a class="anchor" href="#%e5%86%99%e5%85%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;写入postgres数据库，需要额外依赖项:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pip install psycopg2-binary&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用&lt;code&gt;psycopg2&lt;/code&gt;写入postgres数据库，我们会用&lt;code&gt;批处理&lt;/code&gt;的方法，限制与服务器的往返行程以提高写入性能。&lt;/p&gt;
&lt;p&gt;我们首先要保证所有的数据类型可以被&lt;code&gt;psycopg2&lt;/code&gt;所识别，再使用&lt;code&gt;DataFrame.rows&lt;/code&gt;轻松将每列数据转置成数据库驱动程序可以处理的行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;from&lt;/span&gt; psycopg2 &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; sql
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; psycopg2.extras
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 不仿假设有一个DataFrame，其列分别为：浮点，整数，字符串，日期（date64）类型的数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_parquet(&lt;span style="color:#5af78e"&gt;&amp;#34;somefile.parquet&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:#78787e"&gt;# 首先将 polars 的 date64 数据类型转换成 python 的 datetime 对象&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;for&lt;/span&gt; col &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; df:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#78787e"&gt;# 只转换date64类型数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;if&lt;/span&gt; col&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;dtype &lt;span style="color:#ff6ac1"&gt;==&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Date64:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;with_column(col&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;dt&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;to_python_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:#78787e"&gt;# 为字段名创建 sql 标识符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 这一步是为了在sql语句中安全插入数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;columns &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; sql&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;SQL(&lt;span style="color:#5af78e"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;join(sql&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Identifier(name) &lt;span style="color:#ff6ac1"&gt;for&lt;/span&gt; name &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;columns)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 为值创建占位符，之后再被值填充&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;values &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; sql&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;SQL(&lt;span style="color:#5af78e"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;join([sql&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Placeholder() &lt;span style="color:#ff6ac1"&gt;for&lt;/span&gt; _ &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;columns])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;table_id &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;mytable&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:#78787e"&gt;# 准备insert语句&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;insert_stmt &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; sql&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;SQL(&lt;span style="color:#5af78e"&gt;&amp;#34;INSERT INTO (&lt;/span&gt;&lt;span style="color:#5af78e"&gt;{}&lt;/span&gt;&lt;span style="color:#5af78e"&gt;) VALUES(&lt;/span&gt;&lt;span style="color:#5af78e"&gt;{}&lt;/span&gt;&lt;span style="color:#5af78e"&gt;);&amp;#34;&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;format(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sql&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Identifier(table_id), columns, values
&lt;/span&gt;&lt;/span&gt;&lt;span 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:#78787e"&gt;# 创建与数据库的连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conn &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; psycopg2&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;connect()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cur &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; conn&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;cursort()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 执行insert语句&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;psycopg2&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;extras&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;execute_batch(cur, insert_stmt, df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;rows())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conn&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;commit()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Polars与Numpy交互</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/numpy/</link><pubDate>Fri, 21 Mar 2025 09:23:39 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/numpy/</guid><description>&lt;h1 id="polars与numpy交互"&gt;Polars与Numpy交互&lt;a class="anchor" href="#polars%e4%b8%8enumpy%e4%ba%a4%e4%ba%92"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Polars&lt;/code&gt; 表达式支持&lt;code&gt;NumPy&lt;/code&gt; &lt;a href="https://numpy.org/doc/stable/reference/ufuncs.html"&gt;ufuncs&lt;/a&gt;。 &lt;a href="https://numpy.org/doc/stable/reference/ufuncs.html#available-ufuncs"&gt;这里&lt;/a&gt;查看所有受支持的numpy函数的列表。&lt;/p&gt;
&lt;p&gt;这意味着，如果一个函数不是由&lt;code&gt;Polars&lt;/code&gt;提供的，我们可以使用&lt;code&gt;NumPy&lt;/code&gt;，我们仍然可以通过&lt;code&gt;NumPy&lt;/code&gt;API进行快速的列操作。&lt;/p&gt;
&lt;h2 id="实例"&gt;实例&lt;a class="anchor" href="#%e5%ae%9e%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;], &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;]})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; df&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;select(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;log(pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;all())&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;suffix(&lt;span style="color:#5af78e"&gt;&amp;#34;_log&amp;#34;&lt;/span&gt;), &lt;span style="color:#78787e"&gt;# 对df所有列求对数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span 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:#ff5c57"&gt;print&lt;/span&gt;(out)&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:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (3, 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌──────────┬──────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ a_log ┆ b_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;│ f64 ┆ f64 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞══════════╪══════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 0.0 ┆ 1.386294 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 0.693147 ┆ 1.609438 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1.098612 ┆ 1.791759 │
&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;h2 id="gotchas"&gt;Gotcha&amp;rsquo;s&lt;a class="anchor" href="#gotchas"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;阅读更多关于 &lt;a href="POLARS_ROOT/howcani/interop/numpy.html"&gt;gotcha&amp;rsquo;s 这里&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Polars窗口函数</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/window_functions/</link><pubDate>Fri, 21 Mar 2025 09:22:39 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/dsl/window_functions/</guid><description>&lt;h1 id="polars窗口函数"&gt;Polars窗口函数&lt;a class="anchor" href="#polars%e7%aa%97%e5%8f%a3%e5%87%bd%e6%95%b0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;窗口函数是一种强大的表达式。它可以让用户在 &lt;code&gt;select&lt;/code&gt; 上下文中分组进行类聚。
让我们通过例子看看这是什么意思。首先，我们创建一个数据结构，这个数据包含如下列，分别代表口袋妖怪的一些信息：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;['#', 'Name', 'Type 1', 'Type 2', 'Total', 'HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed', 'Generation', 'Legendary']&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 然后，让我们加载一些包pokemon信息的csv数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;read_csv(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;https://gist.githubusercontent.com/ritchie46/cac6b337ea52281aa23c049250a4ff03/raw/89a957ff3919d90e6ef2d34235e6bf22304f3366/pokemon.csv&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape: (163, 13)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────┬───────────────────────┬─────────┬────────┬───┬─────────┬───────┬────────────┬───────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ # ┆ Name ┆ Type 1 ┆ Type 2 ┆ … ┆ Sp. Def ┆ Speed ┆ Generation ┆ Legendary │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ i64 ┆ str ┆ str ┆ str ┆ ┆ i64 ┆ i64 ┆ i64 ┆ bool │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╞═════╪═══════════════════════╪═════════╪════════╪═══╪═════════╪═══════╪════════════╪═══════════╡
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 1 ┆ Bulbasaur ┆ Grass ┆ Poison ┆ … ┆ 65 ┆ 45 ┆ 1 ┆ false │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 2 ┆ Ivysaur ┆ Grass ┆ Poison ┆ … ┆ 80 ┆ 60 ┆ 1 ┆ false │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ Venusaur ┆ Grass ┆ Poison ┆ … ┆ 100 ┆ 80 ┆ 1 ┆ false │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 3 ┆ VenusaurMega Venusaur ┆ Grass ┆ Poison ┆ … ┆ 120 ┆ 80 ┆ 1 ┆ false │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 147 ┆ Dratini ┆ Dragon ┆ null ┆ … ┆ 50 ┆ 50 ┆ 1 ┆ false │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 148 ┆ Dragonair ┆ Dragon ┆ null ┆ … ┆ 70 ┆ 70 ┆ 1 ┆ false │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 149 ┆ Dragonite ┆ Dragon ┆ Flying ┆ … ┆ 100 ┆ 80 ┆ 1 ┆ false │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 150 ┆ Mewtwo ┆ Psychic ┆ null ┆ … ┆ 90 ┆ 130 ┆ 1 ┆ true │
&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;h2 id="groupby-类聚"&gt;Groupby 类聚&lt;a class="anchor" href="#groupby-%e7%b1%bb%e8%81%9a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下面我们看看如何用窗口函数对不同的列分组并且类聚。这样我们可以在一次查询中并行的运行多个分组操作。
类聚的结果会投射会原有的行。因此，窗口函数永远返回一个跟原有 &lt;code&gt;DataFrame&lt;/code&gt; 一样规格的 &lt;code&gt;DataFrame&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>Polars时间序列实例</title><link>https://www.pythondataanalysis.com/docs/polars_book_cn/timeseries/time-series/</link><pubDate>Thu, 20 Mar 2025 13:22:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/polars_book_cn/timeseries/time-series/</guid><description>&lt;h1 id="polars时间序列实例"&gt;Polars时间序列实例&lt;a class="anchor" href="#polars%e6%97%b6%e9%97%b4%e5%ba%8f%e5%88%97%e5%ae%9e%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;from&lt;/span&gt; datetime &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 创建一个数据帧实例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;: pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;date_range(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; low&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;datetime(&lt;span style="color:#ff9f43"&gt;2021&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;16&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; high&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;datetime(&lt;span style="color:#ff9f43"&gt;2021&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;16&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; interval&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;30m&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:#5af78e"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff5c57"&gt;range&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;shape: (7, 2)
┌─────────────────────┬─────┐
│ time ┆ n │
│ --- ┆ --- │
│ datetime ┆ i64 │
╞═════════════════════╪═════╡
│ 2021-12-16 00:00:00 ┆ 0 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 2021-12-16 00:30:00 ┆ 1 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 2021-12-16 01:00:00 ┆ 2 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 2021-12-16 01:30:00 ┆ 3 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 2021-12-16 02:00:00 ┆ 4 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 2021-12-16 02:30:00 ┆ 5 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 2021-12-16 03:00:00 ┆ 6 │
└─────────────────────┴─────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从2021-12-16 00:00:00开始，按1小时的窗口分组。&lt;/p&gt;</description></item><item><title>第 8 章 数据规整：聚合、合并和重塑</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-08/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-08/</guid><description>&lt;h1 id="第-8-章-数据规整聚合合并和重塑"&gt;第 8 章 数据规整：聚合、合并和重塑&lt;a class="anchor" href="#%e7%ac%ac-8-%e7%ab%a0-%e6%95%b0%e6%8d%ae%e8%a7%84%e6%95%b4%e8%81%9a%e5%90%88%e5%90%88%e5%b9%b6%e5%92%8c%e9%87%8d%e5%a1%91"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;在许多应用中，数据可能分散在许多文件或数据库中，存储的形式也不利于分析。本章关注可以聚合、合并、重塑数据的方法。&lt;/p&gt;
&lt;p&gt;首先，我会介绍 pandas 的层次化索引，它广泛用于以上操作。然后，我深入介绍了一些特殊的数据操作。在第 14 章，你可以看到这些工具的多种应用。&lt;/p&gt;
&lt;h1 id="81-层次化索引"&gt;8.1 层次化索引&lt;a class="anchor" href="#81-%e5%b1%82%e6%ac%a1%e5%8c%96%e7%b4%a2%e5%bc%95"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;层次化索引（hierarchical indexing）是 pandas 的一项重要功能，它使你能在一个轴上拥有多个（两个以上）索引级别。抽象点说，它使你能以低维度形式处理高维度数据。我们先来看一个简单的例子：创建一个&lt;code&gt;Series&lt;/code&gt;，并用一个由列表或数组组成的列表作为索引：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;9&lt;/span&gt;]: data &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pd&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Series(np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;random&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;randn(&lt;span style="color:#ff9f43"&gt;9&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;...&lt;/span&gt;: index&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[[&lt;span style="color:#5af78e"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;...&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&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;In [&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;10&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.204708&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.478943&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.519439&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.555730&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.965781&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.393406&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.092908&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;d &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.281746&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.769023&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: float64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看到的结果是经过美化的带有&lt;code&gt;MultiIndex&lt;/code&gt;索引的&lt;code&gt;Series&lt;/code&gt;的格式。索引之间的“间隔”表示“直接使用上面的标签”：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: data&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;index
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MultiIndex(levels&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[[&lt;span style="color:#5af78e"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;], [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labels&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[[&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;], [&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;]])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于一个层次化索引的对象，可以使用所谓的部分索引，使用它选取数据子集的操作更简单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: data[&lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.555730&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.965781&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: float64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: data[&lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;:&lt;span style="color:#5af78e"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.555730&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.965781&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.393406&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.092908&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: float64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: data&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;loc[[&lt;span style="color:#5af78e"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;-&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;0.555730&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;1.965781&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;d &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.281746&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt; &lt;span style="color:#ff9f43"&gt;0.769023&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dtype: float64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有时甚至还可以在“内层”中进行选取：&lt;/p&gt;</description></item><item><title>第 9 章 绘图和可视化</title><link>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-09/</link><pubDate>Thu, 06 Mar 2025 22:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/docs/Python_Data_Analysis_2nd_Editon/Chapter-09/</guid><description>&lt;h1 id="第-9-章-绘图和可视化"&gt;第 9 章 绘图和可视化&lt;a class="anchor" href="#%e7%ac%ac-9-%e7%ab%a0-%e7%bb%98%e5%9b%be%e5%92%8c%e5%8f%af%e8%a7%86%e5%8c%96"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;信息可视化（也叫绘图）是数据分析中最重要的工作之一。它可能是探索过程的一部分，例如，帮助我们找出异常值、必要的数据转换、得出有关模型的想法等。另外，做一个可交互的数据可视化也许是工作的最终目标。Python 有许多库进行静态或动态的数据可视化，但我这里重要关注于 &lt;a href="http://matplotlib.org/"&gt;matplotlib&lt;/a&gt; 和基于它的库。&lt;/p&gt;
&lt;p&gt;matplotlib 是一个用于创建出版质量图表的桌面绘图包（主要是 2D 方面）。该项目是由 John Hunter 于 2002 年启动的，其目的是为 Python 构建一个 MATLAB 式的绘图接口。matplotlib 和 IPython 社区进行合作，简化了从 IPython shell（包括现在的 Jupyter 笔记本）进行交互式绘图。matplotlib 支持各种操作系统上许多不同的 GUI 后端，而且还能将图片导出为各种常见的向量（vector）和光栅（raster）图：PDF、SVG、JPG、PNG、BMP、GIF 等。除了几张，本书中的大部分图都是用它生成的。&lt;/p&gt;
&lt;p&gt;随着时间的发展，matplotlib 衍生出了多个数据可视化的工具集，它们使用 matplotlib 作为底层。其中之一是 &lt;a href="http://seaborn.pydata.org/"&gt;seaborn&lt;/a&gt;，本章后面会学习它。&lt;/p&gt;
&lt;p&gt;学习本章代码案例的最简单方法是在 Jupyter 笔记本进行交互式绘图。在 Jupyter 笔记本中执行下面的语句：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;%&lt;/span&gt;matplotlib notebook&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="91-matplotlib-api-入门"&gt;9.1 matplotlib API 入门&lt;a class="anchor" href="#91-matplotlib-api-%e5%85%a5%e9%97%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;matplotlib 的通常引入约定是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;11&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; plt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 Jupyter 笔记本中运行&lt;code&gt;%matplotlib&lt;/code&gt;（或在 IPython 中运行&lt;code&gt;%matplotlib&lt;/code&gt;），就可以创建一个简单的图形。如果一切设置正确，会看到图 9-1：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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;In [&lt;span style="color:#ff9f43"&gt;12&lt;/span&gt;]: &lt;span style="color:#ff6ac1"&gt;import&lt;/span&gt; numpy &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;13&lt;/span&gt;]: data &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; np&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;arange(&lt;span style="color:#ff9f43"&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;In [&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Out[&lt;span style="color:#ff9f43"&gt;14&lt;/span&gt;]: array([&lt;span style="color:#ff9f43"&gt;0&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;5&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;6&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;7&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;9&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;In [&lt;span style="color:#ff9f43"&gt;15&lt;/span&gt;]: plt&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;plot(data)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://www.pythondataanalysis.com/imgs2/7178691-7032e333a6ecdd37.png" alt="图 9-1 简单的线图" /&gt;&lt;/p&gt;</description></item><item><title>使用Python批量检测URL状态码</title><link>https://www.pythondataanalysis.com/posts/Use-Python-to-detect-URL-status-codes-in-batches/</link><pubDate>Fri, 10 Nov 2023 12:20:29 +0800</pubDate><guid>https://www.pythondataanalysis.com/posts/Use-Python-to-detect-URL-status-codes-in-batches/</guid><description>&lt;p&gt;想要找到3位长度的github ID，可以对用户页URL进行探测，找到所有不可用的就有可能没有注册。&lt;/p&gt;
&lt;p&gt;使用python很简单能实现以上需求。&lt;/p&gt;
&lt;p&gt;首先安装&lt;code&gt;pip requests&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&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:#ff6ac1"&gt;for&lt;/span&gt; x1 &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;range&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;97&lt;/span&gt;,&lt;span style="color:#ff9f43"&gt;123&lt;/span&gt;): 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;for&lt;/span&gt; x2 &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;range&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;97&lt;/span&gt;,&lt;span style="color:#ff9f43"&gt;123&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;for&lt;/span&gt; x3 &lt;span style="color:#ff6ac1"&gt;in&lt;/span&gt; &lt;span style="color:#ff5c57"&gt;range&lt;/span&gt;(&lt;span style="color:#ff9f43"&gt;97&lt;/span&gt;,&lt;span style="color:#ff9f43"&gt;123&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#39;https://github.com/&amp;#39;&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;+&lt;/span&gt;&lt;span style="color:#ff5c57"&gt;chr&lt;/span&gt;(x1)&lt;span style="color:#ff6ac1"&gt;+&lt;/span&gt;&lt;span style="color:#ff5c57"&gt;chr&lt;/span&gt;(x2)&lt;span style="color:#ff6ac1"&gt;+&lt;/span&gt;&lt;span style="color:#ff5c57"&gt;chr&lt;/span&gt;(x3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;requests&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;get(url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff5c57"&gt;print&lt;/span&gt;(url,r&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;status_code)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中&lt;code&gt;range(97,123)&lt;/code&gt;就是遍历&lt;code&gt;a-z&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;运行结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root@bwg:~# python3 ./gid.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aaa status &lt;span style="color:#ff9f43"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aab status &lt;span style="color:#ff9f43"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aac status &lt;span style="color:#ff9f43"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aad status &lt;span style="color:#ff9f43"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aae status &lt;span style="color:#ff9f43"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aaf status &lt;span style="color:#ff9f43"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aag status &lt;span style="color:#ff9f43"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://github.com/aah status &lt;span style="color:#ff9f43"&gt;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/api/reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/api/reference/</guid><description>&lt;h1 id="reference-guide"&gt;Reference guide&lt;a class="anchor" href="#reference-guide"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The API reference contains detailed descriptions of all public functions and objects. It&amp;rsquo;s the best
place to look if you need information on a specific function.&lt;/p&gt;
&lt;h2 id="python"&gt;Python&lt;a class="anchor" href="#python"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Python API reference is built using Sphinx. It&amp;rsquo;s available in
&lt;a href="https://docs.pola.rs/api/python/stable/reference/index.html"&gt;our docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="rust"&gt;Rust&lt;a class="anchor" href="#rust"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Rust API reference is built using Cargo. It&amp;rsquo;s available on
&lt;a href="https://docs.rs/polars/latest/polars/"&gt;docs.rs&lt;/a&gt;.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/_streaming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/_streaming/</guid><description>&lt;h1 id="streaming"&gt;Streaming&lt;a class="anchor" href="#streaming"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;!-- Not included in the docs “until we have something we are proud of”. https://github.com/pola-rs/polars/pull/19087/files/92bffabe48c6c33a9ec5bc003d8683e59c97158c#r1788988580 --&gt;
&lt;p&gt;One additional benefit of the lazy API is that it allows queries to be executed in a streaming
manner. Instead of processing all the data at once, Polars can execute the query in batches allowing
you to process datasets that do not fit in memory.&lt;/p&gt;
&lt;p&gt;To tell Polars we want to execute a query in streaming mode we pass the &lt;code&gt;streaming=True&lt;/code&gt; argument to
&lt;code&gt;collect&lt;/code&gt;&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/development/contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/development/contributing/</guid><description>&lt;h1 id="overview"&gt;Overview&lt;a class="anchor" href="#overview"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thanks for taking the time to contribute! We appreciate all contributions, from reporting bugs to
implementing new features. If you&amp;rsquo;re unclear on how to proceed after reading this guide, please
contact us on &lt;a href="https://discord.gg/4UfP5cfBE7"&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="reporting-bugs"&gt;Reporting bugs&lt;a class="anchor" href="#reporting-bugs"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We use &lt;a href="https://github.com/pola-rs/polars/issues"&gt;GitHub issues&lt;/a&gt; to track bugs and suggested
enhancements. You can report a bug by opening a
&lt;a href="https://github.com/pola-rs/polars/issues/new/choose"&gt;new issue&lt;/a&gt;. Use the appropriate issue type for
the language you are using
(&lt;a href="https://github.com/pola-rs/polars/issues/new?labels=bug&amp;amp;template=bug_report_rust.yml"&gt;Rust&lt;/a&gt; /
&lt;a href="https://github.com/pola-rs/polars/issues/new?labels=bug&amp;amp;template=bug_report_python.yml"&gt;Python&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Before creating a bug report, please check that your bug has not already been reported, and that
your bug exists on the latest version of Polars. If you find a closed issue that seems to report the
same bug you&amp;rsquo;re experiencing, open a new issue and include a link to the original issue in your
issue description.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/development/versioning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/development/versioning/</guid><description>&lt;h1 id="versioning"&gt;Versioning&lt;a class="anchor" href="#versioning"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="version-changes"&gt;Version changes&lt;a class="anchor" href="#version-changes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars adheres to the &lt;a href="https://semver.org/"&gt;semantic versioning&lt;/a&gt; specification:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Breaking changes lead to a &lt;strong&gt;major&lt;/strong&gt; version increase (&lt;code&gt;1.0.0&lt;/code&gt;, &lt;code&gt;2.0.0&lt;/code&gt;, &amp;hellip;)&lt;/li&gt;
&lt;li&gt;New features and performance improvements lead to a &lt;strong&gt;minor&lt;/strong&gt; version increase (&lt;code&gt;1.1.0&lt;/code&gt;, &lt;code&gt;1.2.0&lt;/code&gt;,
&amp;hellip;)&lt;/li&gt;
&lt;li&gt;Other changes lead to a &lt;strong&gt;patch&lt;/strong&gt; version increase (&lt;code&gt;1.0.1&lt;/code&gt;, &lt;code&gt;1.0.2&lt;/code&gt;, &amp;hellip;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="policy-for-breaking-changes"&gt;Policy for breaking changes&lt;a class="anchor" href="#policy-for-breaking-changes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars takes backwards compatibility seriously, but we are not afraid to change things if it leads
to a better product.&lt;/p&gt;
&lt;h3 id="philosophy"&gt;Philosophy&lt;a class="anchor" href="#philosophy"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We don&amp;rsquo;t always get it right on the first try. We learn as we go along and get feedback from our
users. Sometimes, we&amp;rsquo;re a little too eager to get out a new feature and didn&amp;rsquo;t ponder all the
possible implications.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/aggregation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/aggregation/</guid><description>&lt;h1 id="aggregation"&gt;Aggregation&lt;a class="anchor" href="#aggregation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Polars &lt;a href="https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/expressions-and-contexts/#contexts"&gt;context&lt;/a&gt; &lt;code&gt;group_by&lt;/code&gt; lets you apply
expressions on subsets of columns, as defined by the unique values of the column over which the data
is grouped. This is a very powerful capability that we explore in this section of the user guide.&lt;/p&gt;
&lt;p&gt;We start by reading in a
&lt;a href="https://github.com/unitedstates/congress-legislators"&gt;US congress &lt;code&gt;dataset&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/expressions/aggregation&amp;rsquo;,&amp;lsquo;dataframe&amp;rsquo;,[&amp;lsquo;DataFrame&amp;rsquo;,&amp;lsquo;Categorical&amp;rsquo;])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/expressions/aggregation.py:dataframe&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="basic-aggregations"&gt;Basic aggregations&lt;a class="anchor" href="#basic-aggregations"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can easily apply multiple expressions to your aggregated values. Simply list all of the
expressions you want inside the function &lt;code&gt;agg&lt;/code&gt;. There is no upper bound on the number of
aggregations you can do and you can make any combination you want. In the snippet below we will
group the data based on the column “first_name” and then we will apply the following aggregations:&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/casting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/casting/</guid><description>&lt;h1 id="casting"&gt;Casting&lt;a class="anchor" href="#casting"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Casting converts the &lt;a href="https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/data-types-and-structures/"&gt;underlying data type of a column&lt;/a&gt; to
a new one. Casting is available through the function &lt;code&gt;cast&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The function &lt;code&gt;cast&lt;/code&gt; includes a parameter &lt;code&gt;strict&lt;/code&gt; that determines how Polars behaves when it
encounters a value that cannot be converted from the source data type to the target data type. The
default behaviour is &lt;code&gt;strict=True&lt;/code&gt;, which means that Polars will thrown an error to notify the user
of the failed conversion while also providing details on the values that couldn&amp;rsquo;t be cast. On the
other hand, if &lt;code&gt;strict=False&lt;/code&gt;, any values that cannot be converted to the target data type will be
quietly converted to &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/categorical-data-and-enums/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/categorical-data-and-enums/</guid><description>&lt;h1 id="categorical-data-and-enums"&gt;Categorical data and enums&lt;a class="anchor" href="#categorical-data-and-enums"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A column that holds string values that can only take on one of a limited number of possible values
is a column that holds &lt;a href="https://en.wikipedia.org/wiki/Categorical_variable"&gt;categorical data&lt;/a&gt;.
Usually, the number of possible values is much smaller than the length of the column. Some typical
examples include your nationality, the operating system of your computer, or the license that your
favorite open source project uses.&lt;/p&gt;
&lt;p&gt;When working with categorical data you can use Polars&amp;rsquo; dedicated types, &lt;code&gt;Categorical&lt;/code&gt; and &lt;code&gt;Enum&lt;/code&gt;, to
make your queries more performant. Now, we will see what are the differences between the two data
types &lt;code&gt;Categorical&lt;/code&gt; and &lt;code&gt;Enum&lt;/code&gt; and when you should use one data type or the other. We also include
some notes on
&lt;a href="#performance-considerations-on-categorical-data-types"&gt;why the data types &lt;code&gt;Categorical&lt;/code&gt; and &lt;code&gt;Enum&lt;/code&gt; are more efficient than using the plain string values&lt;/a&gt;
in the end of this user guide section.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/expression-expansion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/expression-expansion/</guid><description>&lt;h1 id="expression-expansion"&gt;Expression expansion&lt;a class="anchor" href="#expression-expansion"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As you&amp;rsquo;ve seen in
&lt;a href="https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/expressions-and-contexts/"&gt;the section about expressions and contexts&lt;/a&gt;, expression
expansion is a feature that enables you to write a single expression that can expand to multiple
different expressions, possibly depending on the schema of the context in which the expression is
used.&lt;/p&gt;
&lt;p&gt;This feature isn&amp;rsquo;t just decorative or syntactic sugar. It allows for a very powerful application of
&lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt; principles in your code: a single
expression that specifies multiple columns expands into a list of expressions, which means you can
write one single expression and reuse the computation that it represents.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/folds/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/folds/</guid><description>&lt;h1 id="folds"&gt;Folds&lt;a class="anchor" href="#folds"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars provides many expressions to perform computations across columns, like &lt;code&gt;sum_horizontal&lt;/code&gt;,
&lt;code&gt;mean_horizontal&lt;/code&gt;, and &lt;code&gt;min_horizontal&lt;/code&gt;. However, these are just special cases of a general
algorithm called a fold, and Polars provides a general mechanism for you to compute custom folds for
when the specialised versions of Polars are not enough.&lt;/p&gt;
&lt;p&gt;Folds computed with the function &lt;code&gt;fold&lt;/code&gt; operate on the full columns for maximum speed. They utilize
the data layout very efficiently and often have vectorized execution.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/lists-and-arrays/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/lists-and-arrays/</guid><description>&lt;h1 id="lists-and-arrays"&gt;Lists and arrays&lt;a class="anchor" href="#lists-and-arrays"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars has first-class support for two homogeneous container data types: &lt;code&gt;List&lt;/code&gt; and &lt;code&gt;Array&lt;/code&gt;. Polars
supports many operations with the two data types and their APIs overlap, so this section of the user
guide has the objective of clarifying when one data type should be chosen in favour of the other.&lt;/p&gt;
&lt;h2 id="lists-vs-arrays"&gt;Lists vs arrays&lt;a class="anchor" href="#lists-vs-arrays"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="the-data-type-list"&gt;The data type &lt;code&gt;List&lt;/code&gt;&lt;a class="anchor" href="#the-data-type-list"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The data type list is suitable for columns whose values are homogeneous 1D containers of varying
lengths.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/missing-data/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/missing-data/</guid><description>&lt;h1 id="missing-data"&gt;Missing data&lt;a class="anchor" href="#missing-data"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This section of the user guide teaches how to work with missing data in Polars.&lt;/p&gt;
&lt;h2 id="null-and-nan-values"&gt;&lt;code&gt;null&lt;/code&gt; and &lt;code&gt;NaN&lt;/code&gt; values&lt;a class="anchor" href="#null-and-nan-values"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In Polars, missing data is represented by the value &lt;code&gt;null&lt;/code&gt;. This missing value &lt;code&gt;null&lt;/code&gt; is used for
all data types, including numerical types.&lt;/p&gt;
&lt;p&gt;Polars also supports the value &lt;code&gt;NaN&lt;/code&gt; (“Not a Number”) for columns with floating point numbers. The
value &lt;code&gt;NaN&lt;/code&gt; is considered to be a valid floating point value, which is different from missing data.
&lt;a href="#not-a-number-or-nan-values"&gt;We discuss the value &lt;code&gt;NaN&lt;/code&gt; separately below&lt;/a&gt;.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/numpy-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/numpy-functions/</guid><description>&lt;h1 id="numpy-functions"&gt;Numpy functions&lt;a class="anchor" href="#numpy-functions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars expressions support NumPy &lt;a href="https://numpy.org/doc/stable/reference/ufuncs.html"&gt;ufuncs&lt;/a&gt;. See
&lt;a href="https://numpy.org/doc/stable/reference/ufuncs.html#available-ufuncs"&gt;the NumPy documentation for a list of all supported NumPy functions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This means that if a function is not provided by Polars, we can use NumPy and we still have fast
columnar operations through the NumPy API.&lt;/p&gt;
&lt;h2 id="example"&gt;Example&lt;a class="anchor" href="#example"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/expressions/numpy-example&amp;rsquo;,api_functions=[&amp;lsquo;DataFrame&amp;rsquo;,&amp;rsquo;np.log&amp;rsquo;])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/expressions/numpy-example.py&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="interoperability"&gt;Interoperability&lt;a class="anchor" href="#interoperability"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars&amp;rsquo; series have support for NumPy universal functions (ufuncs) and generalized ufuncs.
Element-wise functions such as &lt;code&gt;np.exp&lt;/code&gt;, &lt;code&gt;np.cos&lt;/code&gt;, &lt;code&gt;np.div&lt;/code&gt;, etc, all work with almost zero
overhead.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/strings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/strings/</guid><description>&lt;h1 id="strings"&gt;Strings&lt;a class="anchor" href="#strings"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The following section discusses operations performed on string data, which is a frequently used data
type when working with dataframes. String processing functions are available in the namespace &lt;code&gt;str&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Working with strings in other dataframe libraries can be highly inefficient due to the fact that
strings have unpredictable lengths. Polars mitigates these inefficiencies by
&lt;a href="https://www.pythondataanalysis.com/docs/Polars_user_guide/concepts/data-types-and-structures/#data-types-internals"&gt;following the Arrow Columnar Format specification&lt;/a&gt;,
so you can write performant data queries on string data too.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/structs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/structs/</guid><description>&lt;h1 id="structs"&gt;Structs&lt;a class="anchor" href="#structs"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The data type &lt;code&gt;Struct&lt;/code&gt; is a composite data type that can store multiple fields in a single column.&lt;/p&gt;
&lt;p&gt;!!! tip &amp;ldquo;Python analogy&amp;rdquo;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;For Python users, the data type `Struct` is kind of like a Python
dictionary. Even better, if you are familiar with Python typing, you can think of the data type
`Struct` as `typing.TypedDict`.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this page of the user guide we will see situations in which the data type &lt;code&gt;Struct&lt;/code&gt; arises, we
will understand why it does arise, and we will see how to work with &lt;code&gt;Struct&lt;/code&gt; values.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/user-defined-python-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/user-defined-python-functions/</guid><description>&lt;h1 id="user-defined-python-functions"&gt;User-defined Python functions&lt;a class="anchor" href="#user-defined-python-functions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;!-- (TODO) add note mentioning the person might be interested in looking at plugins. --&gt;
&lt;p&gt;Polars expressions are quite powerful and flexible, so there is much less need for custom Python
functions compared to other libraries. Still, you may need to pass an expression&amp;rsquo;s state to a third
party library or apply your black box function to data in Polars.&lt;/p&gt;
&lt;p&gt;In this part of the documentation we&amp;rsquo;ll be using two APIs that allows you to do this:&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/window-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/expressions/window-functions/</guid><description>&lt;h1 id="window-functions"&gt;Window functions&lt;a class="anchor" href="#window-functions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Window functions are expressions with superpowers. They allow you to perform aggregations on groups
within the context &lt;code&gt;select&lt;/code&gt;. Let&amp;rsquo;s get a feel for what that means.&lt;/p&gt;
&lt;p&gt;First, we load a Pokémon dataset:&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/expressions/window&amp;rsquo;,&amp;lsquo;pokemon&amp;rsquo;,[&amp;lsquo;read_csv&amp;rsquo;])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/expressions/window.py:pokemon&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="operations-per-group"&gt;Operations per group&lt;a class="anchor" href="#operations-per-group"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Window functions are ideal when we want to perform an operation within a group. For instance,
suppose we want to rank our Pokémon by the column “Speed”. However, instead of a global ranking, we
want to rank the speed within each group defined by the column “Type 1”. We write the expression to
rank the data by the column “Speed” and then we add the function &lt;code&gt;over&lt;/code&gt; to specify that this should
happen over the unique values of the column “Type 1”:&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/polars-cloud/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/polars-cloud/</guid><description>&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/pola-rs/polars-static/refs/heads/master/polars_cloud/polars-cloud.svg" alt="Image showing the Polars Cloud logo" /&gt;&lt;/p&gt;
&lt;h1 id="introducing-polars-cloud"&gt;Introducing Polars Cloud&lt;a class="anchor" href="#introducing-polars-cloud"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;!-- dprint-ignore-start --&gt;
&lt;p&gt;!!! tip &amp;ldquo;Polars Cloud is in alpha stage&amp;rdquo;
Polars Cloud is currently available to a select group of individuals and companies for early-stage testing. You can learn more about Polars Cloud and its goals in &lt;a href="https://pola.rs/posts/polars-cloud-what-we-are-building/"&gt;our recent announcement post&lt;/a&gt;.&lt;/p&gt;
&lt;!-- dprint-ignore-end--&gt;
&lt;p&gt;DataFrame implementations always differed from SQL and databases. SQL could run anywhere from
embedded databases to massive data warehouses. Yet, DataFrame users have been forced to choose
between a solution for local work or solutions geared towards distributed computing, each with their
own APIs and limitations.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/ecosystem/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/ecosystem/</guid><description>&lt;h1 id="ecosystem"&gt;Ecosystem&lt;a class="anchor" href="#ecosystem"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On this page you can find a non-exhaustive list of libraries and tools that support Polars. As the
data ecosystem is evolving fast, more libraries will likely support Polars in the future. One of the
main drivers is that Polars makes adheres its memory layout to the &lt;code&gt;Apache Arrow&lt;/code&gt; spec.&lt;/p&gt;
&lt;h3 id="table-of-contents"&gt;Table of contents:&lt;a class="anchor" href="#table-of-contents"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#apache-arrow"&gt;Apache Arrow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#data-visualisation"&gt;Data visualisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#io"&gt;IO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#machine-learning"&gt;Machine learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#other"&gt;Other&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="apache-arrow"&gt;Apache Arrow&lt;a class="anchor" href="#apache-arrow"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://arrow.apache.org/"&gt;Apache Arrow&lt;/a&gt; enables zero-copy reads of data within the same process,
meaning that data can be directly accessed in its in-memory format without the need for copying or
serialisation. This enhances performance when integrating with different tools using Apache Arrow.
Polars is compatible with a wide range of libraries that also make use of Apache Arrow, like Pandas
and DuckDB.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/gpu-support/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/gpu-support/</guid><description>&lt;h1 id="gpu-support-open-beta"&gt;GPU Support [Open Beta]&lt;a class="anchor" href="#gpu-support-open-beta"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars provides an in-memory, GPU-accelerated execution engine for Python users of the Lazy API on
NVIDIA GPUs using &lt;a href="https://docs.rapids.ai/api/cudf/stable/"&gt;RAPIDS cuDF&lt;/a&gt;. This functionality is
available in Open Beta and is undergoing rapid development.&lt;/p&gt;
&lt;h3 id="system-requirements"&gt;System Requirements&lt;a class="anchor" href="#system-requirements"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;NVIDIA Volta™ or higher GPU with &lt;a href="https://developer.nvidia.com/cuda-gpus"&gt;compute capability&lt;/a&gt; 7.0+&lt;/li&gt;
&lt;li&gt;CUDA 11 or CUDA 12&lt;/li&gt;
&lt;li&gt;Linux or Windows Subsystem for Linux 2 (WSL2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href="https://docs.rapids.ai/install#system-req"&gt;RAPIDS installation guide&lt;/a&gt; for full details.&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can install the GPU backend for Polars with a feature flag as part of a normal
&lt;a href="installation.md"&gt;installation&lt;/a&gt;.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/io/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/io/</guid><description>&lt;h1 id="io"&gt;IO&lt;a class="anchor" href="#io"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Reading and writing your data is crucial for a DataFrame library. In this chapter you will learn
more on how to read and write to different file formats that are supported by Polars.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="csv.md"&gt;CSV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="excel.md"&gt;Excel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="parquet.md"&gt;Parquet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="json.md"&gt;Json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="multiple.md"&gt;Multiple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="hive.md"&gt;Hive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="database.md"&gt;Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="cloud-storage.md"&gt;Cloud storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="bigquery.md"&gt;Google Big Query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="hugging-face.md"&gt;Hugging Face&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/lazy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/lazy/</guid><description>&lt;h1 id="lazy"&gt;Lazy&lt;a class="anchor" href="#lazy"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Lazy chapter is a guide for working with &lt;code&gt;LazyFrames&lt;/code&gt;. It covers the functionalities like how to
use it and how to optimise it. You can also find more information about the query plan or gain more
insight in the streaming capabilities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="using.md"&gt;Using lazy API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="optimizations.md"&gt;Optimisations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="schemas.md"&gt;Schemas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="query-plan.md"&gt;Query plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="execution.md"&gt;Execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="streaming.md"&gt;Streaming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="gpu.md"&gt;GPU Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/migration/pandas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/migration/pandas/</guid><description>&lt;h1 id="coming-from-pandas"&gt;Coming from Pandas&lt;a class="anchor" href="#coming-from-pandas"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here we set out the key points that anyone who has experience with pandas and wants to try Polars
should know. We include both differences in the concepts the libraries are built on and differences
in how you should write Polars code compared to pandas code.&lt;/p&gt;
&lt;h2 id="differences-in-concepts-between-polars-and-pandas"&gt;Differences in concepts between Polars and pandas&lt;a class="anchor" href="#differences-in-concepts-between-polars-and-pandas"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="polars-does-not-have-a-multi-indexindex"&gt;Polars does not have a multi-index/index&lt;a class="anchor" href="#polars-does-not-have-a-multi-indexindex"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;pandas gives a label to each row with an index. Polars does not use an index and each row is indexed
by its integer position in the table.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/migration/spark/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/migration/spark/</guid><description>&lt;h1 id="coming-from-apache-spark"&gt;Coming from Apache Spark&lt;a class="anchor" href="#coming-from-apache-spark"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="column-based-api-vs-row-based-api"&gt;Column-based API vs. Row-based API&lt;a class="anchor" href="#column-based-api-vs-row-based-api"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Whereas the &lt;code&gt;Spark&lt;/code&gt; &lt;code&gt;DataFrame&lt;/code&gt; is analogous to a collection of rows, a Polars &lt;code&gt;DataFrame&lt;/code&gt; is closer
to a collection of columns. This means that you can combine columns in Polars in ways that are not
possible in &lt;code&gt;Spark&lt;/code&gt;, because &lt;code&gt;Spark&lt;/code&gt; preserves the relationship of the data in each row.&lt;/p&gt;
&lt;p&gt;Consider this sample dataset:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; polars &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; pl
&lt;/span&gt;&lt;/span&gt;&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 &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; pl&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;DataFrame({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: [&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;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;dfs &lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt; spark&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;createDataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;2&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;3&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#5af78e"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style="color:#ff9f43"&gt;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; schema&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;[&lt;span style="color:#5af78e"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;bar&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="example-1-combining-head-and-sum"&gt;Example 1: Combining &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;sum&lt;/code&gt;&lt;a class="anchor" href="#example-1-combining-head-and-sum"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Polars you can write something like this:&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/arrow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/arrow/</guid><description>&lt;h1 id="arrow-producerconsumer"&gt;Arrow producer/consumer&lt;a class="anchor" href="#arrow-producerconsumer"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="using-pyarrow"&gt;Using pyarrow&lt;a class="anchor" href="#using-pyarrow"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars can move data in and out of arrow zero copy. This can be done either via pyarrow or natively.
Let&amp;rsquo;s first start by showing the pyarrow solution:&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/arrow&amp;rsquo;,&amp;rsquo;to_arrow&amp;rsquo;,[])}}&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pyarrow.Table
foo: int64
bar: large_string
----
foo: [[1,2,3]]
bar: [[&amp;#34;ham&amp;#34;,&amp;#34;spam&amp;#34;,&amp;#34;jam&amp;#34;]]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or if you want to ensure the output is zero-copy:&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/arrow&amp;rsquo;,&amp;rsquo;to_arrow_zero&amp;rsquo;,[])}}&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pyarrow.Table
foo: int64
bar: string_view
----
foo: [[1,2,3]]
bar: [[&amp;#34;ham&amp;#34;,&amp;#34;spam&amp;#34;,&amp;#34;jam&amp;#34;]]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Importing from pyarrow can be achieved with &lt;code&gt;pl.from_arrow&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="using-the-arrow-pycapsule-interface"&gt;Using the Arrow PyCapsule Interface&lt;a class="anchor" href="#using-the-arrow-pycapsule-interface"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As of Polars v1.3 and higher, Polars implements the
&lt;a href="https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html"&gt;Arrow PyCapsule Interface&lt;/a&gt;,
a protocol for sharing Arrow data across Python libraries.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/comparison/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/comparison/</guid><description>&lt;h1 id="comparison-with-other-tools"&gt;Comparison with other tools&lt;a class="anchor" href="#comparison-with-other-tools"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;These are several libraries and tools that share similar functionalities with Polars. This often
leads to questions from data experts about what the differences are. Below is a short comparison
between some of the more popular data processing tools and Polars, to help data experts make a
deliberate decision on which tool to use.&lt;/p&gt;
&lt;p&gt;You can find performance benchmarks (h2oai benchmark) of these tools here:
&lt;a href="https://pola.rs/posts/benchmarks/"&gt;Polars blog post&lt;/a&gt; or a more recent benchmark
&lt;a href="https://duckdblabs.github.io/db-benchmark/"&gt;done by DuckDB&lt;/a&gt;&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/multiprocessing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/multiprocessing/</guid><description>&lt;h1 id="multiprocessing"&gt;Multiprocessing&lt;a class="anchor" href="#multiprocessing"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;TLDR: if you find that using Python&amp;rsquo;s built-in &lt;code&gt;multiprocessing&lt;/code&gt; module together with Polars results
in a Polars error about multiprocessing methods, you should make sure you are using &lt;code&gt;spawn&lt;/code&gt;, not
&lt;code&gt;fork&lt;/code&gt;, as the starting method:&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/multiprocess&amp;rsquo;,&amp;lsquo;recommendation&amp;rsquo;,[])}}&lt;/p&gt;
&lt;h2 id="when-not-to-use-multiprocessing"&gt;When not to use multiprocessing&lt;a class="anchor" href="#when-not-to-use-multiprocessing"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before we dive into the details, it is important to emphasize that Polars has been built from the
start to use all your CPU cores. It does this by executing computations which can be done in
parallel in separate threads. For example, requesting two expressions in a &lt;code&gt;select&lt;/code&gt; statement can be
done in parallel, with the results only being combined at the end. Another example is aggregating a
value within groups using &lt;code&gt;group_by().agg(&amp;lt;expr&amp;gt;)&lt;/code&gt;, each group can be evaluated separately. It is
very unlikely that the &lt;code&gt;multiprocessing&lt;/code&gt; module can improve your code performance in these cases. If
you&amp;rsquo;re using the GPU Engine with Polars you should also avoid manual multiprocessing. When used
simultaneously, they can compete for system memory and processing power, leading to reduced
performance.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/polars_llms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/polars_llms/</guid><description>&lt;h1 id="generating-polars-code-with-llms"&gt;Generating Polars code with LLMs&lt;a class="anchor" href="#generating-polars-code-with-llms"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Large Language Models (LLMs) can sometimes return Pandas code or invalid Polars code in their
output. This guide presents approaches that help LLMs generate valid Polars code more consistently.&lt;/p&gt;
&lt;p&gt;These approaches have been developed by the Polars community through testing model responses to
various inputs. If you find additional effective approaches for generating Polars code from LLMs,
please raise a &lt;a href="https://github.com/pola-rs/polars/pulls"&gt;pull request&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="system-prompt"&gt;System prompt&lt;a class="anchor" href="#system-prompt"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many LLMs allow you to provide a system prompt that is included with every individual prompt you
send to the model. In the system prompt, you can specify your preferred defaults, such as &amp;ldquo;Use
Polars as the default dataframe library&amp;rdquo;. Including such a system prompt typically leads to models
consistently generating Polars code rather than Pandas code.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/styling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/styling/</guid><description>&lt;h1 id="styling"&gt;Styling&lt;a class="anchor" href="#styling"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Data in a Polars &lt;code&gt;DataFrame&lt;/code&gt; can be styled for presentation use the &lt;code&gt;DataFrame.style&lt;/code&gt; property. This
returns a &lt;code&gt;GT&lt;/code&gt; object from
&lt;a href="https://posit-dev.github.io/great-tables/articles/intro.html"&gt;Great Tables&lt;/a&gt;, which enables
structuring, formatting, and styling for table display.&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;dataframe&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:dataframe&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="structure-add-header-title"&gt;Structure: add header title&lt;a class="anchor" href="#structure-add-header-title"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;structure-header&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:structure-header-out&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="structure-add-row-stub"&gt;Structure: add row stub&lt;a class="anchor" href="#structure-add-row-stub"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;structure-stub&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:structure-stub-out&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="structure-add-column-spanner"&gt;Structure: add column spanner&lt;a class="anchor" href="#structure-add-column-spanner"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;structure-spanner&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:structure-spanner-out&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="format-limit-decimal-places"&gt;Format: limit decimal places&lt;a class="anchor" href="#format-limit-decimal-places"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;format-number&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:format-number-out&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="style-highlight-max-row"&gt;Style: highlight max row&lt;a class="anchor" href="#style-highlight-max-row"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;style-simple&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:style-simple-out&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="style-bold-species-column"&gt;Style: bold species column&lt;a class="anchor" href="#style-bold-species-column"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;style-bold-column&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:style-bold-column-out&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="full-example"&gt;Full example&lt;a class="anchor" href="#full-example"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/styling&amp;rsquo;,&amp;lsquo;full-example&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/styling.py:full-example-out&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/visualization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/misc/visualization/</guid><description>&lt;h1 id="visualization"&gt;Visualization&lt;a class="anchor" href="#visualization"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Data in a Polars &lt;code&gt;DataFrame&lt;/code&gt; can be visualized using common visualization libraries.&lt;/p&gt;
&lt;p&gt;We illustrate plotting capabilities using the Iris dataset. We read a CSV and then plot one column
against another, colored by a yet another column.&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/visualization&amp;rsquo;,&amp;lsquo;dataframe&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/visualization.py:dataframe&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="built-in-plotting-with-altair"&gt;Built-in plotting with Altair&lt;a class="anchor" href="#built-in-plotting-with-altair"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars has a &lt;code&gt;plot&lt;/code&gt; method to create plots using &lt;a href="https://altair-viz.github.io/"&gt;Altair&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;{{code_block(&amp;lsquo;user-guide/misc/visualization&amp;rsquo;,&amp;lsquo;altair_show_plot&amp;rsquo;,[])}}&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;--&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;8&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;&amp;lt;--&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;python/user-guide/misc/visualization.py:altair_make_plot&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is shorthand for:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-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:#ff6ac1"&gt;import&lt;/span&gt; altair &lt;span style="color:#ff6ac1"&gt;as&lt;/span&gt; alt
&lt;/span&gt;&lt;/span&gt;&lt;span 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; alt&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;Chart(df)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;mark_point(tooltip&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;True&lt;/span&gt;)&lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;encode(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;sepal_length&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;sepal_width&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; color&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;species&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:#ff6ac1"&gt;.&lt;/span&gt;properties(width&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff9f43"&gt;500&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;.&lt;/span&gt;configure_scale(zero&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#ff6ac1"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and is only provided for convenience, and to signal that Altair is known to work well with Polars.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/plugins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/plugins/</guid><description>&lt;h1 id="plugins"&gt;Plugins&lt;a class="anchor" href="#plugins"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Polars allows you to extend its functionality with either Expression plugins or IO plugins.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="./expr_plugins.md"&gt;Expression plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="./io_plugins.md"&gt;IO plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="community-plugins"&gt;Community plugins&lt;a class="anchor" href="#community-plugins"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is a curated (non-exhaustive) list of community-implemented plugins.&lt;/p&gt;
&lt;h3 id="various"&gt;Various&lt;a class="anchor" href="#various"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pola-rs/polars-xdt"&gt;polars-xdt&lt;/a&gt; Polars plugin with extra datetime-related
functionality which isn&amp;rsquo;t quite in-scope for the main library&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ion-elgreco/polars-hash"&gt;polars-hash&lt;/a&gt; Stable non-cryptographic and
cryptographic hashing functions for Polars&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="data-science"&gt;Data science&lt;a class="anchor" href="#data-science"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ion-elgreco/polars-distance"&gt;polars-distance&lt;/a&gt; Polars plugin for pairwise
distance functions&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/abstractqqq/polars_ds_extension"&gt;polars-ds&lt;/a&gt; Polars extension aiming to
simplify common numerical/string data analysis procedures&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="geo"&gt;Geo&lt;a class="anchor" href="#geo"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Oreilles/polars-st"&gt;polars-st&lt;/a&gt; Polars ST provides spatial operations on Polars
DataFrames, Series and Expressions. Just like Shapely and Geopandas.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MarcoGorelli/polars-reverse-geocode"&gt;polars-reverse-geocode&lt;/a&gt; Offline reverse
geocoder for finding the closest city to a given (latitude, longitude) pair.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Filimoa/polars-h3"&gt;polars-h3&lt;/a&gt; This is a Polars extension that adds support for
the H3 discrete global grid system, so you can index points and geometries to hexagons directly in
Polars.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other-material"&gt;Other material&lt;a class="anchor" href="#other-material"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/jKW-CBV7NUM"&gt;Ritchie Vink - Keynote on Polars Plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marcogorelli.github.io/polars-plugins-tutorial/"&gt;Polars plugins tutorial&lt;/a&gt; Learn how to
write a plugin by going through some very simple and minimal examples&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MarcoGorelli/cookiecutter-polars-plugins"&gt;cookiecutter-polars-plugin&lt;/a&gt; Project
template for Polars Plugins&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/create/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/create/</guid><description>&lt;h1 id="create"&gt;CREATE&lt;a class="anchor" href="#create"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In Polars, the &lt;code&gt;SQLContext&lt;/code&gt; provides a way to execute SQL statements against &lt;code&gt;LazyFrames&lt;/code&gt; and
&lt;code&gt;DataFrames&lt;/code&gt; using SQL syntax. One of the SQL statements that can be executed using &lt;code&gt;SQLContext&lt;/code&gt; is
the &lt;code&gt;CREATE TABLE&lt;/code&gt; statement, which is used to create a new table.&lt;/p&gt;
&lt;p&gt;The syntax for the &lt;code&gt;CREATE TABLE&lt;/code&gt; statement in Polars is as follows:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE TABLE table_name
AS
SELECT ...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this syntax, &lt;code&gt;table_name&lt;/code&gt; is the name of the new table that will be created, and &lt;code&gt;SELECT ...&lt;/code&gt; is
a SELECT statement that defines the data that will be inserted into the table.&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/cte/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/cte/</guid><description>&lt;h1 id="common-table-expressions"&gt;Common Table Expressions&lt;a class="anchor" href="#common-table-expressions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Common Table Expressions (CTEs) are a feature of SQL that allow you to define a temporary named
result set that can be referenced within a SQL statement. CTEs provide a way to break down complex
SQL queries into smaller, more manageable pieces, making them easier to read, write, and maintain.&lt;/p&gt;
&lt;p&gt;A CTE is defined using the &lt;code&gt;WITH&lt;/code&gt; keyword followed by a comma-separated list of subqueries, each of
which defines a named result set that can be used in subsequent queries. The syntax for a CTE is as
follows:&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/intro/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/intro/</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;While Polars supports interaction with SQL, it&amp;rsquo;s recommended that users familiarize themselves with
the &lt;a href="../concepts/expressions-and-contexts.md#expressions#expressions"&gt;expression syntax&lt;/a&gt; to produce more
readable and expressive code. As the DataFrame interface is primary, new features are typically
added to the expression API first. However, if you already have an existing SQL codebase or prefer
the use of SQL, Polars does offers support for this.&lt;/p&gt;
&lt;p&gt;!!! note Execution&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;There is no separate SQL engine because Polars translates SQL queries into [expressions](../concepts/expressions-and-contexts.md#expressions), which are then executed using its own engine. This approach ensures that Polars maintains its performance and scalability advantages as a native DataFrame library, while still providing users with the ability to work with SQL.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="context"&gt;Context&lt;a class="anchor" href="#context"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Polars uses the &lt;code&gt;SQLContext&lt;/code&gt; object to manage SQL queries. The context contains a mapping of
&lt;code&gt;DataFrame&lt;/code&gt; and &lt;code&gt;LazyFrame&lt;/code&gt; identifier names to their corresponding datasets&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;. The example below
starts a &lt;code&gt;SQLContext&lt;/code&gt;:&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/select/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/select/</guid><description>&lt;h1 id="select"&gt;SELECT&lt;a class="anchor" href="#select"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In Polars SQL, the &lt;code&gt;SELECT&lt;/code&gt; statement is used to retrieve data from a table into a &lt;code&gt;DataFrame&lt;/code&gt;. The
basic syntax of a &lt;code&gt;SELECT&lt;/code&gt; statement in Polars SQL is as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;SELECT&lt;/span&gt; column1, column2, ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;FROM&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;table_name&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, &lt;code&gt;column1&lt;/code&gt;, &lt;code&gt;column2&lt;/code&gt;, etc. are the columns that you want to select from the table. You can
also use the wildcard &lt;code&gt;*&lt;/code&gt; to select all columns. &lt;code&gt;table_name&lt;/code&gt; is the name of the table or that you
want to retrieve data from. In the sections below we will cover some of the more common SELECT
variants&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/show/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/sql/show/</guid><description>&lt;h1 id="show-tables"&gt;SHOW TABLES&lt;a class="anchor" href="#show-tables"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In Polars, the &lt;code&gt;SHOW TABLES&lt;/code&gt; statement is used to list all the tables that have been registered in
the current &lt;code&gt;SQLContext&lt;/code&gt;. When you register a DataFrame with the &lt;code&gt;SQLContext&lt;/code&gt;, you give it a name
that can be used to refer to the DataFrame in subsequent SQL statements. The &lt;code&gt;SHOW TABLES&lt;/code&gt; statement
allows you to see a list of all the registered tables, along with their names.&lt;/p&gt;
&lt;p&gt;The syntax for the &lt;code&gt;SHOW TABLES&lt;/code&gt; statement in Polars is as follows:&lt;/p&gt;</description></item><item><title/><link>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/transformations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pythondataanalysis.com/docs/Polars_user_guide/user-guide/transformations/</guid><description>&lt;h1 id="transformations"&gt;Transformations&lt;a class="anchor" href="#transformations"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The focus of this section is to describe different types of data transformations and provide some
examples on how to use them.&lt;/p&gt;
&lt;!-- (TODO) incomplete --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="joins.md"&gt;Joins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="concatenation.md"&gt;Concatenation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="pivot.md"&gt;Pivot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="unpivot.md"&gt;Unpivot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>