wordpress模板获取数据库桂林网站seo
news/
2025/9/25 16:53:38/
文章来源:
wordpress模板获取数据库,桂林网站seo,wordpress网页访问权限设置,赣州网站建设百家号本文来源公众号“萝卜大杂烩”#xff0c;仅用于学术分享#xff0c;侵权删#xff0c;干货满满。
原文链接#xff1a;Polars (最强Pandas平替)
本文章转自#xff1a;数据studio
1 介绍
Polars是一个用于操作结构化数据的高性能DataFrame库#xff0c;可以说是平替…本文来源公众号“萝卜大杂烩”仅用于学术分享侵权删干货满满。
原文链接Polars (最强Pandas平替)
本文章转自数据studio
1 介绍
Polars是一个用于操作结构化数据的高性能DataFrame库可以说是平替pandas最有潜质的包。当然pandas目前作为Python数据分析的核心工具来说还是最强的完全值得我们深入学习。Polars其核心部分是用Rust编写的但该库也提供了Python接口。它的主要特点包括 快速: Polars是从零开始编写的紧密与机器结合没有外部依赖。 I/O: 对所有常见数据存储层提供一流支持本地、云存储和数据库。 易于使用: 以原始意图编写查询。Polars 在内部会使用其查询优化器确定执行最有效的方式。 离线处理: Polars支持通过其流式API进行离线数据转换。这使您能够处理结果而无需同时将所有数据存储在内存中。 并行处理: Polars通过在可用的CPU核心之间分配工作负载充分利用计算机性能而无需额外配置。 矢量化查询引擎: Polars使用 Apache Arrow一种列式数据格式以矢量化方式处理查询。它使用 SIMD 来优化CPU使用。
User guide: https://pola-rs.github.io/polars/user-guide/ API reference: https://pola-rs.github.io/polars/py-polars/html/reference/io.html
Polars 的目标是提供一个闪电般快速的 DataFrame 库具有以下特点 利用计算机上所有可用的核心。 通过优化查询来减少不必要的工作/内存分配。 处理比可用 RAM 更大得多的数据集。 具有一致且可预测的 API。 具有严格的模式在运行查询之前应该知道数据类型。
Polars 是用 Rust 编写的这使得它具有 C/C 性能并允许它完全控制查询引擎中的性能关键部分。因此Polars 为此付出了很大的努力 减少冗余的复制。 高效地遍历内存缓存。 在并行性中最小化争用。 以块处理数据。 重用内存分配。
2 基础
2.1 Series DataFrames
Series 是一个一维数据结构。在一个 Series 中所有元素都具有相同的数据类型例如整数、字符串。下面的片段展示了如何创建一个简单的带有名称的 Series 对象。
import polars as pl
import numpy as nps pl.Series(a, [1, 2, 3, 4, 5])
print(s)
s pl.Series(a, [1, 2, 3, 4, 5])
print(s.min())
print(s.max())
s pl.Series(a, [polar, bear, arctic, polar fox, polar bear])
s2 s.str.replace(polar, pola)
print(s2)
from datetime import datestart date(2001, 1, 1)
stop date(2001, 1, 9)
s pl.date_range(start, stop, interval2d, eagerTrue)
print(s.dt.day())DataFrame 是一个二维数据结构由一个或多个 Series 支持可以看作是对一系列例如列表Series的抽象。在 DataFrame 上可以执行的操作与在 SQL 查询中执行的操作非常相似。您可以进行 GROUP BY、JOIN、PIVOT还可以定义自定义函数。
from datetime import datetimedf pl.DataFrame({integer: [1, 2, 3, 4, 5],date: [datetime(2022, 1, 1),datetime(2022, 1, 2),datetime(2022, 1, 3),datetime(2022, 1, 4),datetime(2022, 1, 5),],float: [4.0, 5.0, 6.0, 7.0, 8.0],}
)print(df)
print(df.head(3))
print(df.describe())2.2 Reading writing
import polars as pl
from datetime import datetimedf pl.DataFrame({integer: [1, 2, 3],date: [datetime(2022, 1, 1),datetime(2022, 1, 2),datetime(2022, 1, 3),],float: [4.0, 5.0, 6.0],}
)print(df)
df.write_csv(output.csv)
df_csv pl.read_csv(output.csv)
print(df_csv)
df_csv pl.read_csv(output.csv, try_parse_datesTrue)
print(df_csv)2.3 Expressions
import polars as pl# 创建一个简单的 DataFrame
data {column1: [1, 2, 3],column2: [a, b, c]}
df pl.DataFrame(data)# 使用表达式进行选择
selected_df df.select([column1])# 使用表达式进行过滤
filtered_df df.filter(df[column1] 1)
selected_df
filtered_df3 拼接
df pl.DataFrame({a: np.arange(0, 8),b: np.random.rand(8),d: [1, 2.0, np.NaN, np.NaN, 0, -5, -42, None],}
)df2 pl.DataFrame({x: np.arange(0, 8),y: [A, A, A, B, B, C, X, X],}
)
joined df.join(df2, left_ona, right_onx)
print(joined)
stacked df.hstack(df2)
print(stacked)4 概念
4.1 Data types
Polars 完全基于 Arrow 数据类型并由 Arrow 内存数组支持。这使得数据处理在缓存效率和跨进程通信方面得到良好支持。大多数数据类型都与 Arrow 的实现完全一致但有一些例外如Utf8实际上是 LargeUtf8、Categorical 和 Object支持有限等。以下是一些数据类型 4.2 Contexts
Polars 已经开发了自己的领域特定语言DSL用于数据转换。该语言非常易于使用允许进行复杂的查询同时保持人类可读性。该语言的两个核心组件是上下文Contexts和表达式Expressions我们将在下一部分介绍表达式。
正如名称所示上下文指的是需要评估表达式的上下文。有三个主要的上下文 [^1^] 选择Selection: df.select([..]), df.with_columns([..]) 过滤Filtering: df.filter() 分组/聚合Group by / Aggregation: df.group_by(..).agg([..])
df pl.DataFrame({nrs: [1, 2, 3, None, 5],names: [foo, ham, spam, egg, None],random: np.random.rand(5),groups: [A, A, B, C, B],}
)
print(df)
# 基于df 进行计算得到新的表格
out df.select(pl.sum(nrs), # nrs的和pl.col(names).sort(), # names排序后的结果pl.col(names).first().alias(first name), # names第一个值(pl.mean(nrs) * 10).alias(10xnrs), # nrs的均值 * 10
)
print(out)
# 原始df 新增列
df df.with_columns(pl.sum(nrs).alias(nrs_sum),pl.col(random).count().alias(count),
)
print(df)
out df.filter(pl.col(nrs) 2)
print(out)
out df.group_by(groups).agg(pl.sum(nrs), # sum nrs by groupspl.col(random).count().alias(count), # count group members# sum random where name ! nullpl.col(random).filter(pl.col(names).is_not_null()).sum().name.suffix(_sum),pl.col(names).reverse().alias(reversed names),
)
print(out)4.3 Lazy / eager API
Polars支持两种操作模式lazy延迟和eager即时。在eager API中查询会立即执行而在lazy API中查询只有在“需要”时才会被评估。
!wget https://mirror.coggle.club/dataset/heart.csv
!head heart.csv
df pl.read_csv(heart.csv)
df_small df.filter(pl.col(age) 5)
df_agg df_small.group_by(sex).agg(pl.col(chol).mean())
print(df_agg)
q (pl.scan_csv(heart.csv).filter(pl.col(age) 5).group_by(sex).agg(pl.col(chol).mean())
)
# 生成了计算逻辑df q.collect() # 真正计算
print(df)4.4 Streaming API
https://pola-rs.github.io/polars/user-guide/concepts/streaming/
Lazy API的另一个额外好处是它允许以流式方式执行查询。与一次性处理所有数据不同Polars可以按批执行查询使您能够处理大于内存的数据集。
q (pl.scan_csv(heart.csv).filter(pl.col(age) 5).group_by(sex).agg(pl.col(chol).mean())
)df q.collect(streamingTrue)
print(df)5 表达式
5.1 Basic operators
df pl.DataFrame({nrs: [1, 2, 3, None, 5],names: [foo, ham, spam, egg, None],random: np.random.rand(5),groups: [A, A, B, C, B],}
)
print(df)
df_numerical df.select((pl.col(nrs) 5).alias(nrs 5),(pl.col(nrs) - 5).alias(nrs - 5),(pl.col(nrs) * pl.col(random)).alias(nrs * random),(pl.col(nrs) / pl.col(random)).alias(nrs / random),
)
print(df_numerical)
df_logical df.select((pl.col(nrs) 1).alias(nrs 1),(pl.col(random) 0.5).alias(random .5),(pl.col(nrs) ! 1).alias(nrs ! 1),(pl.col(nrs) 1).alias(nrs 1),((pl.col(random) 0.5) (pl.col(nrs) 1)).alias(and_expr), # and((pl.col(random) 0.5) | (pl.col(nrs) 1)).alias(or_expr), # or
)
print(df_logical)5.2 Column selections
from datetime import date, datetimedf pl.DataFrame({id: [9, 4, 2],place: [Mars, Earth, Saturn],date: pl.date_range(date(2022, 1, 1), date(2022, 1, 3), 1d, eagerTrue),sales: [33.4, 2142134.1, 44.7],has_people: [False, True, False],logged_at: pl.datetime_range(datetime(2022, 12, 1), datetime(2022, 12, 1, 0, 0, 2), 1s, eagerTrue),}
).with_row_count(rn)
print(df)
out df.select(pl.col(*))# Is equivalent to
out df.select(pl.all())
print(out)
out df.select(pl.col(*).exclude(logged_at, rn))
print(out)
out df.select(pl.col(date, logged_at).dt.to_string(%Y-%h-%d))
print(out)
out df.select(pl.col(^.*(as|sa).*$))
print(out)
out df.select(pl.col(pl.Int64, pl.UInt32, pl.Boolean).n_unique())
print(out)
import polars.selectors as cs
out df.select(cs.numeric() - cs.first())
print(out)
out df.select(cs.contains(rn), cs.matches(.*_.*))
print(out)5.3 Functions
df pl.DataFrame({nrs: [1, 2, 3, None, 5],names: [foo, ham, spam, egg, spam],random: np.random.rand(5),groups: [A, A, B, C, B],}
)
print(df)
df_samename df.select(pl.col(nrs) 5)
print(df_samename)
df_alias df.select((pl.col(nrs) 5).alias(nrs 5),(pl.col(nrs) - 5).alias(nrs - 5),
)
print(df_alias)
df_alias df.select(pl.col(names).n_unique().alias(unique),pl.approx_n_unique(names).alias(unique_approx),
)
print(df_alias)
df_conditional df.select(pl.col(nrs),pl.when(pl.col(nrs) 2).then(pl.lit(True)).otherwise(pl.lit(False)).alias(conditional),
)
print(df_conditional)6 转换
类型转换Casting将列的底层 DataType 转换为新的数据类型。Polars 使用 Arrow 在内存中管理数据并依赖于 Rust 实现中的计算核心 来执行转换。类型转换通过 cast() 方法实现。
cast 方法包括一个 strict 参数该参数确定当 Polars 遇到无法从源 DataType 转换为目标 DataType 的值时的行为。默认情况下strictTrue这意味着 Polars 将引发错误通知用户转换失败并提供无法转换的值的详细信息。另一方面如果 strictFalse无法转换为目标 DataType 的任何值都将悄悄地转换为 null。
df pl.DataFrame({integers: [1, 2, 3, 4, 5],big_integers: [1, 10000002, 3, 10000004, 10000005],floats: [4.0, 5.0, 6.0, 7.0, 8.0],floats_with_decimal: [4.532, 5.5, 6.5, 7.5, 8.5],}
)print(df)
out df.select(pl.col(integers).cast(pl.Float32).alias(integers_as_floats),pl.col(floats).cast(pl.Int32).alias(floats_as_integers),pl.col(floats_with_decimal).cast(pl.Int32).alias(floats_with_decimal_as_integers),
)
print(out)
out df.select(pl.col(integers).cast(pl.Int16).alias(integers_smallfootprint),pl.col(floats).cast(pl.Float32).alias(floats_smallfootprint),
)
print(out)
df pl.DataFrame({integers: [1, 2, 3, 4, 5],float: [4.0, 5.03, 6.0, 7.0, 8.0],floats_as_string: [4.0, 5.0, 6.0, 7.0, 8.0],}
)out df.select(pl.col(integers).cast(pl.Utf8),pl.col(float).cast(pl.Utf8),pl.col(floats_as_string).cast(pl.Float64),
)
print(out)
df pl.DataFrame({integers: [-1, 0, 2, 3, 4],floats: [0.0, 1.0, 2.0, 3.0, 4.0],bools: [True, False, True, False, True],}
)out df.select(pl.col(integers).cast(pl.Boolean), pl.col(floats).cast(pl.Boolean))
print(out)
from datetime import date, datetimedf pl.DataFrame({date: pl.date_range(date(2022, 1, 1), date(2022, 1, 5), eagerTrue),datetime: pl.datetime_range(datetime(2022, 1, 1), datetime(2022, 1, 5), eagerTrue),}
)out df.select(pl.col(date).cast(pl.Int64), pl.col(datetime).cast(pl.Int64))
print(out)6.1 Strings
df pl.DataFrame({animal: [Crab, cat and dog, rab$bit, None]})out df.select(pl.col(animal).str.len_bytes().alias(byte_count),pl.col(animal).str.len_chars().alias(letter_count),
)
print(out)
out df.select(pl.col(animal),pl.col(animal).str.contains(cat|bit).alias(regex),pl.col(animal).str.contains(rab$, literalTrue).alias(literal),pl.col(animal).str.starts_with(rab).alias(starts_with),pl.col(animal).str.ends_with(dog).alias(ends_with),
)
print(out)6.2 Aggregation
https://pola-rs.github.io/polars/user-guide/expressions/aggregation/
df pl.read_csv(heart.csv)
print(df)
q (df.lazy().group_by(sex).agg(pl.count(),pl.col(cp),pl.first(caa),).sort(count, descendingTrue).limit(5)
)df q.collect()
print(df)
q (df.lazy().group_by(sex).agg((pl.col(cp) 1).sum().alias(anti),(pl.col(cp) 2).sum().alias(pro),).sort(pro, descendingTrue).limit(5)
)df q.collect()
print(df)7 缺失值
让我们看一下缺失值如何处理。
df pl.DataFrame({value: [1, None],},
)
print(df)
null_count_df df.null_count()
print(null_count_df)
df pl.DataFrame({col1: [1, 2, 3],col2: [1, None, 3],},
)
print(df)
fill_literal_df df.with_columns(pl.col(col2).fill_null(pl.lit(2)),
)
print(fill_literal_df)
fill_forward_df df.with_columns(pl.col(col2).fill_null(strategyforward),
)
print(fill_forward_df)
fill_median_df df.with_columns(pl.col(col2).fill_null(pl.median(col2)),
)
print(fill_median_df)
fill_interpolation_df df.with_columns(pl.col(col2).interpolate(),
)
print(fill_interpolation_df)7.1 Window functions
https://pola-rs.github.io/polars/user-guide/expressions/window/
!wget https://cdn.coggle.club/Pokemon.csv
!head Pokemon.csv
# then lets load some csv data with information about pokemon
df pl.read_csv(Pokemon.csv)
print(df.head())
out df.select(Type 1,Type 2,pl.col(Attack).mean().over(Type 1).alias(avg_attack_by_type),pl.col(Defense).mean().over([Type 1, Type 2]).alias(avg_defense_by_type_combination),pl.col(Attack).mean().alias(avg_attack),
)
print(out)
filtered df.filter(pl.col(Type 2) Psychic).select(Name,Type 1,Speed,
)
print(filtered)
out filtered.with_columns(pl.col([Name, Speed]).sort_by(Speed, descendingTrue).over(Type 1),
)
print(out)7.2 Lists and Arrays
weather pl.DataFrame({station: [Station str(x) for x in range(1, 6)],temperatures: [20 5 5 E1 7 13 19 9 6 20,18 8 16 11 23 E2 8 E2 E2 E2 90 70 40,19 24 E9 16 6 12 10 22,E2 E0 15 7 8 10 E1 24 17 13 6,14 8 E0 16 22 24 E1,],}
)
print(weather)
out weather.with_columns(pl.col(temperatures).str.split( ))
print(out)
out weather.with_columns(pl.col(temperatures).str.split( )).explode(temperatures
)
print(out)
out weather.with_columns(pl.col(temperatures).str.split( )).with_columns(pl.col(temperatures).list.head(3).alias(top3),pl.col(temperatures).list.slice(-3, 3).alias(bottom_3),pl.col(temperatures).list.len().alias(obs),
)
print(out)8 变形
8.1 Joins df_customers pl.DataFrame({customer_id: [1, 2, 3],name: [Alice, Bob, Charlie],}
)
print(df_customers)
df_orders pl.DataFrame({order_id: [a, b, c],customer_id: [1, 2, 2],amount: [100, 200, 300],}
)
print(df_orders)
df df_customers.join(df_orders, oncustomer_id, howinner)
print(df)df df_customers.join(df_orders, oncustomer_id, howleft)
print(df)df df_customers.join(df_orders, oncustomer_id, howouter)
print(df)df df_customers.join(df_orders, oncustomer_id, howcross)
print(df)
df_cars pl.DataFrame({id: [a, b, c],make: [ford, toyota, bmw],}
)
print(df_cars)
df_repairs pl.DataFrame({id: [c, c],cost: [100, 200],}
)
print(df_repairs)
df df_cars.join(df_repairs, onid, howinner)
print(df)df df_cars.join(df_repairs, onid, howsemi)
print(df)df df_cars.join(df_repairs, onid, howanti)
print(df)
df_trades pl.DataFrame({time: [datetime(2020, 1, 1, 9, 1, 0),datetime(2020, 1, 1, 9, 1, 0),datetime(2020, 1, 1, 9, 3, 0),datetime(2020, 1, 1, 9, 6, 0),],stock: [A, B, B, C],trade: [101, 299, 301, 500],}
)
print(df_trades)df_quotes pl.DataFrame({time: [datetime(2020, 1, 1, 9, 0, 0),datetime(2020, 1, 1, 9, 2, 0),datetime(2020, 1, 1, 9, 4, 0),datetime(2020, 1, 1, 9, 6, 0),],stock: [A, B, C, A],quote: [100, 300, 501, 102],}
)print(df_quotes)
df_asof_join df_trades.join_asof(df_quotes, ontime, bystock)
print(df_asof_join)
df_asof_tolerance_join df_trades.join_asof(df_quotes, ontime, bystock, tolerance1m
)
print(df_asof_tolerance_join)8.2 Concatenation
df_v1 pl.DataFrame({a: [1],b: [3],}
)
df_v2 pl.DataFrame({a: [2],b: [4],}
)
df_vertical_concat pl.concat([df_v1,df_v2,],howvertical,
)
print(df_vertical_concat)
df_h1 pl.DataFrame({l1: [1, 2],l2: [3, 4],}
)
df_h2 pl.DataFrame({r1: [5, 6],r2: [7, 8],r3: [9, 10],}
)
df_horizontal_concat pl.concat([df_h1,df_h2,],howhorizontal,
)
print(df_horizontal_concat)8.3 Pivots
df pl.DataFrame({foo: [A, A, B, B, C],N: [1, 2, 2, 4, 2],bar: [k, l, m, n, o],}
)
print(df)
out df.pivot(indexfoo, columnsbar, valuesN, aggregate_functionfirst)
print(out)
q (df.lazy().collect().pivot(indexfoo, columnsbar, valuesN, aggregate_functionfirst).lazy()
)
out q.collect()
print(out)8.4 Melts
import polars as pldf pl.DataFrame({A: [a, b, a],B: [1, 3, 5],C: [10, 11, 12],D: [2, 4, 6],}
)
print(df)
out df.melt(id_vars[A, B], value_vars[C, D])
print(out)
THE END!
文章结束感谢阅读。您的点赞收藏评论是我继续更新的动力。大家有推荐的公众号可以评论区留言共同学习一起进步。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917261.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!