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