็ชๅฃๅฝๆฐ ๐๐ โ
็ชๅฃๅฝๆฐๆฏไธ็งๅผบๅคง็่กจ่พพๅผใๅฎๅฏไปฅ่ฎฉ็จๆทๅจ select ไธไธๆไธญๅ็ป่ฟ่ก็ฑป่ใ ่ฎฉๆไปฌ้่ฟไพๅญ็็่ฟๆฏไปไนๆๆใ้ฆๅ
๏ผๆไปฌๅๅปบไธไธชๆฐๆฎ็ปๆ๏ผ่ฟไธชๆฐๆฎๅ
ๅซๅฆไธๅ๏ผๅๅซไปฃ่กจๅฃ่ขๅฆๆช็ไธไบไฟกๆฏ๏ผ
['#', 'Name', 'Type 1', 'Type 2', 'Total', 'HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed', 'Generation', 'Legendary']
import polars as pl
# ็ถๅ๏ผ่ฎฉๆไปฌๅ ่ฝฝไธไบๅ
pokemonไฟกๆฏ็csvๆฐๆฎ
df = pl.read_csv(
    "https://gist.githubusercontent.com/ritchie46/cac6b337ea52281aa23c049250a4ff03/raw/89a957ff3919d90e6ef2d34235e6bf22304f3366/pokemon.csv"
)
print(df)shape: (163, 13)
โโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโฌโโโโโโโโโฌโโโโฌโโโโโโโโโโฌโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโ
โ #   โ Name                  โ Type 1  โ Type 2 โ โฆ โ Sp. Def โ Speed โ Generation โ Legendary โ
โ --- โ ---                   โ ---     โ ---    โ   โ ---     โ ---   โ ---        โ ---       โ
โ i64 โ str                   โ str     โ str    โ   โ i64     โ i64   โ i64        โ bool      โ
โโโโโโโชโโโโโโโโโโโโโโโโโโโโโโโโชโโโโโโโโโโชโโโโโโโโโชโโโโชโโโโโโโโโโชโโโโโโโโชโโโโโโโโโโโโโชโโโโโโโโโโโโก
โ 1   โ Bulbasaur             โ Grass   โ Poison โ โฆ โ 65      โ 45    โ 1          โ false     โ
โ 2   โ Ivysaur               โ Grass   โ Poison โ โฆ โ 80      โ 60    โ 1          โ false     โ
โ 3   โ Venusaur              โ Grass   โ Poison โ โฆ โ 100     โ 80    โ 1          โ false     โ
โ 3   โ VenusaurMega Venusaur โ Grass   โ Poison โ โฆ โ 120     โ 80    โ 1          โ false     โ
โ โฆ   โ โฆ                     โ โฆ       โ โฆ      โ โฆ โ โฆ       โ โฆ     โ โฆ          โ โฆ         โ
โ 147 โ Dratini               โ Dragon  โ null   โ โฆ โ 50      โ 50    โ 1          โ false     โ
โ 148 โ Dragonair             โ Dragon  โ null   โ โฆ โ 70      โ 70    โ 1          โ false     โ
โ 149 โ Dragonite             โ Dragon  โ Flying โ โฆ โ 100     โ 80    โ 1          โ false     โ
โ 150 โ Mewtwo                โ Psychic โ null   โ โฆ โ 90      โ 130   โ 1          โ true      โ
โโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโดโโโโโโโโโดโโโโดโโโโโโโโโโดโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโGroupby ็ฑป่ โ
ไธ้ขๆไปฌ็็ๅฆไฝ็จ็ชๅฃๅฝๆฐๅฏนไธๅ็ๅๅ็ปๅนถไธ็ฑป่ใ่ฟๆ ทๆไปฌๅฏไปฅๅจไธๆฌกๆฅ่ฏขไธญๅนถ่ก็่ฟ่กๅคไธชๅ็ปๆไฝใ ็ฑป่็็ปๆไผๆๅฐไผๅๆ็่กใๅ ๆญค๏ผ็ชๅฃๅฝๆฐๆฐธ่ฟ่ฟๅไธไธช่ทๅๆ DataFrame ไธๆ ท่งๆ ผ็ DataFrameใ
ๆณจๆ๏ผๆไปฌไฝฟ็จไบ .over("Type 1") ๅ .over(["Type 1", "Type 2"])๏ผๅฉ็จ็ชๅฃๅฝๆฐๆไปฌๅฏไปฅไธไธช select ่ฏญๅขไธญๅฎ็ฐๅคไธชๅ็ป็ฑป่ใ
ๆดๅฅฝ็ๆฏ๏ผ่ฎก็ฎ่ฟ็ๅ็ปไผ่ขซ็ผๅญๅนถไธๅจไธๅ็็ชๅฃๅฝๆฐไธญๅ ฑไบซใ
import polars as pl
from .window_1 import df
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)shape: (163, 5)
โโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโ
โ Type 1  โ Type 2 โ avg_attack_by_type โ avg_defense_by_type_combination โ avg_attack โ
โ ---     โ ---    โ ---                โ ---                             โ ---        โ
โ str     โ str    โ f64                โ f64                             โ f64        โ
โโโโโโโโโโโชโโโโโโโโโชโโโโโโโโโโโโโโโโโโโโโชโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโชโโโโโโโโโโโโโก
โ Grass   โ Poison โ 72.923077          โ 67.8                            โ 75.349693  โ
โ Grass   โ Poison โ 72.923077          โ 67.8                            โ 75.349693  โ
โ Grass   โ Poison โ 72.923077          โ 67.8                            โ 75.349693  โ
โ Grass   โ Poison โ 72.923077          โ 67.8                            โ 75.349693  โ
โ โฆ       โ โฆ      โ โฆ                  โ โฆ                               โ โฆ          โ
โ Dragon  โ null   โ 94.0               โ 55.0                            โ 75.349693  โ
โ Dragon  โ null   โ 94.0               โ 55.0                            โ 75.349693  โ
โ Dragon  โ Flying โ 94.0               โ 95.0                            โ 75.349693  โ
โ Psychic โ null   โ 53.875             โ 51.428571                       โ 75.349693  โ
โโโโโโโโโโโดโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโๅ็ปๆไฝ โ
็ชๅฃๅฝๆฐไธไป
ไป
ๅฏไปฅ็ฑป่๏ผ่ฟๅฏไปฅ็จๆฅๆ็
ง็ปๆฝๅ ่ชๅฎไนๅฝๆฐใไพๅฆ๏ผๅฆๆไฝ ๆณ่ฆๅจๆไธ็ปไธญๆๅบ๏ผไฝ ๅฏไปฅ๏ผ .col("value").sort().over("group")ใ
่ฎฉๆไปฌ่ฏ็่ฟๆปคไธไบ่ก๏ผ
import polars as pl
from .window_1 import df
filtered = df.filter(pl.col("Type 2") == "Psychic").select(
    [
        "Name",
        "Type 1",
        "Speed",
    ]
)
print(filtered)shape: (7, 3)
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโ
โ Name                โ Type 1 โ Speed โ
โ ---                 โ ---    โ ---   โ
โ str                 โ str    โ i64   โ
โโโโโโโโโโโโโโโโโโโโโโโชโโโโโโโโโชโโโโโโโโก
โ Slowpoke            โ Water  โ 15    โ
โ Slowbro             โ Water  โ 30    โ
โ SlowbroMega Slowbro โ Water  โ 30    โ
โ Exeggcute           โ Grass  โ 40    โ
โ Exeggutor           โ Grass  โ 55    โ
โ Starmie             โ Water  โ 115   โ
โ Jynx                โ Ice    โ 95    โ
โโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโดโโโโโโโโๆณจๆๅฐ๏ผๅ็ป Water ็ๅ Type 1 ๅนถไธ่ฟ็ปญ๏ผไธญ้ดๆไธค่ก Grassใ่ไธ๏ผๅ็ปไธญ็ๆฏไธไธชๅฃ่ขๅฆ่ก ่ขซๆ็
ง Speed ๅๅบๆๅใไธๅนธ็ๆฏ๏ผ่ฟไธชไพๅญๆไปฌๅธๆ้ๅบๆๅ๏ผๅนธ่ฟ็ๆฏ๏ผ่ฟๅพ็ฎๅ๏ผ
import polars as pl
from .window_group_1 import filtered
out = filtered.with_columns(
    [
        pl.col(["Name", "Speed"]).sort(descending=True).over("Type 1"),
    ]
)
print(out)shape: (7, 3)
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโ
โ Name                โ Type 1 โ Speed โ
โ ---                 โ ---    โ ---   โ
โ str                 โ str    โ i64   โ
โโโโโโโโโโโโโโโโโโโโโโโชโโโโโโโโโชโโโโโโโโก
โ Starmie             โ Water  โ 115   โ
โ Slowpoke            โ Water  โ 30    โ
โ SlowbroMega Slowbro โ Water  โ 30    โ
โ Exeggutor           โ Grass  โ 55    โ
โ Exeggcute           โ Grass  โ 40    โ
โ Slowbro             โ Water  โ 15    โ
โ Jynx                โ Ice    โ 95    โ
โโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโดโโโโโโโโPolars ไผ่ฟฝ่ธชๆฏไธช็ป็ไฝ็ฝฎ๏ผๅนถๆ็ธๅบ็่กจ่พพๅผๆ ๅฐๅฐ้ๅฝ็่กใ่ฟไธชๆไฝๅฏไปฅๅจไธไธช select ็ฏๅขไธญๅฎๆใ
็ชๅฃๅฝๆฐ็ๅผบๅคงไนๅคๅจไบ๏ผไฝ ้ๅธธไธ้่ฆ groupby -> explode ็ปๅ๏ผ่ๆฏๆ้ป่พๆพๅ
ฅไธไธช่กจ่พพๅผไธญใ ่ฟไนไฝฟๅพ API ๆดๅ ็ฎๆด๏ผ
- groupby-> ๆ ่ฎฐ็ฑป่็ๅ็ป๏ผ่ฟๅไธไธช่ท็ป็ไธชๆฐไธ่ด็- DataFrame
- over-> ๆ ่ฎฐๆไปฌๅธๆๅฏน่ฟไธชๅ็ป่ฟ่ก่ฎก็ฎ๏ผไฝๆฏไธไผๆดๆนๅๆ- DataFrame็ๅฝข็ถ
็ชๅฃ่กจ่พพๅผ็่งๅ โ
็ชๅฃ่กจ่พพๅผ็่ฎก็ฎ่งๅๅฆไธ๏ผๅ่ฎพๆไปฌๆไธไธช pl.Int32 ๅ๏ผ๏ผ
# ๅ็ปๅ
็ฑป่ไธๅนฟๆญ
# ่พๅบ็ฑปๅ: -> Int32
pl.sum("foo").over("groups")
# ็ปๅ
ๅ ๅ๏ผ็ถๅไนไปฅ็ปๅ
็ๅ
็ด 
# ่พๅบ็ฑปๅ: -> Int32
(pl.col("x").sum() * pl.col("y")).over("groups")
# ็ปๅ
ๅ ๅ๏ผ็ถๅไนไปฅ็ปๅ
็ๅ
็ด 
# ๅนถไธ็ปๅ
็ฑป่ๆไธไธชๅ่กจ
# ่พๅบ็ฑปๅ: -> List(Int32)
(pl.col("x").sum() * pl.col("y")).list().over("groups")
# ๆณจๆ่ฟ้้่ฆไธไธชๆพๅผ็ `list` ่ฐ็จ
# ็ปๅ
ๅ ๅ๏ผ็ถๅไนไปฅ็ปๅ
็ๅ
็ด 
# ๅนถไธ็ปๅ
็ฑป่ๆไธไธชๅ่กจ
# list() ไผๅฑๅผ
# ๅฆๆ็ปๅ
ๆฏๆๅบ็๏ผ่ฟๆฏๆๅฟซ็ๆไฝๆนๆณ๏ผ
(pl.col("x").sum() * pl.col("y")).list().over("groups").flatten()ๅฑๅผ็ชๅฃๅฝๆฐ โ
ๅฐฑๅๅๅ็ไพๅญ๏ผๅฆๆไฝ ็็ชๅฃๅฝๆฐ่ฟๅไธไธช list๏ผ
pl.col("Name").sort_by(pl.col("Speed")).head(3).list().over("Type 1")
่ฟๆ ทๅฏไปฅ๏ผไฝๆฏ่ฟๆ ทไผ่ฟๅไธไธช็ฑปๅไธบ List ็ๅ๏ผ่ฟๅฏ่ฝไธๆฏๆไปฌๆณ่ฆ็๏ผ่ไธไผๅขๅ ๅ
ๅญไฝฟ็จใ
่ฟๆฏๆไปฌๅฏไปฅ้็จ flattenใ่ฟไธชๅฝๆฐไผๆไธไธช 2D ๅ่กจ่ฝฌๆขๆ 1D๏ผ็ถๅๆๅๆๅฐๅฐๆไปฌ็ DataFrameใ ่ฟไธชๆไฝ้ๅธธๅฟซ๏ผๅ ไธบ reshape ๅบๆฌๆฒกๆๆๆฌ๏ผ็ปๅๆ DataFrame ๅขๅ ๅไน้ๅธธๅฟซ๏ผๅ ไธบๆไปฌไธ้่ฆ ไธ่ฌ็ชๅฃๅฝๆฐ็่ๅ๏ผJoin๏ผๆไฝใ
ไฝๆฏ๏ผๆณ่ฆๆญฃ็กฎ็ไฝฟ็จ่ฟไธชๆไฝ๏ผๆไปฌ่ฆไฟ่ฏ็จไบ over ็ๅๆฏๆๅบ็ใ
