Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import plotly.graph_objects as go
- import plotly.io as pio
- def 楽天のポイント計算(積立額, カードのグレード, 保有残高):
- 年率 = 0
- # 楽天カードの計算式
- return (
- 積立額 * カードのグレード["倍率"] - カードのグレード["年会費"] + 年率 * 保有残高
- )
- def マネックスのポイント計算(積立額, 保有残高):
- # マネックス証券の計算式
- 倍率_first = 1.1 / 100
- 倍率_second = 0.6 / 100
- 倍率_third = 0.2 / 100
- 第1段階金額 = 50000
- 第2段階金額 = 70000
- 第3段階金額 = 100000
- 年率 = 0.03 / 12
- # ポイントの計算式
- if 積立額 < 第1段階金額:
- 合計ポイント = 積立額 * 倍率_first
- elif 第1段階金額 <= 積立額 < 第2段階金額:
- 合計ポイント = 第1段階金額 * 倍率_first + (積立額 - 第1段階金額) * 倍率_second
- elif 第2段階金額 <= 積立額 <= 第3段階金額:
- 合計ポイント = (
- 第1段階金額 * 倍率_first
- + (第2段階金額 - 第1段階金額) * 倍率_second
- + (積立額 - 第2段階金額) * 倍率_third
- )
- return 合計ポイント + 年率 * 保有残高
- def auのポイント計算(積立額, 保有残高):
- ポイント付与率 = 1 / 100
- 年会費 = 0 / 12
- 年率 = 0.005 / 12
- return 積立額 * ポイント付与率 - 年会費 + 年率 * 保有残高
- def paypayのポイント計算(積立額, 保有残高):
- ポイント付与率 = 0.7 / 100
- 年会費 = 0 / 12
- 合計ポイント = 積立額 * ポイント付与率 - 年会費
- if 合計ポイント >= 350:
- 合計ポイント = 350 - 年会費
- return 合計ポイント
- def paypayのポイント計算残高使用(積立額, 保有残高):
- # 先にクレカを5万まで行こない残りを残高として計算する場合
- クレカ最大額 = 50000
- # 残高最大額 = 50000
- クレカポイント付与率 = 0.7 / 100
- 残高ポイント付与率 = 0.5 / 100
- if 積立額 <= クレカ最大額:
- 年会費 = 0 / 12
- 合計ポイント = 積立額 * クレカポイント付与率 - 年会費
- else:
- 合計ポイント = (
- クレカ最大額 * クレカポイント付与率
- + (積立額 - クレカ最大額) * 残高ポイント付与率
- )
- return 合計ポイント
- if __name__ == "__main__":
- # 積立額
- x = np.linspace(0, 100000, 100)
- y = np.linspace(0, 1000000, 100)
- X, Y = np.meshgrid(x, y)
- rakuten_normal_grade = {"年会費": 0, "倍率": 0.5 / 100}
- rakuten_gold_grade = {"年会費": 2200 / 12, "倍率": 0.75 / 100}
- rakuten_premium_grade = {"年会費": 11000 / 12, "倍率": 1 / 100}
- # 計算遅いのでベクトル化
- マネックスのポイント計算_vec = np.vectorize(マネックスのポイント計算)
- 楽天のポイント計算_vec = np.vectorize(楽天のポイント計算)
- auのポイント計算_vec = np.vectorize(auのポイント計算)
- paypayのポイント計算_vec = np.vectorize(paypayのポイント計算)
- paypayのポイント計算残高使用_vec = np.vectorize(paypayのポイント計算残高使用)
- # グラフ作成
- plot = [
- go.Surface(
- x=X,
- y=Y,
- z=マネックスのポイント計算_vec(X, Y),
- name="マネックス",
- ),
- go.Surface(
- x=X,
- y=Y,
- z=楽天のポイント計算_vec(X, rakuten_normal_grade, Y),
- # mode="lines",
- name="楽天カード",
- ),
- go.Surface(
- x=X,
- y=Y,
- z=楽天のポイント計算_vec(X, rakuten_gold_grade, Y),
- # mode="lines",
- name="楽天ゴールド",
- ),
- go.Surface(
- x=X,
- y=Y,
- z=楽天のポイント計算_vec(X, rakuten_premium_grade, Y),
- # mode="lines",
- name="楽天プレミアム",
- ),
- go.Surface(
- x=X,
- y=Y,
- z=auのポイント計算_vec(X, Y),
- # mode="lines",
- name="au",
- ),
- go.Surface(
- x=X,
- y=Y,
- z=paypayのポイント計算_vec(X, Y),
- # mode="lines",
- name="paypayクレカのみ",
- ),
- go.Surface(
- x=X,
- y=Y,
- z=paypayのポイント計算残高使用_vec(X, Y),
- # mode="lines",
- name="paypayクレカ->残高の順に積立",
- ),
- ]
- fig = go.Figure(data=plot)
- fig.update_layout(
- scene=dict(
- xaxis_title="月当たり積立額(円)",
- yaxis_title="保有残高(円)",
- zaxis_title="貰えるポイント(円冠算",
- )
- )
- # fig.show()
- prefix = "3D_plot" # 保存ファイル名の接頭辞
- save_name = f"{prefix}_default_scatter"
- pio.write_html(fig, f"{save_name}.html")
- # pio.write_image(fig, f"{save_name}.png")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement