

提示されたコードの逐次解説（ステップ・バイ・ステップ解説）です。処理の流れ、日本の税制ロジック、およびPython/Polarsの記述ポイントを順番に紐解いていきます。


# ==========================================
# ==========================================

import math
import polars as pl

# ==========================================
# 1. パラメータ設定（定数）
# =========================================
RETIREMENT_ALLOWANCE = 210_000_000  # 退職金支給額（円）
YEARS_OF_SERVICE = 31  # 勤続年数（年）
IS_SHORT_TERM_OFFICER = False  # 短期役員（役員在任5年以下）フラグ


# ==========================================
# 2. 税金計算関数（内部処理）
# ==========================================
def calculate_tax_details(amount: int, years: int, is_short_officer: bool):
    # ① 退職所得控除額の計算
    if years <= 1:
        deduction = 800_000
    elif years <= 20:
        deduction = max(400_000 * years, 800_000)
    else:
        deduction = 8_000_000 + 700_000 * (years - 20)

    # 控除後の残額
    taxable_base = max(0, amount - deduction)

    # ② 課税退職所得金額の計算（1,000円未満切り捨て）
    if is_short_officer and years <= 5:
        # 短期役員は1/2軽減なし
        taxable_income = math.floor(taxable_base / 1000) * 1000
    else:
        taxable_income = math.floor((taxable_base / 2) / 1000) * 1000

    # ③ 所得税 ＋ 復興特別所得税（累進税率）
    tax_brackets = [
        (1_950_000, 0.05, 0),
        (3_300_000, 0.10, 97_500),
        (6_950_000, 0.20, 427_500),
        (9_000_000, 0.23, 636_000),
        (18_000_000, 0.33, 1_536_000),
        (40_000_000, 0.40, 2_796_000),
        (float("inf"), 0.45, 4_796_000),
    ]

    base_national_tax = 0
    if taxable_income > 0:
        for limit, rate, quick_deduction in tax_brackets:
            if taxable_income <= limit:
                base_national_tax = taxable_income * rate - quick_deduction
                break

    # 復興特別所得税（2.1%）を加算し、1円未満切り捨て
    income_tax = math.floor(base_national_tax * 1.021)

    # ④ 住民税の計算（一律10%：道府県民税4%＋市町村民税6%）
    prefectural_tax = math.floor((taxable_income * 0.04) / 100) * 100
    municipal_tax = math.floor((taxable_income * 0.06) / 100) * 100
    resident_tax = prefectural_tax + municipal_tax

    # ⑤ 合計税額と手取り額
    total_tax = income_tax + resident_tax
    net_take_home = amount - total_tax

    return {
        "退職金支給額": amount,
        "勤続年数": years,
        "退職所得控除額": deduction,
        "課税退職所得金額": taxable_income,
        "所得税・復興特別所得税": income_tax,
        "住民税": resident_tax,
        "合計税金": total_tax,
        "手取り支給額": net_take_home,
    }


# ==========================================
# 3. Polars DataFrame の作成と出力
# ==========================================
# 計算実行
calc_data = calculate_tax_details(
    RETIREMENT_ALLOWANCE, YEARS_OF_SERVICE, IS_SHORT_TERM_OFFICER
)

# Polars DataFrameの生成
df = pl.DataFrame([calc_data])

# 表示設定調整（数値が見やすいように整頓）
pl.Config.set_tbl_formatting("ASCII_FULL")
pl.Config.set_tbl_cols(10)

print("■ 退職金税金計算結果（Polars DataFrame）")
print(df)

print("\n■ 項目別詳細一覧")
for col in df.columns:
    val = df[col][0]
    if "年数" in col:
        print(f"・{col:15s}: {val:2d} 年")
    else:
        print(f"・{col:15s}: {val:12,d} 円")


# ==========================================
# ==========================================

プログラムの逐次解説

1. ライブラリのインポート
Python

import math
import polars as pl

import math : 端数処理（切り捨て）を行う関数 math.floor() を使用するためにPython標準の数学ライブラリを読み込んでいます。
import polars as pl : 高速なデータ処理ライブラリ「Polars」をインポートし、慣例に従って pl という別名をつけています。


2. パラメータ設定（入力パラメータ）
Python

# ==========================================
# 1. パラメータ設定（定数）
# ==========================================
RETIREMENT_ALLOWANCE = 210_000_000  # 退職金支給額（円）
YEARS_OF_SERVICE = 31  # 勤続年数（年）
IS_SHORT_TERM_OFFICER = False  # 短期役員（役員在任5年以下）フラグ

大文字の変数名: これらは定数（変更しない設定値）であることをわかりやすくするため大文字で定義されています。
210_000_000 : 数値の中にあるアンダースコア（ _ ）は、桁数を読みやすくするためのPythonの表記法で、値としては 210000000 （2億1,000万円）と同じです。


3. 税金計算関数の内部ロジック ( calculate_tax_details )
関数の内部では、退職所得の課税ルールに則って①〜⑤の手順で計算を行っています。



① 退職所得控除額の計算
Python

    # ① 退職所得控除額の計算
if years <= 1:
deduction = 800_000
elif years <= 20:
deduction = max(400_000 * years, 800_000)
else:
deduction = 8_000_000 + 700_000 * (years - 20)
# 控除後の残額
taxable_base = max(0, amount - deduction)

控除額の判定:
1年以下: 一律80万円
20年以下: 40万円 × 勤続年数 （最低80万円保証）
20年超: 800万円 + 70万円 × (勤続年数 - 20年)
勤続30年の場合: $8,000,000 + 700,000 \times 10 = 15,000,000$（1,500万円）となります。
taxable_base : 退職金支給額から控除額を引いた残額を求めます。控除額が支給額を上回った場合にマイナスにならないよう、 max(0, ...) で下限を0に設定しています。


② 課税退職所得金額の計算（1/2課税と千円未満切り捨て）
Python

    # ② 課税退職所得金額の計算（1,000円未満切り捨て）
if is_short_officer and years <= 5:
# 短期役員は1/2軽減なし
taxable_income = math.floor(taxable_base / 1000) * 1000
else:
taxable_income = math.floor((taxable_base / 2) / 1000) * 1000

1/2課税の特例: 通常の退職金の場合、税負担を軽くするため控除後の残額を半分（ taxable_base / 2 ）にします。（※役員在任5年以下の短期役員の場合はこの1/2が適用されません）
端数処理: 税法上、課税所得は1,000円未満切り捨てとなります。 math.floor(x / 1000) * 1000 という計算で1,000円単位へ丸めています。


③ 所得税 ＋ 復興特別所得税（累進税率）
Python

    # ③ 所得税 ＋ 復興特別所得税（累進税率）
tax_brackets = [
(1_950_000, 0.05, 0),
(3_300_000, 0.10, 97_500),
(6_950_000, 0.20, 427_500),
(9_000_000, 0.23, 636_000),
(18_000_000, 0.33, 1_536_000),
(40_000_000, 0.40, 2_796_000),
(float("inf"), 0.45, 4_796_000),
]
base_national_tax = 0
if taxable_income > 0:
for limit, rate, quick_deduction in tax_brackets:
if taxable_income <= limit:
base_national_tax = taxable_income * rate - quick_deduction
break
# 復興特別所得税（2.1%）を加算し、1円未満切り捨て
income_tax = math.floor(base_national_tax * 1.021)

tax_brackets （速算表）: (課税所得の上限, 税率, 控除額) のタプルリストで、日本の超過累進税率の基準を定義しています。
税額計算: 課税所得が該当する階層をループで探し、 所得 × 税率 - 控除額 で基準所得税額を算出します。
復興特別所得税: 基準所得税額に 2.1%（ * 1.021 ）を掛け合わせ、 math.floor() で1円未満を切り捨てます。


④ 住民税の計算
Python

    # ④ 住民税の計算（一律10%：道府県民税4%＋市町村民税6%）
prefectural_tax = math.floor((taxable_income * 0.04) / 100) * 100
municipal_tax = math.floor((taxable_income * 0.06) / 100) * 100
resident_tax = prefectural_tax + municipal_tax

住民税の端数処理: 退職所得にかかる住民税は、道府県民税（4%）と市町村民税（6%）をそれぞれ別々に100円未満切り捨て（ math.floor(x / 100) * 100 ）してから合算するのが国税・地方税法上の原則です。コードもその規則通りの計算式になっています。


⑤ 合計額の算出と戻り値（辞書形式）
Python

    # ⑤ 合計税額と手取り額
total_tax = income_tax + resident_tax
net_take_home = amount - total_tax
return {
"退職金支給額": amount,
"勤続年数": years,
"退職所得控除額": deduction,
"課税退職所得金額": taxable_income,
"所得税・復興特別所得税": income_tax,
"住民税": resident_tax,
"合計税金": total_tax,
"手取り支給額": net_take_home,
}

計算結果を「キー: 値」の辞書型（ dict ）にまとめて返却します。キーを日本語にすることで、そのままDataFrameの列名として活用できます。


4. 計算の実行と Polars DataFrame への展開
Python

# ==========================================
# 3. Polars DataFrame の作成と出力
# ==========================================
# 計算実行
calc_data = calculate_tax_details(
RETIREMENT_ALLOWANCE, YEARS_OF_SERVICE, IS_SHORT_TERM_OFFICER
)
# Polars DataFrameの生成
df = pl.DataFrame([calc_data])

calculate_tax_details(...) : 最初に入力した設定値を渡して計算を実行します。
pl.DataFrame([calc_data]) : 取得した1件の辞書データをリスト [calc_data] に入れ、Polarsのデータフレーム構造（1行8列の表データ）へ変換しています。


5. 出力フォーマットの設定と表示
Python

# 表示設定調整（数値が見やすいように整頓）
pl.Config.set_tbl_formatting("ASCII_FULL")
pl.Config.set_tbl_cols(10)
print("■ 退職金税金計算結果（Polars DataFrame）")
print(df)

pl.Config.set_tbl_formatting("ASCII_FULL") : 表の枠線をきれいな罫線スタイルで出力する設定です。
pl.Config.set_tbl_cols(10) : 列数が多くても省略されず、全列（8列分）が表示されるように上限を設けています。


6. 項目ごとの整形表示（ループ処理）
Python

print("\n■ 項目別詳細一覧")
for col in df.columns:
val = df[col][0]
if "年数" in col:
print(f"・{col:15s}: {val:2d} 年")
else:
print(f"・{col:15s}: {val:12,d} 円")

df.columns : DataFrameに含まれるすべての列名をループ処理します。
df[col][0] : 該当列の0番目（最初の1行目）の値を取り出します。
フォーマットの切り分け:
列名に "年数" が含まれる場合: 2d （2桁右寄せの数値）+ "年"
その他の金額項目: 12,d （12桁右寄せ・3桁区切りのカンマ付き整数）+ "円"
文字位置が綺麗に揃った、視認性の高い詳細一覧を出力するための処理です。
