ã¯ããã«
æ ªåŒäŒç€ŸLITALICOã§ãšã³ãžãã¢ãããŠããŸã@yknoguchiã§ãã
ãã®èšäºã¯ãLITALICO Advent Calendar 2023ã10æ¥ç®ã®èšäºã§ãã
ã¡ãªã¿ã«ä»æ¥ã¯åã®èªçæ¥ã§ããããŸãããã§ããïŒ
æ¥å¹Žããã£ãšèªçæ¥é§åã¢ããã³ãã«ã¬ã³ããŒããããšæããŸãã
ãã®èšäºã®ç¹åŸŽ
ãã®èšäºã§ã¯ãPolarsã®è©³ããäœ¿ãæ¹ã®è§£èª¬ã¯è¡ããŸããã
ãã®èšäºã®ç®æšã¯ã以äžã®ãšããã§ãã
ããããèªãããšã§æäœéã®Polarsã®äœ¿ãæ¹ãèŠãããšããããããã«Polarsãè§Šããã
Qiitaã«ã¯Polarsã®è§£èª¬èšäºãäžãã£ãŠããŸãã®ã§ã詳ããäœ¿ãæ¹ã¯ãã¡ããã確èªãã ããããã®èšäºã§ã¯ãããŸã§Polarsãå§ããæåã®äžæ©ãæ³å®ããŠããŸãããã®ãããå¿ èŠæäœéã®æ©èœãã玹ä»ããŠããŸããã
Polarsãšã¯
Polarsãšã¯ãPythonã§å€§éã®ããŒã¿ãã¬ãŒã ãéèšãããšãã«äœ¿çšããã©ã€ãã©ãªã§ãã
ãã®çšéã®ã¹ã¿ã³ããŒãã®ã©ã€ãã©ãªã¯Pandasãªã®ã§ãããæè¿ã¯PolarsãåŸã
ã«äººæ°ãåºãŠããŠããŸãããã®çç±ãšããŠã¯ãåŠçãæžããããããšãå®è¡ãé«éãªã©ã®çç±ããããŸãã
ïŒä»ã«ããã¡ãã®èšäºã§æ§ã
ãªç¹åŸŽã玹ä»ãããŠããŸããâè¶
é«éâŠã ããããªãïŒPandasã«ä»£ããŠPolarsã䜿ãããçç±ïŒ
æºå
ã€ã³ã¹ããŒã«
Polarsã¯pipããç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸãã
> pip install polars
ã€ã³ããŒã
åºæ¬çã«Polarsã¯plãšç¥ããŠäœ¿çšããŸãã
import polars
import polars as pl # åºæ¬çã«ã¯ãã£ã¡
ãã¡ã€ã«ã®èªã¿æžã
ãã¡ã€ã«ã®èªã¿èŸŒã¿
df = pl.read_csv("data.csv")
ãã¡ã€ã«ãžæžã蟌ã¿
Polarsã§ã¯utf8以å€ã®æžã蟌ã¿ã«å¯Ÿå¿ããŠããªãããããã®å Žåã¯Pandasã«å€æããããPythonã®openã¡ãœããã§æžã蟌ãã§ãã ããã
df.write_csv("data.csv")
ããŒã¿ã®èšç®ã»éèšæ¹æ³
Polarsã§ã¯Pandasã«è² ããå£ããã®åŠçãã§ããŸãããåŠçã®æžãæ¹ã¯ã ãã¶ç°ãªããŸãããã®ããã€ã¡ãŒãžããããããã«ãå ã«Polarsã§ã®ããŒã¿åŠçã®æé ãã©ãŒãããïŒåãåæã«äœæããïŒã玹ä»ããŸãã
ããããæåã«è¿°ã¹ããšããæäœéãã玹ä»ããŸãããããã§ç޹ä»ããããæ¹ã ãã§ã¯Polarsã®ãã¹ãŠã®æ©èœã䜿ããããã§ã¯ãããŸããã
Polarsã®åºæ¬çãªäœ¿çšãã©ãŒããã
Polarsã§ã¯åºæ¬çã«selectãšfilterã¡ãœããã䜿çšããŠãããŸãããããŠããããããåã®ããŒã¿éžæïŒïŒåŠçïŒãè¡ã®ããŒã¿éžæãæ
ã£ãŠããŸãã
ãŸããããããã®ã¡ãœããã®äžã§æäœãè¡ããããšãã¯ãpl.Exprã¯ã©ã¹ã䜿çšããŸããç¹ã«pl.colã¯åã®æäœãè¡ããšãã«ãããã䜿çšããŸãã
ç¹ã«selectã§ã¯ãç¹å®ã®åã«å¯ŸããŠåŠçãå ããŠæ°ããåãšããŠè¿œå ããããšãã§ããŸãããªã®ã§ãåºæ¬çãªåŠçæé ã¯ä»¥äžã®ããã«ãªããŸãã
df.select(
# ããã§äœ¿çšããåã®éžæ
# ãŸãã¯ç¹å®ã®åã«å¯ŸããŠåŠçãè¡ã
# å Žåã«å¿ããŠã¯åŠçåŸãå¥ã®ã«ã©ã ãšããŠããŒã¿ã远å
).filter(
# ããã§ããŒã¿ã®äžãã䜿çšããè¡ãæœåº
).select(
).filter... # ãããç¹°ãè¿ã
æŽè«ã§ã¯ãããŸãããæäœéã®ããŒã¿ãã¬ãŒã ã®æäœã¯äžã®selectãšfilterãç¹°ãè¿ãã ãã§å®è£
ãè¡ããŸããselectâåã®æäœãfilterâè¡ã®æäœãšå¯Ÿå¿ãããããããã§ããã
åã®éžæã»æäœ select
selectã§ç¹å®ã®åãåãåºãããšãã§ããŸããå
·äœçãªäœ¿ãæ¹ãšããŠã¯ä»¥äžãã芧ãã ããã
df.select(
"name",
"age",
)
# åºå
# shape: (3, 3)
# ââââââââ¬ââââââ
# â name â age â
# â --- â --- â
# â str â i64 â
# ââââââââªââââââ¡
# â one â 10 â
# â one â 20 â
# â two â 30 â
# ââââââââŽââââââ
äžã®ãµã³ãã«ã§ã¯"name"ãš"age"ãšãååã®åãåãåºããŠããŸããçŽæçã§ç°¡åã§ããã
ããããPolarsã§ã¯åãåºãåã®ååãé åã«ããå¿ èŠããããŸãããïŒé åã«ããå¿ èŠããªãã ãã§ãé åã§æå®ããŠãåæ§ã®çµæãè¿ã£ãŠããŸããïŒ
# é
åã§ååãæå®ããŠãOK
df.select(
["name","age"]
)
# åºå
# shape: (3, 3)
# ââââââââ¬ââââââ
# â name â age â
# â --- â --- â
# â str â i64 â
# ââââââââªââââââ¡
# â one â 10 â
# â one â 20 â
# â two â 30 â
# ââââââââŽââââââ
åã®æäœ pl.col()
selectã§åãæå®ããããšãã§ããããæ¬¡ã¯åã®æäœãããããªããŸãããã®æã¯selectã®äžã«pl.col()ã䜿çšããŸãããã
df.select(
"name",
pl.col("age")*2
)
# åºå
# shape: (3, 3)
# ââââââââ¬ââââââ
# â name â age â
# â --- â --- â
# â str â i64 â
# ââââââââªââââââ¡
# â one â 20 â
# â one â 40 â
# â two â 60 â
# ââââââââŽââââââ
ããããããšã§ãageã®åã2åã«ãªã£ãŠçµæãè¿ãããŸãã
ããããã®åŠççµæãå¥ã®ã«ã©ã ã«ããããšãã¯ã.aliasã䜿çšããŸãããã
df.select(
"name",
"age",
(pl.col("age")*2).alias("*2")
# âã³ãŒãã `*2` ã§çµãã£ãŠããšã¡ãœãããã§ãŒã³ãã§ããªãã®ã§æ¬åŒ§ã§å²ã£ãŠãã
)
# åºå
# shape: (3, 3)
# ââââââââ¬ââââââ¬ââââââ
# â name â age â *2 â
# â --- â --- â --- â
# â str â i64 â i64 â
# ââââââââªââââââªââââââ¡
# â one â 10 â 20 â
# â one â 20 â 40 â
# â two â 30 â 60 â
# ââââââââŽââââââŽââââââ
å Žåããã䜿çšããåã®æäœ pl.when
å°ã现ããåŠçãæžãããšããããå Žååããå¿
èŠã«ãªããŸãããã®æã¯pl.whenã䜿çšããŸãããã
pl.whenã¯whenãthenãotherwiseãçµã¿åãããŠäœ¿çšããŸãã
df.select(
"name",
"age",
pl.when(pl.col("age")>18)
.then("æäºº")
.otherwise("æªæå¹Ž")
.alias("æäººæžã¿ãïŒ") # whenã«ãaliasã䜿çšå¯èœ
)
# åºå
# shape: (3, 3)
# ââââââââ¬ââââââ¬âââââââââââââââ
# â name â age â æäººæžã¿ãïŒ â
# â --- â --- â --- â
# â str â i64 â bool â
# ââââââââªââââââªâââââââââââââââ¡
# â one â 10 â false â
# â one â 20 â true â
# â two â 30 â true â
# ââââââââŽââââââŽâââââââââââââââ
è¡ã®éžæ filter
filterã§è¡ã®çµã蟌ã¿ãè¡ããŸããåºæ¬çã«ã¯è¡ããšã«çµã蟌ã¿ãè¡ãã®ã§ãäžã«ãç»å Žããpl.colã䜿ããŸãã
df.filter(
pl.col("age") > 10
)
# åºå
# shape: (2, 2)
# ââââââââ¬ââââââ
# â name â age â
# â --- â --- â
# â str â i64 â
# ââââââââªââââââ¡
# â one â 20 â
# â two â 30 â
# ââââââââŽââââââ
è€æ°æ¡ä»¶ãæå®ã§ããŸãã
df.filter(
(pl.col("age") > 10)
& (pl.col("age") < 30)
# pythonã§ã¯&ã|ã®æŒç®åªå
é äœãé«ããããæ¬åŒ§ã§å²ã
)
# åºå
# shape: (2, 2)
# ââââââââ¬ââââââ
# â name â age â
# â --- â --- â
# â str â i64 â
# ââââââââªââââââ¡
# â one â 20 â
# ââââââââŽââââââ
ãã¡ãããéãåã§æ¡ä»¶æå®ããããselectã§è¿œå ããæ°ããåã«å¯ŸããŠãæäœå¯èœã§ãã
ãŸãšã
ããŠããããŸã§selectãšfilterã䜿çšããPolarsã®äœ¿ç𿹿³ã玹ä»ããŸããã
ã§ã¯ããããèžãŸããŠä»¥äžã®ã³ãŒããèªãã§ã¿ãŸããããïŒâ»åèã®ããã®ã³ãŒããªã®ã§ãåé·ãªéšåããããŸããïŒ
df.select(
"name",
"age",
pl.when(pl.col("age")>18)
.then(True)
.otherwise(False)
.alias("æäººæžã¿ãïŒ")
).filter(
pl.col("æäººæžã¿ãïŒ")
).select(
"name",
"age"
)
ã¯ãããããäžããèªãã§ãããšããã®ããã«è§£éã§ããŸãã
- 䜿çšããåãéžæãã
-
nameãšageããã®ãŸãŸäœ¿çš -
ageã18以äžããboolã§è¡šãæäººæžã¿ãïŒã®åã远å
-
- 䜿çšããè¡ãéžæãã
-
æäººæžã¿ãïŒã®åãTrueã§ãããã®ã®ã¿ã衚瀺
-
- 䜿çšããåãéžæãã
-
nameãšageããã®ãŸãŸäœ¿çšïŒæäººæžã¿ãïŒã®åã¯è¡šç€ºããªãïŒ
-
ãã£ãŠåºåã¯ä»¥äžã®ããã«ãªããŸãã
df.select(
"name",
"age",
pl.when(pl.col("age")>18)
.then(True)
.otherwise(False)
.alias("æäººæžã¿ãïŒ")
).filter(
pl.col("æäººæžã¿ãïŒ")
).select(
"name",
"age"
)
# åºå
# shape: (2, 2)
# ââââââââ¬ââââââ
# â name â age â
# â --- â --- â
# â str â i64 â
# ââââââââªââââââ¡
# â one â 20 â
# â two â 30 â
# ââââââââŽââââââ
ãšããã®ããã«selectãšfilterã亀äºã«äœ¿çšããŠããã ãã§ãç°¡åã«ãããããããããŒã¿ãã¬ãŒã ã®æäœãã§ããŸããã
å人çã«ãèªåã®é ã®äžã§æã£ãããšããã®ãŸãŸãã®é çªã§æžãé£ãããããšããããPolarsã®è¯ãã ãªããšæã£ãŠããŸãã
èŠããŠããããã䟿å©ãªã¡ãœãããã¡
åããã¹ãŠéžæ pl.all()
selectãããšãã«ããã¹ãŠã®åãéžæã§ããŸãã
df.select(
pl.all()
)
æå®ããå以å€ãéžæ pl.exclude()
selectãããšãã«ãæå®ããå以å€ãéžæããŸãã
æå®ãããåãå€ããšãã«äŸ¿å©ãè€æ°æå®ãå¯èœã
df.select(
pl.exclude("name")
)
å€ãnullããå€å¥ .is_null()
Pandasã§ããisna()ã®ãããªãã®ã
æ¬ æå€ãããè¡ã䜿çšããªããšããªã©ã«äœ¿ãã
df.select(
pl.col("name").is_null() # nameãæ¬ æããŠããè¡ã®ã¿è¡šç€º
)
å€ãnullã§ã¯ãªãããšãå€å¥ .is_not_null()
.is_null()ã®éã
ããŒã¿ãå
¥ã£ãŠãããTrueã
df.select(
pl.col("name").is_not_null() # nameã®ããŒã¿ãå
¥ã£ãŠããè¡ã®ã¿è¡šç€º
)
çµããã«
ãããŸã§ã§ãPolarsã®åºæ¬ã®äœ¿ãæ¹ã玹ä»ããŠããŸããã
ããŸãšããã«ãæžããŠãããšãããPolarsã¯æ £ãããšå¯èªæ§ããšãŠãé«ããšæããŠããŸãããããåŠçéåºŠãæ©ãã®ã§ãå€å°éã«æžããŠãé床ãå šãæ°ã«ãªããŸããã
ãã®ãããåå人ã®è©±ã§ãããä»ãŸã§Pandasã䜿çšããŠãããšãããPolarsã«å€ããããçç£æ§ãã ãã¶äžãããŸãããã»ããšãããã
ãã®èšäºãæžãã«ããã£ãŠ
Polarsã«ç§»è¡ãããšãã«å°ãæã£ãŠããã®ãããæ°ããäœããå°å ¥ãããšãããã£ããäœ¿ãæ¹ãææ¡ãããŸã§ã®æéããªãã¹ãççž®ãããããšããããšã§ããã
PolarsãšPandasã®ã©ã¡ããããããæ¯ã¹ããšãã«ãPolarsã®äœ¿ãæ¹ãåŠã¶ã®ã«1é±éãããã£ãŠããããå°ãå¿äœç¡ãæ°ãããŸãããã¡ããæ éãªæ¯èŒãå¿ èŠã§ããã åŠã¶ã®ãæ©ãã«è¶ããããšã¯ãããŸããã ãã®ãããæåã®åã£æãããç°¡åã§ããã°ããã»ã©ããã®ããŒãã«ãäœããªãããšæããŸãããã®èšäºã¯ãã®ããŒãã«ãäžããããšãç®çãšããŠå·çããŸããã
ãªã®ã§ãPolarsãæ®æ®µãã䜿çšããŠããæ¹ã ãèŠããšãããã£ãšããæžãæ¹ããããïŒããåæã«ãã©ãŒããããäœããªïŒããªã©ã®ãæèŠãåºãŠãããããããŸããããã容赊ãã ããã
Polarsã«ã¯ãä»å玹ä»ãã以å€ã®äŸ¿å©ãªæ©èœããããããããŸãããã®èšäºã§ãPolasè¯ããããããããšæã£ãŠããã ãããããã®ãšãã«ãŸã調ã¹ãŠèŠãŠãã ãããããããåºãŠããŸãã
ãã®èšäºãå°ãã§ãPolarsã«èå³ãæã£ãŠããã ããã£ããã«ãªãã°å¹žãã§ãã
æåŸã«
äžçªæåã«æžããŸãããšããããã®èšäºã¯ãLITALICO Advent Calendar 2023ã10æ¥ç®ã®èšäºã§ãã
ææ¥ã¯@gorilla_gardenãããš@H-Asakawaãããæ
åœãããŸãããæ¥œãã¿ã«ïŒïŒ
ãããŠåã¯24æ¥ã«ãèšäºãæçš¿äºå®ã§ãããã¡ãããæ¥œãã¿ã«ããŠããã ããã°å¹žãã§ãã