251029更新
This commit is contained in:
parent
376d8448a7
commit
73511f73cc
57
rfm/main.py
57
rfm/main.py
|
|
@ -1,6 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
"""
|
||||
基于RFM模型生成数据分析报告
|
||||
|
|
@ -8,61 +7,42 @@ if __name__ == "__main__":
|
|||
|
||||
# 导入模块
|
||||
|
||||
import pandas
|
||||
|
||||
import statistics
|
||||
from datetime import datetime
|
||||
|
||||
from decimal import Decimal, ROUND_HALF_UP
|
||||
|
||||
import statistics
|
||||
|
||||
import pandas
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
from utils.client import MySQLClient
|
||||
|
||||
from utils.pandas_extension import DrawAsHTML
|
||||
|
||||
|
||||
# 函数说明:根据RFM编码映射为客户分类
|
||||
def map_classification(r_encoded, f_encoded, m_encoded):
|
||||
|
||||
# 就R、F、M指标构建独热编码并匹配客户分类
|
||||
match f"{r_encoded}{f_encoded}{m_encoded}":
|
||||
|
||||
case "000":
|
||||
|
||||
classification = "流失客户"
|
||||
|
||||
case "010":
|
||||
|
||||
classification = "一般维持客户"
|
||||
|
||||
case "100":
|
||||
|
||||
classification = "新客户"
|
||||
|
||||
case "110":
|
||||
|
||||
classification = "潜力客户"
|
||||
|
||||
case "001":
|
||||
|
||||
classification = "重要挽留客户"
|
||||
|
||||
case "101":
|
||||
|
||||
classification = "重要深耕客户"
|
||||
|
||||
case "011":
|
||||
|
||||
classification = "重要唤回客户"
|
||||
|
||||
case "111":
|
||||
|
||||
classification = "重要价值客户"
|
||||
|
||||
# noinspection PyUnboundLocalVariable
|
||||
return classification
|
||||
|
||||
|
||||
print("1 加载数据集...", end="")
|
||||
|
||||
client = MySQLClient(database="data_analysis")
|
||||
|
|
@ -109,9 +89,7 @@ if __name__ == "__main__":
|
|||
),
|
||||
F=(
|
||||
"客户ID",
|
||||
lambda x: Decimal(len(x)).quantize(
|
||||
Decimal("0"), rounding=ROUND_HALF_UP
|
||||
),
|
||||
lambda x: Decimal(len(x)).quantize(Decimal("0"), rounding=ROUND_HALF_UP),
|
||||
),
|
||||
M=(
|
||||
"交易金额",
|
||||
|
|
@ -136,15 +114,9 @@ if __name__ == "__main__":
|
|||
# R、F和M的平均数,使用STATISTICS.MEAN统计平均值,保证精度
|
||||
# noinspection PyUnresolvedReferences
|
||||
means = {
|
||||
"R": statistics.mean(rfm["R"]).quantize(
|
||||
Decimal("0.00"), rounding=ROUND_HALF_UP
|
||||
),
|
||||
"F": statistics.mean(rfm["F"]).quantize(
|
||||
Decimal("0.00"), rounding=ROUND_HALF_UP
|
||||
),
|
||||
"M": statistics.mean(rfm["M"]).quantize(
|
||||
Decimal("0.00"), rounding=ROUND_HALF_UP
|
||||
),
|
||||
"R": statistics.mean(rfm["R"]).quantize(Decimal("0.00"), rounding=ROUND_HALF_UP),
|
||||
"F": statistics.mean(rfm["F"]).quantize(Decimal("0.00"), rounding=ROUND_HALF_UP),
|
||||
"M": statistics.mean(rfm["M"]).quantize(Decimal("0.00"), rounding=ROUND_HALF_UP),
|
||||
}
|
||||
|
||||
rfm = rfm.assign(
|
||||
|
|
@ -158,9 +130,7 @@ if __name__ == "__main__":
|
|||
)
|
||||
)
|
||||
|
||||
dataframe = dataframe.merge(
|
||||
right=rfm[["客户ID", "客户分类"]], on="客户ID", how="left"
|
||||
)
|
||||
dataframe = dataframe.merge(right=rfm[["客户ID", "客户分类"]], on="客户ID", how="left")
|
||||
|
||||
print("已完成")
|
||||
|
||||
|
|
@ -236,9 +206,7 @@ if __name__ == "__main__":
|
|||
file_name="交易金额占比.html",
|
||||
)
|
||||
|
||||
report_backward = pandas.DataFrame(
|
||||
data=[], columns=["客户分类", "窗口期", "客户数"]
|
||||
)
|
||||
report_backward = pandas.DataFrame(data=[], columns=["客户分类", "窗口期", "客户数"])
|
||||
|
||||
for customer_type in customer_types["客户分类"]:
|
||||
|
||||
|
|
@ -253,9 +221,7 @@ if __name__ == "__main__":
|
|||
).start_time.date()
|
||||
|
||||
# 窗口期止期
|
||||
period_end = pandas.Period(
|
||||
value=f"2013-{month:02d}", freq="M"
|
||||
).end_time.date()
|
||||
period_end = pandas.Period(value=f"2013-{month:02d}", freq="M").end_time.date()
|
||||
|
||||
# 指定客户分类窗口期内客户数
|
||||
customer_counts = dataframe.loc[
|
||||
|
|
@ -392,7 +358,6 @@ if __name__ == "__main__":
|
|||
)
|
||||
|
||||
with open("rfm_report.html", "w", encoding="utf8") as file:
|
||||
|
||||
file.write(rfm_report)
|
||||
|
||||
print("已完成")
|
||||
|
|
|
|||
Loading…
Reference in New Issue