# -*- coding: utf-8 -*- """ @author: zsc @time: 2024/11/18 @desc: 报告生成 """ import time import random from collections import defaultdict import matplotlib.pyplot as plt import numpy as np # 报告生成模块 class ReportGenerator: def __init__(self, data, anomalies, segments, process_stats, action_stats, product_stats, channel_stats): self.data = data self.anomalies = anomalies self.segments = segments self.process_stats = process_stats self.action_stats = action_stats self.product_stats = product_stats self.channel_stats = channel_stats def generate(self): # 生成用户行为报告,并展示成图表形式 report = { 'total_users': len(set([user_actions['user'] for user_actions in self.data])), 'total_actions': sum(len(user_actions['actions']) for user_actions in self.data), 'anomalies': self.anomalies, 'user_segments': self.segments, 'process_stats': self.process_stats, 'action_stats': self.action_stats, 'product_stats': self.product_stats, 'channel_stats': self.channel_stats } # 打印报告摘要 print("报告摘要:") print(f"总客户数: {report['total_users']}") print(f"总行为次数: {report['total_actions']}") print(f"异常客户: {report['anomalies']}") print(f"客户分群-高活跃用户: {report['user_segments']['高活跃用户']},") print(f"客户分群-低活跃用户: {report['user_segments']['低活跃用户']},") # 展示每个流程的行为次数漏斗图 for process, actions in self.process_stats.items(): self.plot_bar(actions, f"{process} 漏斗图") # 展示行为统计图表 self.plot_stats(self.action_stats, "行为次数统计") # 展示产品统计图表 self.plot_stats(self.product_stats, "分产品统计") # 展示渠道统计图表 self.plot_stats(self.channel_stats, "分渠道统计") return report def plot_stats(self, stats, title): # 生成并展示统计图表 labels, values = zip(*stats.items()) plt.figure(figsize=(12, 6)) # 增加图表宽度 plt.bar(labels, values) plt.title(title) plt.xticks(rotation=45, ha='right', fontsize=10) # 旋转标签,右对齐,减小字体大小 plt.tight_layout() # 调整布局以避免标签被截断 plt.show() def plot_bar(self, actions, title): # 生成并展示逆序的水平柱状图 labels = list(actions.keys()) values = list(actions.values()) # 根据值对标签和值进行排序(从小到大,以实现逆序显示) sorted_indices = np.argsort(values) labels = np.array(labels)[sorted_indices].tolist() values = np.array(values)[sorted_indices].tolist() # 水平柱状图的矩形位置 positions = np.arange(len(labels)) fig, ax = plt.subplots(figsize=(10, 6)) ax.barh(positions, values, color='teal') # 在矩形旁边添加具体数值 for i, value in enumerate(values): ax.text(value, positions[i], str(value), ha='right', va='center', color='black', fontsize=10) # 设置横坐标和纵坐标 ax.set_yticks(positions) ax.set_yticklabels(labels) ax.set_xlabel('行为次数') ax.set_ylabel('') ax.set_title(title) plt.tight_layout() # 调整布局 plt.show() # 设置matplotlib支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号