Slide 27
Slide 27 text
応用:例題4)pl.Exprを関数化する例
# P-086: 解答例
import math
def distance(x1: pl.Expr, y1: pl.Expr, x2: pl.Expr, y2: pl.Expr) -> pl.Expr:
lon1_rad = x1 * math.pi / 180
lon2_rad = x2 * math.pi / 180
lat1_rad = y1 * math.pi / 180
lat2_rad = y2 * math.pi / 180
L = 6371 * (
lat1_rad.sin() * lat2_rad.sin() + lat1_rad.cos() * lat2_rad.cos() * (lon1_rad - lon2_rad).cos()
).arccos()
return L
df_customer.join(
df_geocode.groupby("postal_cd").agg([pl.col("longitude").mean(), pl.col("latitude").mean()])
, on="postal_cd", how="left"
).join(
df_store, left_on="application_store_cd", right_on="store_cd"
).select([
"customer_id", pl.col("address").alias("customer_address"), pl.col("address_right").alias("store_address")
, distance( pl.col("longitude") , pl.col("latitude"), pl.col("longitude_right") , pl.col("latitude_right")
).alias("distance")
]).sort("customer_id").head(10)
P-086: 前設問で作成した緯度経度つき顧客データフレーム( df_customer_1)に対し、申込み店舗コード( application_store_cd)をキーに店舗
データフレーム( df_store)と結合せよ。そして申込み店舗の緯度( latitude)・経度情報(longitude)と顧客の緯度・経度を用いて距離( km)を求
め、顧客ID(customer_id)、顧客住所(address)、店舗住所(address)とともに表示せよ。計算式は簡易式で良いものとするが、その他精度の
高い方式を利用したライブラリを利用してもかまわない。結果は 10件表示すれば良い。