577 lines
18 KiB
Python
577 lines
18 KiB
Python
from decimal import Decimal, ROUND_HALF_UP
|
|
|
|
import pandas
|
|
|
|
from utils.pandas_extension import save_as_workbook
|
|
|
|
dataset = {}
|
|
|
|
# 机构绩效基础数据
|
|
sheets = pandas.ExcelFile("基础数据.xlsx")
|
|
|
|
for sheet_name in sheets.sheet_names:
|
|
dataset[sheet_name] = pandas.read_excel(sheets, sheet_name=sheet_name, dtype=str)
|
|
|
|
|
|
# 根据年度达成率映射为年终奖
|
|
def mapped_as_regional_year_end_bonus(x: Decimal) -> str:
|
|
|
|
# noinspection PyUnreachableCode
|
|
match x:
|
|
case x if x < 70:
|
|
z = "0薪"
|
|
case x if 70 <= x < 80:
|
|
z = "4薪"
|
|
case x if 80 <= x < 90:
|
|
z = "5薪"
|
|
case x if 90 <= x < 100:
|
|
z = "6薪"
|
|
case x if 100 <= x < 110:
|
|
z = "7薪"
|
|
case x if 110 <= x < 120:
|
|
z = "8薪"
|
|
case x if 120 <= x < 130:
|
|
z = "9薪"
|
|
case x if 130 <= x < 140:
|
|
z = "10薪"
|
|
case x if 140 <= x < 150:
|
|
z = "11薪"
|
|
case x if x >= 150:
|
|
z = "12薪"
|
|
case _:
|
|
z = "年度达成率未匹配年终奖"
|
|
|
|
return z
|
|
|
|
|
|
# 大区年终薪酬
|
|
# 就大区机构周报,筛选大区/机构名称包含大区的行、年度消费目标(万)/累计消费规模(万)/年度达成率,根据年度达成率匹配年终奖基准额度
|
|
regional_year_end_bonus = (
|
|
dataset["大区机构达成率1"]
|
|
.loc[
|
|
dataset["大区机构达成率1"]["大区/机构名称"].str.contains("大区"),
|
|
["大区/机构名称", "年度消费目标(万)", "累计消费规模(万)", "年度达成率"],
|
|
]
|
|
.assign(
|
|
年度达成率=lambda dataframe: dataframe["年度达成率"].apply(
|
|
lambda cell: (Decimal(cell) * 100).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
),
|
|
)
|
|
)
|
|
.assign(
|
|
年终奖=lambda dataframe: dataframe["年度达成率"].apply(
|
|
lambda cell: mapped_as_regional_year_end_bonus(cell)
|
|
)
|
|
)
|
|
.sort_values(by="年度达成率", ascending=False)
|
|
.reset_index(drop=True)
|
|
)
|
|
|
|
|
|
def mapped_as_institutional_year_end_bonus(x: pandas.Series) -> str | None:
|
|
|
|
if x["年度达成率"] < 70:
|
|
if (
|
|
x["大区/机构名称"]
|
|
in "安徽、河南、浙江、上海、云南、湖北、广东、广西、河北、江苏、江西、甘肃、黑吉、辽宁、山西、新疆、四川"
|
|
):
|
|
z = "0薪"
|
|
else:
|
|
z = None
|
|
elif 70 <= x["年度达成率"] < 80:
|
|
if (
|
|
x["大区/机构名称"]
|
|
in "安徽、河南、浙江、上海、云南、湖北、广东、广西、河北、江苏、江西、甘肃"
|
|
):
|
|
z = "0薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "2薪"
|
|
else:
|
|
z = None
|
|
elif 80 <= x["年度达成率"] < 90:
|
|
if x["大区/机构名称"] in "安徽、河南、浙江、上海、云南、湖北、广东、广西":
|
|
z = "0薪"
|
|
elif x["大区/机构名称"] in "河北、江苏、江西、甘肃":
|
|
z = "2薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "3薪"
|
|
else:
|
|
z = None
|
|
elif 90 <= x["年度达成率"] < 100:
|
|
if x["大区/机构名称"] in "安徽、河南、浙江、上海、云南、湖北、广东、广西":
|
|
z = "2薪"
|
|
elif x["大区/机构名称"] in "河北、江苏、江西、甘肃":
|
|
z = "3薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "4薪"
|
|
else:
|
|
z = None
|
|
elif 100 <= x["年度达成率"] < 120:
|
|
if x["大区/机构名称"] in "安徽、河南、浙江、上海、云南、湖北、广东、广西":
|
|
z = "3薪"
|
|
elif x["大区/机构名称"] in "河北、江苏、江西、甘肃":
|
|
z = "4薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "5薪"
|
|
else:
|
|
z = None
|
|
elif 120 <= x["年度达成率"] < 140:
|
|
if x["大区/机构名称"] in "安徽、河南、浙江、上海、云南、湖北、广东、广西":
|
|
z = "4薪"
|
|
elif x["大区/机构名称"] in "河北、江苏、江西、甘肃":
|
|
z = "5薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "6薪"
|
|
else:
|
|
z = None
|
|
elif 140 <= x["年度达成率"] < 160:
|
|
if x["大区/机构名称"] in "安徽、河南、浙江、上海、云南、湖北、广东、广西":
|
|
z = "5薪"
|
|
elif x["大区/机构名称"] in "河北、江苏、江西、甘肃":
|
|
z = "6薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "7薪"
|
|
else:
|
|
z = None
|
|
elif 160 <= x["年度达成率"] < 180:
|
|
if x["大区/机构名称"] in "安徽、河南、浙江、上海、云南、湖北、广东、广西":
|
|
z = "6薪"
|
|
elif x["大区/机构名称"] in "河北、江苏、江西、甘肃":
|
|
z = "7薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "8薪"
|
|
else:
|
|
z = None
|
|
elif 180 <= x["年度达成率"] < 200:
|
|
if (
|
|
x["大区/机构名称"]
|
|
in "安徽、河南、浙江、上海、云南、湖北、广东、广西、河北、江苏、江西、甘肃"
|
|
):
|
|
z = "8薪"
|
|
elif x["大区/机构名称"] in "黑吉、辽宁、山西、新疆、四川":
|
|
z = "9薪"
|
|
else:
|
|
z = None
|
|
else:
|
|
if (
|
|
x["大区/机构名称"]
|
|
in "安徽、河南、浙江、上海、云南、湖北、广东、广西、河北、江苏、江西、甘肃、黑吉、辽宁、山西、新疆、四川"
|
|
):
|
|
z = "10薪"
|
|
else:
|
|
z = None
|
|
|
|
return z
|
|
|
|
|
|
# 机构年终薪酬
|
|
institutional_year_end_bonus = (
|
|
dataset["大区机构达成率1"]
|
|
.loc[
|
|
~dataset["大区机构达成率1"]["大区/机构名称"].str.contains("大区")
|
|
& ~dataset["大区机构达成率1"]["大区/机构名称"].isin(["宁夏(只宁煤)"]),
|
|
["大区/机构名称", "年度消费目标(万)", "累计消费规模(万)", "年度达成率"],
|
|
]
|
|
.assign(
|
|
年度达成率=lambda dataframe: dataframe["年度达成率"].apply(
|
|
lambda cell: (Decimal(cell) * 100).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
),
|
|
)
|
|
)
|
|
.assign(
|
|
年终奖=lambda dataframe: dataframe[["大区/机构名称", "年度达成率"]].apply(
|
|
lambda row: mapped_as_institutional_year_end_bonus(row), axis="columns"
|
|
)
|
|
)
|
|
.dropna(subset=["年终奖"])
|
|
.sort_values(by="年度达成率", ascending=False)
|
|
.reset_index(drop=True)
|
|
)
|
|
|
|
|
|
# 根据机构所在省份匹配为机构名称
|
|
def mapped_as_institution_name(x):
|
|
|
|
# noinspection PyUnreachableCode
|
|
match x:
|
|
case "北京市" | "天津市":
|
|
z = "京津"
|
|
case "河北省":
|
|
z = "河北"
|
|
case "山西省":
|
|
z = "山西"
|
|
case "内蒙古自治区":
|
|
z = "内蒙"
|
|
case "辽宁省":
|
|
z = "辽宁"
|
|
case "吉林省" | "黑龙江省":
|
|
z = "黑吉"
|
|
case "上海市":
|
|
z = "上海"
|
|
case "江苏省":
|
|
z = "江苏"
|
|
case "浙江省":
|
|
z = "浙江"
|
|
case "安徽省":
|
|
z = "安徽"
|
|
case "福建省":
|
|
z = "福建"
|
|
case "江西省":
|
|
z = "江西"
|
|
case "山东省":
|
|
z = "山东"
|
|
case "河南省":
|
|
z = "河南"
|
|
case "湖北省":
|
|
z = "湖北"
|
|
case "湖南省":
|
|
z = "湖南"
|
|
case "广东省" | "海南省":
|
|
z = "广东"
|
|
case "广西壮族自治区":
|
|
z = "广西"
|
|
case "重庆市" | "四川省" | "西藏自治区":
|
|
z = "四川"
|
|
case "贵州省":
|
|
z = "贵州"
|
|
case "云南省":
|
|
z = "云南"
|
|
case "新疆维吾尔自治区":
|
|
z = "新疆"
|
|
case "陕西省" | "青海省":
|
|
z = "陕西"
|
|
case "甘肃省":
|
|
z = "甘肃"
|
|
case "宁夏回族自治区":
|
|
z = "宁夏"
|
|
case "总部":
|
|
z = "总部"
|
|
case _:
|
|
z = ""
|
|
|
|
return z
|
|
|
|
|
|
# 根据发卡金额映射为奖励
|
|
def mapped_as_card_issuance_reward(x: Decimal) -> int:
|
|
|
|
# noinspection PyUnreachableCode
|
|
match x:
|
|
case x if 50 <= x < 100:
|
|
z = 500
|
|
case x if 100 <= x < 300:
|
|
z = 800
|
|
case x if 300 <= x < 500:
|
|
z = 1000
|
|
case x if 500 <= x < 1000:
|
|
z = 2000
|
|
case x if 1000 <= x < 3000:
|
|
z = 4000
|
|
case x if 3000 <= x < 5000:
|
|
z = 10000
|
|
case x if 5000 <= x < 10000:
|
|
z = 20000
|
|
case x if x >= 10000:
|
|
z = 30000
|
|
case _:
|
|
z = 0
|
|
|
|
return z
|
|
|
|
|
|
# 自主经营发卡奖励
|
|
card_issuance_reward = (
|
|
dataset["25年发卡"]
|
|
.loc[~dataset["25年发卡"]["投保公司"].isin(dataset["24年发卡"]["投保公司"])]
|
|
.merge(
|
|
dataset["保单机构分配"],
|
|
how="left",
|
|
on="保单编号",
|
|
suffixes=("", "_duplication"),
|
|
) # 若有发卡无消费则无保单机构分配方案
|
|
.fillna("0")
|
|
.assign(
|
|
发卡金额=lambda dataframe: dataframe["发卡金额"].apply(
|
|
lambda cell: (Decimal(cell) / 10000).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
)
|
|
) # 发卡金额单位为万元
|
|
)
|
|
.assign(
|
|
奖励金额=lambda dataframe: dataframe["发卡金额"].apply(
|
|
lambda cell: mapped_as_card_issuance_reward(cell)
|
|
)
|
|
) # 先计算奖励金额在根据机构分配比例拆分
|
|
.assign(总部="总部")
|
|
.assign(
|
|
# 整合机构
|
|
机构名称=lambda dataframe: dataframe.apply(
|
|
lambda x: [x["落地机构"], x["出单机构"], x["总部"]], axis="columns"
|
|
),
|
|
# 整合分配比例
|
|
分配比例=lambda dataframe: dataframe.apply(
|
|
lambda x: [
|
|
x["落地机构分配比例"],
|
|
x["出单机构分配比例"],
|
|
x["总部分配比例"],
|
|
],
|
|
axis="columns",
|
|
),
|
|
)
|
|
.explode(["机构名称", "分配比例"])
|
|
.assign(
|
|
分配后奖励金额=lambda dataframe: dataframe.apply(
|
|
lambda row: (
|
|
Decimal(row["奖励金额"]) * Decimal(row["分配比例"]) / 100
|
|
).quantize(Decimal("0.00"), rounding=ROUND_HALF_UP),
|
|
axis="columns",
|
|
),
|
|
)
|
|
.assign(
|
|
机构=lambda dataframe: dataframe["机构名称"].apply(
|
|
lambda cell: mapped_as_institution_name(cell)
|
|
)
|
|
)
|
|
.loc[lambda dataframe: dataframe["机构"] != "总部"] # 过滤总部
|
|
.sort_values(by="分配后奖励金额", ascending=False)
|
|
.reset_index(drop=True)
|
|
)[["保单编号", "投保公司", "保险总公司", "保险分公司", "发卡金额", "奖励金额", "机构", "分配比例", "分配后奖励金额"]]
|
|
|
|
|
|
# 根据转化率提升映射为奖励比例
|
|
def mapped_as_increase_reward_ratio(x: Decimal) -> Decimal:
|
|
|
|
# noinspection PyUnreachableCode
|
|
match x:
|
|
case x if 5 <= x < 10:
|
|
z = Decimal("0.1")
|
|
case x if 10 <= x < 15:
|
|
z = Decimal("0.2")
|
|
case x if 15 <= x < 20:
|
|
z = Decimal("0.3")
|
|
case x if 20 <= x < 30:
|
|
z = Decimal("0.4")
|
|
case x if x >= 30:
|
|
z = Decimal("0.5")
|
|
case _:
|
|
z = Decimal("0")
|
|
|
|
return z
|
|
|
|
|
|
# 重点存量业务消费提升奖励
|
|
increase_reward = (
|
|
dataset["投保公司"]
|
|
.loc[dataset["投保公司"]["项目名称"].isin(dataset["重点项目"]["项目名称"])]
|
|
.merge(
|
|
dataset["24年数据"], how="left", on="投保公司", suffixes=("", "_duplication")
|
|
)
|
|
.merge(
|
|
dataset["25年数据"], how="left", on="投保公司", suffixes=("", "_duplication")
|
|
)
|
|
.fillna("0")
|
|
.assign(
|
|
转化率25年=lambda dataframe: dataframe["25年转化率"].apply(
|
|
lambda row: (Decimal(row) * 100).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
)
|
|
),
|
|
转化率24年=lambda dataframe: dataframe["24年转化率"].apply(
|
|
lambda row: (Decimal(row) * 100).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
)
|
|
),
|
|
)
|
|
.assign(
|
|
转化率提升=lambda dataframe: dataframe.apply(
|
|
lambda row: (row["转化率25年"] - row["转化率24年"]).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
),
|
|
axis="columns",
|
|
)
|
|
)
|
|
.assign(
|
|
奖励比例=lambda dataframe: dataframe["转化率提升"].apply(
|
|
lambda cell: mapped_as_increase_reward_ratio(cell)
|
|
)
|
|
)
|
|
.assign(
|
|
消费金额提升=lambda dataframe: dataframe.apply(
|
|
lambda row: (
|
|
Decimal(row["25年消费金额"]) - Decimal(row["24年消费金额"])
|
|
).quantize(Decimal("0.00"), rounding=ROUND_HALF_UP),
|
|
axis="columns",
|
|
)
|
|
)
|
|
.assign(
|
|
奖励金额=lambda dataframe: dataframe.apply(
|
|
lambda row: (row["消费金额提升"] * row["奖励比例"] / 100).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
),
|
|
axis="columns",
|
|
)
|
|
)
|
|
.sort_values(by="奖励金额", ascending=False)
|
|
.reset_index(drop=True)
|
|
)[
|
|
[
|
|
"项目名称",
|
|
"投保公司",
|
|
"25年发卡金额",
|
|
"25年消费金额",
|
|
"转化率25年",
|
|
"24年发卡金额",
|
|
"24年消费金额",
|
|
"转化率24年",
|
|
"转化率提升",
|
|
"奖励比例",
|
|
"消费金额提升",
|
|
"奖励金额",
|
|
]
|
|
]
|
|
|
|
|
|
# 根据转化率映射为奖励比例
|
|
def mapped_as_new_reward_ratio(x: Decimal) -> Decimal:
|
|
|
|
# noinspection PyUnreachableCode
|
|
match x:
|
|
case x if 30 <= x < 40:
|
|
z = Decimal("0.3")
|
|
case x if 40 <= x < 50:
|
|
z = Decimal("0.4")
|
|
case x if 50 <= x < 60:
|
|
z = Decimal("0.5")
|
|
case x if 60 <= x < 70:
|
|
z = Decimal("0.6")
|
|
case x if 70 <= x < 80:
|
|
z = Decimal("0.7")
|
|
case x if 80 <= x < 90:
|
|
z = Decimal("0.8")
|
|
case x if x >= 90:
|
|
z = Decimal("1.0")
|
|
case _:
|
|
z = Decimal("0")
|
|
|
|
return z
|
|
|
|
|
|
# 新增业务消费奖励
|
|
new_reward = (
|
|
dataset["保单机构分配"]
|
|
.loc[
|
|
(dataset["保单机构分配"]["自力更生"] == "是")
|
|
& ~dataset["保单机构分配"]["投保公司"].isin(dataset["24年发卡"]["投保公司"])
|
|
]
|
|
.merge(
|
|
dataset["25年发卡"],
|
|
how="left",
|
|
on="保单编号",
|
|
suffixes=("", "_duplication"),
|
|
)
|
|
.merge(
|
|
dataset["25年消费"], how="left", on="保单编号", suffixes=("", "_duplication")
|
|
)
|
|
.fillna("0")
|
|
.assign(
|
|
发卡金额=lambda dataframe: dataframe["发卡金额"].apply(
|
|
lambda cell: (Decimal(cell) / 10000).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
)
|
|
), # 发卡金额单位为万元
|
|
消费金额=lambda dataframe: dataframe["消费金额"].apply(
|
|
lambda cell: (Decimal(cell) / 10000).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
)
|
|
), # 消费金额单位为万元
|
|
)
|
|
.assign(
|
|
转化率=lambda dataframe: dataframe.apply(
|
|
lambda row: (
|
|
(row["消费金额"] / row["发卡金额"] * 100).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
)
|
|
if row["发卡金额"] != 0
|
|
else Decimal("0.00")
|
|
),
|
|
axis="columns",
|
|
)
|
|
)
|
|
.assign(
|
|
奖励比例=lambda dataframe: dataframe["转化率"].apply(
|
|
lambda cell: mapped_as_new_reward_ratio(cell)
|
|
)
|
|
)
|
|
.assign(
|
|
奖励金额=lambda dataframe: dataframe.apply(
|
|
lambda row: (row["消费金额"] * row["奖励比例"] / 100 * 10000).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
),
|
|
axis="columns",
|
|
)
|
|
) # 先计算奖励金额在根据机构分配比例拆分
|
|
.assign(总部="总部")
|
|
.assign(
|
|
# 整合机构
|
|
机构名称=lambda dataframe: dataframe.apply(
|
|
lambda x: [x["落地机构"], x["出单机构"], x["总部"]], axis="columns"
|
|
),
|
|
# 整合分配比例
|
|
分配比例=lambda dataframe: dataframe.apply(
|
|
lambda x: [
|
|
x["落地机构分配比例"],
|
|
x["出单机构分配比例"],
|
|
x["总部分配比例"],
|
|
],
|
|
axis="columns",
|
|
),
|
|
)
|
|
.explode(["机构名称", "分配比例"])
|
|
.assign(
|
|
分配后奖励金额=lambda dataframe: dataframe.apply(
|
|
lambda row: (row["奖励金额"] * Decimal(row["分配比例"]) / 100).quantize(
|
|
Decimal("0.00"), rounding=ROUND_HALF_UP
|
|
),
|
|
axis="columns",
|
|
),
|
|
)
|
|
.assign(
|
|
机构=lambda dataframe: dataframe["机构名称"].apply(
|
|
lambda cell: mapped_as_institution_name(cell)
|
|
)
|
|
)
|
|
.loc[
|
|
lambda dataframe: (dataframe["机构"] != "总部") & (dataframe["分配比例"] != "0")
|
|
] # 过滤总部
|
|
.sort_values(by="分配后奖励金额", ascending=False)
|
|
.reset_index(drop=True)
|
|
)[
|
|
[
|
|
"保单编号",
|
|
"投保公司",
|
|
"保险总公司",
|
|
"保险分公司",
|
|
"发卡金额",
|
|
"消费金额",
|
|
"转化率",
|
|
"奖励比例",
|
|
"奖励金额",
|
|
"机构",
|
|
"分配比例",
|
|
"分配后奖励金额",
|
|
]
|
|
]
|
|
|
|
save_as_workbook(
|
|
workbook_name="机构绩效试算.xlsx",
|
|
worksheets=[
|
|
("大区年终薪酬", regional_year_end_bonus),
|
|
("机构年终薪酬", institutional_year_end_bonus),
|
|
("自主经营发卡奖励", card_issuance_reward),
|
|
("重点存量业务消费提升奖励", increase_reward),
|
|
("新增业务消费奖励", new_reward),
|
|
],
|
|
)
|