123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # -*- 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("Report Summary:")
- print(f"Total Users: {report['total_users']}")
- print(f"Total Actions: {report['total_actions']}")
- print(f"Anomalies: {report['anomalies']}")
- print(f"User Segments: {report['user_segments']}")
- # 展示每个流程的行为次数漏斗图
- for process, actions in self.process_stats.items():
- self.plot_bar(actions, f"{process} Funnel")
- # 展示行为统计图表
- self.plot_stats(self.action_stats, "Action Statistics")
- # 展示产品统计图表
- self.plot_stats(self.product_stats, "Product Statistics")
- # 展示渠道统计图表
- self.plot_stats(self.channel_stats, "Channel Statistics")
- 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('Number of Actions')
- ax.set_ylabel('Behavior')
- ax.set_title(title)
- plt.tight_layout() # 调整布局
- plt.show()
- # 设置matplotlib支持中文
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
- plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
|