ๆkaggleใณใณใใงPolarsใฎๆฅๆฌ่ชๆ็จฟใใใฃใฆใใๆฅๆฌใงใฎ่ช็ฅๅบฆใๆฅ้ใซๅบใพใฃใPolars. ไฝฟใๆนใฏไปฅไธใฎ่ฏ่ณชใช่จไบใซใไปปใใใฆใใใใขใใฏใชๆฉ่ฝใ็ดนไปใใใใใซใใฆใVaexใฏๆฎๅใใใ ใฃใใใ
- ่ถ ้ซ้DataFrameใฉใคใใฉใชใผใPolarsใใซใคใใฆ
- pandasใใ็งป่กใใไบบๅใ polarsไฝฟ็จใฌใคใ
- ใใผใใซใใผใฟๅฆ็ใซๆฉใใใชใใซๆๅ ฑ๏ผPolarsใฎไฝฟใๆนใๅพนๅบ่งฃ่ชฌใใใฎ๏ผ๏ผๅบๆฌ็ทจ
- Polarsใงใใผใฟใตใคใจใณใน100ๆฌใใใฏใ่งฃใ๏ผๅ็ทจ๏ผ
2023ๅนด2ๆ18ๆฅ็พๅจใงใฎๅฎ่ก็ฐๅข
import polars as pl
pl.show_versions()
---Version info---
Polars: 0.16.6
Index type: UInt32
Platform: Linux-5.15.79.1-microsoft-standard-WSL2-x86_64-with-glibc2.31
Python: 3.10.9 (main, Dec 27 2022, 12:45:52) [Clang 15.0.6 ]
---Optional dependencies---
pyarrow: 10.0.1
pandas: 1.5.3
numpy: 1.24.2
fsspec: <not installed>
connectorx: <not installed>
xlsx2csv: <not installed>
deltalake: <not installed>
matplotlib: <not installed>
0. .shrink_dtype() ไพฟๅฉ
๏ผ2023-02-18 13:00+09:00 ่ฟฝ่จ๏ผ
Pandasใงใฏๅฎ็ณใงใใฃใใกใขใช็ฏ็ดใฎใใใฎๆฐๅคๅใฎ็ธฎๆธๅคๆใฏ shrink_dtype() ใ็จๆใใใฆใใใฎใงใใใไฝฟใใฎใๅใ
df = pl.DataFrame(
{
"a": [1, 2, 3],
"b": [1, 2, 2 << 32],
"c": [-1, 2, 1 << 30],
"d": [-112, 2, 112],
"e": [-112, 2, 129],
"f": ["a", "b", "c"],
"g": [0.1, 1.32, 0.12],
"h": [True, None, False],
}
)
df
shape: (3, 8)
โโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโฌโโโโโโโฌโโโโโโฌโโโโโโโฌโโโโโโโโ
โ a โ b โ c โ d โ e โ f โ g โ h โ
โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ
โ i64 โ i64 โ i64 โ i64 โ i64 โ str โ f64 โ bool โ
โโโโโโโชโโโโโโโโโโโโโชโโโโโโโโโโโโโชโโโโโโโชโโโโโโโชโโโโโโชโโโโโโโชโโโโโโโโก
โ 1 โ 1 โ -1 โ -112 โ -112 โ a โ 0.1 โ true โ
โ 2 โ 2 โ 2 โ 2 โ 2 โ b โ 1.32 โ null โ
โ 3 โ 8589934592 โ 1073741824 โ 112 โ 129 โ c โ 0.12 โ false โ
โโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโดโโโโโโโดโโโโโโดโโโโโโโดโโโโโโโโ
df.select(pl.all().shrink_dtype())
shape: (3, 8)
โโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโฌโโโโโโโฌโโโโโโฌโโโโโโโฌโโโโโโโโ
โ a โ b โ c โ d โ e โ f โ g โ h โ
โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ
โ i8 โ i64 โ i32 โ i8 โ i16 โ str โ f32 โ bool โ
โโโโโโโชโโโโโโโโโโโโโชโโโโโโโโโโโโโชโโโโโโโชโโโโโโโชโโโโโโชโโโโโโโชโโโโโโโโก
โ 1 โ 1 โ -1 โ -112 โ -112 โ a โ 0.1 โ true โ
โ 2 โ 2 โ 2 โ 2 โ 2 โ b โ 1.32 โ null โ
โ 3 โ 8589934592 โ 1073741824 โ 112 โ 129 โ c โ 0.12 โ false โ
โโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโดโโโโโโโดโโโโโโดโโโโโโโดโโโโโโโโ
1. ๅไธใชๅคใฏ pl.lit(...)
pl.selectใชใฉใฎๆปใๅคใฏ่กๆฐใ1ใๅ ใฎFrameใฎ้ทใnใจๅไธใงใชใใจใจใฉใผใจใชใใ่กๆฐใ1ใฎๅ ดๅใฏ่ชๅใงnใซๆกๅผตใใใใใๅบๅฎๅค็ญใฎๅ ดๅใฏpl.litใไฝฟใใใจใใใๅไธใฎใชใใฉใซๅคใฎๅใฎไฝๆใงใใใฐpl.litใใไธ่ฆ
df = pl.DataFrame({
"a": [1,2,3],
"b": list("abc"),
})
# df.with_columns(pl.lit(99).alias("c")) ใใ่จ่ฟฐ็ญใใฆๆธใใ
df.with_columns(c=99)
shape: (3, 3)
โโโโโโโฌโโโโโโฌโโโโโโ
โ a โ b โ c โ
โ --- โ --- โ --- โ
โ i64 โ str โ i32 โ
โโโโโโโชโโโโโโชโโโโโโก
โ 1 โ a โ 99 โ
โ 2 โ b โ 99 โ
โ 3 โ c โ 99 โ
โโโโโโโดโโโโโโดโโโโโโ
2. df.with_columns ใงใฎๅๅใฎๆๅฎใฏๅๅไปใๅผๆฐใงใๆธกใใใ
ใฆใใจใงไธใคไธใง็ดนไปใใใๅๅไปใๅผๆฐใฎใปใใๆ่ใฎๆตใใ้ช้ญใใใชใ๏ผใจใใๅไบบ็ๆๆณ๏ผใaliasใ้ฉ็จใใใฎใซใซใใณใไฝๅใซๅฟ ่ฆใจใชใใฎใงใ
df1 = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})
print(df1.with_columns(baz=pl.col("foo") * 2, qux=pl.col("bar") + 1))
print(df1.with_columns([(pl.col("foo") * 2).alias("baz"), (pl.col("bar") + 1).alias("qux")]))
shape: (3, 4)
โโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโ
โ foo โ bar โ baz โ qux โ
โ --- โ --- โ --- โ --- โ
โ i64 โ i64 โ i64 โ i64 โ
โโโโโโโชโโโโโโชโโโโโโชโโโโโโก
โ 1 โ 4 โ 2 โ 5 โ
โ 2 โ 5 โ 4 โ 6 โ
โ 3 โ 6 โ 6 โ 7 โ
โโโโโโโดโโโโโโดโโโโโโดโโโโโโ
shape: (3, 4)
โโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโ
โ foo โ bar โ baz โ qux โ
โ --- โ --- โ --- โ --- โ
โ i64 โ i64 โ i64 โ i64 โ
โโโโโโโชโโโโโโชโโโโโโชโโโโโโก
โ 1 โ 4 โ 2 โ 5 โ
โ 2 โ 5 โ 4 โ 6 โ
โ 3 โ 6 โ 6 โ 7 โ
โโโโโโโดโโโโโโดโโโโโโดโโโโโโ
3. pandas DataFrameๅคๆใฏ arrow ใงๆธกใใฐใผใญใณใใผ
df.to_pandas(use_pyarrow_extension_array=True) ใฎๅผๆฐใๆๅฎใใใจ็ฌ้ใใใ ใ Pandas ใฏ 1.5.0 ไปฅไธใฎๅฟ
่ฆใใใงใใ
df = pl.DataFrame({
"a": pl.arange(0, 5e7, eager=True),
}).with_columns(
b=pl.col("a") // 10000,
c=pl.col("a").shuffle(seed=1)
)
df
shape: (50000000, 3)
โโโโโโโโโโโโฌโโโโโโโฌโโโโโโโโโโโ
โ a โ b โ c โ
โ --- โ --- โ --- โ
โ i64 โ i64 โ i64 โ
โโโโโโโโโโโโชโโโโโโโชโโโโโโโโโโโก
โ 0 โ 0 โ 27454110 โ
โ 1 โ 0 โ 2309916 โ
โ 2 โ 0 โ 15065100 โ
โ 3 โ 0 โ 12766444 โ
โ ... โ ... โ ... โ
โ 49999996 โ 4999 โ 17167194 โ
โ 49999997 โ 4999 โ 9092583 โ
โ 49999998 โ 4999 โ 1929693 โ
โ 49999999 โ 4999 โ 35668469 โ
โโโโโโโโโโโโดโโโโโโโดโโโโโโโโโโโ
%time pd_df1 = df.to_pandas()
CPU times: user 478 ms, sys: 968 ms, total: 1.45 s
Wall time: 943 ms
%time pd_df2 = df.to_pandas(use_pyarrow_extension_array=True)
CPU times: user 1.88 ms, sys: 0 ns, total: 1.88 ms
Wall time: 2.01 ms
ๅฎใซ 943/2.01=469ๅใ ใ๏ผใฃใฆใใ้ขจใซๆธใไบบใใใใใใฉใใพใฃใใๆๅณใชใใงใ๏ผ
to_pandas(...) ใฎใใฎไปๅผๆฐใฏ pyarrow.Table.to_pandas ใๅ็
งใใใจใใใงใใ categories=[...] ใฎๅผๆฐๆๅฎใฏใใใใๅบ็ชใใใใใ
3.5 map_dict ใงไธๆฌๅคๆ
(2023-02-19 10:30+09:00 ่ฟฝๅ ๏ผ
v0.16.3 ๏ผใใฎ่จไบใฎ๏ผ้ฑ้ๅใชใฎใงๅบๆฅ็ซใฆ๏ผใใ .map_dict(...) ใกใฝใใใ่ฟฝๅ ใใใใPandasใฎ .map() ใฏๅ็ดใชdictใๆธกใใฆใ่ฆใคใใใชใๅ ดๅใฎใใใฉใซใๅคใฎ่จญๅฎใฏใงใใชใใฃใ๏ผใใ ใ defaultdict ใไฝฟใใฐใงใใ๏ผใใ .map_dict ใฎๅผๆฐ default= ใๆๅฎใงใใใใใฎๆๅฎใซใฏใชใใฉใซใ ใใงใชใ pl.Expr ใใชใใก pl.col(...) ใฎๅฅใฎๅใฎๅคใๆๅฎๅฏ่ฝใ๏ผๅฝ็ถๅใซใฏๆฐใไปใใ๏ผ
4. vstack concat ใฉใกใใไฝฟใใใฏๅพ็ถใงใฎใฏใจใชๆฌก็ฌฌ
็ธฆใฎ้ฃ็ตใฏไธ็จฎ้กใใใใใกใขใชๅ้ ็ฝฎใใใชใใง้ๅบฆใๅคใใใ .extend ใฏ็ ดๅฃ็ๅคๆดใจใชใใใจใซๆณจๆใ
ใใใใๅผ็จ https://www.rhosignal.com/posts/polars-extend-vstack/
-
pl.concat([df_1,df_2])ๆฐใใๅไธใฎใญใฑใผใทใงใณใซใณใใผ -
df_1.vstack(df_2)ใณใใผใชใใงใชใณใฏ็ใซๆฅ็ถ๏ผใกใขใชไธใฏๅ้ขใฎใพใพ๏ผ -
df_1.extend(df_2)df_2ใใณใใผใใฆdf_1ใซappend
df_1 = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})
df_2 = pl.DataFrame({"foo": [10, 20, 30], "bar": [40, 50, 60]})
pl.concat([df_1, df_2]) # immutabble
df_1.vstack(df_2) # immutable
df_1.extend(df_2) # in-place change for df_1
5. pl.DataFrame.apply ใ้ ใ๏ผใใใใใใ ใ
๏ผ่ฟฝ่จ 2023-10-31)
Deprecated since version 0.19.0: This method has been renamed to DataFrame.map_rows().
ใจใใใใจใงใกใฝใใๅใฏ map_rows() ใซๅคๆดใจใชใใใใงใใ
ใชใ Rust ใง Expression plugins ใๆธใใจใกใใฃ้ใงใใใใใใงใใ็งใฏ่ฉฆใใฆใใพใใใใ
UDF (User Defined Function) ใฏ Python ใฎๅฎ่กใ Expr ใฏ Rustใฎๅฎ่ก๏ผไธฆๅๅใใใ๏ผใฎใใใUDFใฏใใกใ้ ใใ
6. ๅทจๅคงcsvใparquetใซใใใ๏ผ pl.scan_csv ใจ pl.LazyFrame.sink_parquet ใฎๆดป็จใ ใ
collect(stream=True)ใใชใใฆใใใใๆๅพใซ sink_parquetใงOK
7. ๅฑ้บใช pl.Expr.set_sorted
ใฝใผใๆธใฟใใฉใฐใ็ซใฆใใจใใใฎๅพใฎjoinใ้็ด้ขๆฐ็ญใงใฎๆฟ้ใๅพใใใใใใใใฝใผใๆธใฟใงใชใใฆใใใฉใฐใ็ซใฆใใใใฎใงใๅ่ฌใงใใใชใใไธ็ด่ ๅใ่จญๅฎใ
8. ้asciiใฎๆๅญๅใฎใซใฆใณใใฏ str.length ใกใใใงใ str.n_char ใ
df = pl.DataFrame({"s": ["Cafรฉ", None, "345", "ๆฑไบฌ"]}).with_columns(
[
pl.col("s").str.n_chars().alias("nchars"),
pl.col("s").str.lengths().alias("length"),
]
)
df
shape: (4, 3)
โโโโโโโโฌโโโโโโโโโฌโโโโโโโโโ
โ s โ nchars โ length โ
โ --- โ --- โ --- โ
โ str โ u32 โ u32 โ
โโโโโโโโชโโโโโโโโโชโโโโโโโโโก
โ Cafรฉ โ 4 โ 5 โ
โ null โ null โ null โ
โ 345 โ 3 โ 3 โ
โ ๆฑไบฌ โ 2 โ 6 โ
โโโโโโโโดโโโโโโโโโดโโโโโโโโโ
9. ใจใฏใใฃใฆใSQLใงๆไฝใใใใชใๆใใใฎใฏๅฆใใชใ
ใใใชๆใฏduckdbใงใใarrowใ้ใใฆใผใญใณใใผๆไฝใ๏ผใใ ใ duckdb ver 7.0 ไปฅไธใใคใพใๆฐๆฅๅใใใงใใใใใซใชใฃใใ๏ผ
ไปฅไธใฏใตใณใใซไธธใณใใผใงใใ
python -m pip install duckdb[polars]
import duckdb
import polars as pl
df = pl.DataFrame(
{
"A": [1, 2, 3, 4, 5],
"fruits": ["banana", "banana", "apple", "apple", "banana"],
"B": [5, 4, 3, 2, 1],
"cars": ["beetle", "audi", "beetle", "beetle", "beetle"],
}
)
duckdb.sql('SELECT * FROM df').show()
df2 = df.lazy()
duckdb.sql('SELECT * FROM df2').show()
duckdb.sql('SELECT * FROM df') ใฎ็ตๆใฏ duckdb.DuckDBPyRelation ๅใชใฎใงใpl.DataFrameใซๆปใใซใฏ .pl() ใกใฝใใใ่ฟฝๅ ใใฆ duckdb.sql('SELECT * FROM df').pl() ใจใใๅฟ
่ฆใใใใ
10. ใใผใใซ่กจ็คบใฏๅ จ้จ่ฆใใฆใญ
ไธๆ็ใชๅคๆดใฏไธ่จใฎไพใฎใใใซ with pl.Config() as cfg: ใๆดป็จ
df = pl.DataFrame({str(i): [i] for i in range(20)})
print(df)
with pl.Config() as cfg:
cfg.set_tbl_cols(-1)
print(df)
shape: (1, 20)
โโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโ
โ 0 โ 1 โ 2 โ 3 โ ... โ 16 โ 17 โ 18 โ 19 โ
โ --- โ --- โ --- โ --- โ โ --- โ --- โ --- โ --- โ
โ i64 โ i64 โ i64 โ i64 โ โ i64 โ i64 โ i64 โ i64 โ
โโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโก
โ 0 โ 1 โ 2 โ 3 โ ... โ 16 โ 17 โ 18 โ 19 โ
โโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโ
shape: (1, 20)
โโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโฌโโโโโโ
โ 0 โ 1 โ 2 โ 3 โ 4 โ 5 โ 6 โ 7 โ 8 โ 9 โ 10 โ 11 โ 12 โ 13 โ 14 โ 15 โ 16 โ 17 โ 18 โ 19 โ
โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ --- โ
โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ i64 โ
โโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโชโโโโโโก
โ 0 โ 1 โ 2 โ 3 โ 4 โ 5 โ 6 โ 7 โ 8 โ 9 โ 10 โ 11 โ 12 โ 13 โ 14 โ 15 โ 16 โ 17 โ 18 โ 19 โ
โโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโดโโโโโโ
ใใใใฏ df.glimpse() ใงใใฃใใ็ขบ่ชใจใใ
11. stringใฎไธญ่บซใ็็ฅใใใซ่กจ็คบใใใใใ
ไธ่จใชใณใฏๅ ใใฉใใ
12. pl.Config ใฏไฟๅญใใฆใใใจไพฟๅฉใ
ไปฅไธใฎใใใซไฟๅญใงใใใ
pl.Config.state() # check current status
pl.Config.restore_defaults() # reset to default
str = pl.Config.save()
pl.Config.load(str)
ใใฎไปใๅฝน็ซใก twitter
https://twitter.com/RitchieVink
https://twitter.com/braaannigan
ใใใฉใญใผใใใฐไธๅ
จใงใใ
ๆๅพใซ
ใฆใใจใง Polars, Duckdb, ibis ใใใใฎPython library ใจ dbt ใใใผใฟใใณใใชใณใฐ๏ผELTใจใETLใจใใใใฆ่จใใชใ๏ผใใกใคใณใซใใฆใใ1ๅนดใจใชใฃใฆใใใจๆใใพใใใใใฆschemaใฎๅญๅจใใชใcsvใใกใคใซใฏExcelใใใคใใใชใใใธใในใใผใฝใณใฎๆฏใใฎๅญๅจใจใชใใzstdๅง็ธฎใฎparquetใใฉใผใใใใๅฝ็ถใจใชใๆไปฃใใใฃใฆใใพใ๏ผ้กๆ๏ผ