❄️

Snowflake: python-holidaysを使用して祝日をチェックするUDFを作成する

2023/05/16に公開

すでにこちらに同様の趣旨の記事はあるのですが、記事公開の2022年7月時点ではholidaysのバージョンが古く、python-holidaysパッケージをステージにアップロードして使用するやり方を紹介しています。
2023年5月時点では、SnowflakeのAnacondaに含まれるholidaysは0.18となっているので、より簡便にUDFの作成が行えます。

特定日が祝日かどうかをチェック

create or replace function IS_HOLIDAY(day date, ctry varchar)
returns boolean
language python
runtime_version = '3.8'
packages = ('holidays')
handler = 'is_holiday'
as
$$
from holidays import country_holidays 
def is_holiday(day, ctry):
  ctry_holidays = country_holidays(ctry)
  return day in ctry_holidays
$$
;

select IS_HOLIDAY('2023-05-05','JP');
-- TRUE
select IS_HOLIDAY('2023-05-06','JP');
-- FALSE

祝日の一覧

Python UDTFを作成します。UDTFの場合、ハンドラークラスで指定するメソッド名__init__,process,end_partitionが決まっています(process以外はオプショナル)。

create or replace function LIST_HOLIDAYS(
    country string, years array
)
returns table(day date, holiday string)
language python
runtime_version = '3.8'
packages = ('holidays')
handler='X'
as 
$$
from holidays import country_holidays 
class X:
    def __init__(self):
        pass
    def process(self, country, years):
        range_years = range(min(years), 1 + max(years))
        holidays_dict = country_holidays(
           country
           , years=range_years
        )
        return(((k, v) for k, v in holidays_dict.items()))
    def end_partition(self):
        pass
$$;

select * from table(LIST_HOLIDAYS('JP', [2023,2024])) order by 1;
結果

Discussion