pythonとpolarsでエクセルから検索し品名ごとの合計を出すプログラム例
高速だと最近評判のpythonのDataFrameアプリのpolarsの勉強がてら、エクセルファイルから、複数品名の検索とそれぞれの合計を出す関数利用のプログラムを作ってみたら、なんと 「動作した」!
わが人生で、関数利用するプログラムは、ほとんど初めてだ。チャレンジ初めて2日でできた。少々感動。
最初、複数の検索を行おうと思ったが撃退された。accessの例でSQLならできそうだと DBアプリのduckdbのSQL利用したら0.6秒かかった。
1件ずつの検索はできたから、ふとpythonのイテレータ使えると考えてpolarsとpythonだけで、できないかなと。作ってみたのが下記のプログラム。
(Noteはcordそのままの形で記載できるのはありがたい、他のブログではできないようだ)。
複数の品名リストを作成し、順番にひとつずつエクセルから検索してその明細を積み重ねたリスト作り、品名ごとの合計を計算させるプログラムならできそうだ。
試しに、2件の品名をテストしたら、
25000行から12件抽出でき、明細行をプリントし、品名ごとの合計もプリント画面プリントするのに所要時間は、
1.エクセル読み出しに2.6秒、
2.検索抽出し計算するのに0.04秒
この評価は、高速それとも普通?
import polars as pl
pl.Config.set_tbl_cols(-1)
pl.Config.set_tbl_rows(-1)
import time
start = time.time()
time_prev = start
file = "C:/*********.xlsm"
sheet = "受注明細"
df = pl.read_excel(file, sheet_name=sheet
, read_options={"infer_schema_length": None}
)
print(time.time()-time_prev) #所要時間2 .6秒
time_prev = time.time()
# ---------------------------------------------------
findwords=['ABCD','XYZ'] #品名検索リスト
# ---------------------------------------------------
# キーワードで検索し必要項目のデータフレームを返す関数定義
def find_code(x):
df_x=(df
.filter(pl.col('品名).str.contains(x))
.select('品名,'納期','数量','金額')
.sort('納期')
.with_columns(pl.col('納期')//100) #8桁数字の年月日を年月に
)
return df_x
# --------------------------------------------------
# 検索結果を入れるDataFrameの初期化と項目名設定
df_y = pl.DataFrame(
schema={'品名':str,'納期':int,'数量':float,'金額':int})
# リストの検索、関数検索結果を受取データフレームへ順次追加
for i in findwords:
df_y = pl.concat([df_y, find_code(i)])
print(df_y)
# --------------------------------------------------
# 抽出した品種ごとの合計プリント
print( df_y
.select('品名','数量','金額')
.group_by('品名')
.sum()
)
# --------------------------------------------------
# 所要時間プリント
print(time.time()-time_prev) #25000行から12行抽出 /合計所要時間 0.04秒
time_prev = time.time()
この記事が気に入ったらサポートをしてみませんか?