GenerateReport.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: zsc
  4. @time: 2024/11/18
  5. @desc: 报告生成
  6. """
  7. import time
  8. import random
  9. from collections import defaultdict
  10. import matplotlib.pyplot as plt
  11. import numpy as np
  12. # 报告生成模块
  13. class ReportGenerator:
  14. def __init__(self, data, anomalies, segments, process_stats, action_stats, product_stats, channel_stats):
  15. self.data = data
  16. self.anomalies = anomalies
  17. self.segments = segments
  18. self.process_stats = process_stats
  19. self.action_stats = action_stats
  20. self.product_stats = product_stats
  21. self.channel_stats = channel_stats
  22. def generate(self):
  23. # 生成用户行为报告,并展示成图表形式
  24. report = {
  25. 'total_users': len(set([user_actions['user'] for user_actions in self.data])),
  26. 'total_actions': sum(len(user_actions['actions']) for user_actions in self.data),
  27. 'anomalies': self.anomalies,
  28. 'user_segments': self.segments,
  29. 'process_stats': self.process_stats,
  30. 'action_stats': self.action_stats,
  31. 'product_stats': self.product_stats,
  32. 'channel_stats': self.channel_stats
  33. }
  34. # 打印报告摘要
  35. print("报告摘要:")
  36. print(f"总客户数: {report['total_users']}")
  37. print(f"总行为次数: {report['total_actions']}")
  38. print(f"异常客户: {report['anomalies']}")
  39. print(f"客户分群-高活跃用户: {report['user_segments']['高活跃用户']},")
  40. print(f"客户分群-低活跃用户: {report['user_segments']['低活跃用户']},")
  41. # 展示每个流程的行为次数漏斗图
  42. for process, actions in self.process_stats.items():
  43. self.plot_bar(actions, f"{process} 漏斗图")
  44. # 展示行为统计图表
  45. self.plot_stats(self.action_stats, "行为次数统计")
  46. # 展示产品统计图表
  47. self.plot_stats(self.product_stats, "分产品统计")
  48. # 展示渠道统计图表
  49. self.plot_stats(self.channel_stats, "分渠道统计")
  50. return report
  51. def plot_stats(self, stats, title):
  52. # 生成并展示统计图表
  53. labels, values = zip(*stats.items())
  54. plt.figure(figsize=(12, 6)) # 增加图表宽度
  55. plt.bar(labels, values)
  56. plt.title(title)
  57. plt.xticks(rotation=45, ha='right', fontsize=10) # 旋转标签,右对齐,减小字体大小
  58. plt.tight_layout() # 调整布局以避免标签被截断
  59. plt.show()
  60. def plot_bar(self, actions, title):
  61. # 生成并展示逆序的水平柱状图
  62. labels = list(actions.keys())
  63. values = list(actions.values())
  64. # 根据值对标签和值进行排序(从小到大,以实现逆序显示)
  65. sorted_indices = np.argsort(values)
  66. labels = np.array(labels)[sorted_indices].tolist()
  67. values = np.array(values)[sorted_indices].tolist()
  68. # 水平柱状图的矩形位置
  69. positions = np.arange(len(labels))
  70. fig, ax = plt.subplots(figsize=(10, 6))
  71. ax.barh(positions, values, color='teal')
  72. # 在矩形旁边添加具体数值
  73. for i, value in enumerate(values):
  74. ax.text(value, positions[i], str(value),
  75. ha='right', va='center', color='black', fontsize=10)
  76. # 设置横坐标和纵坐标
  77. ax.set_yticks(positions)
  78. ax.set_yticklabels(labels)
  79. ax.set_xlabel('行为次数')
  80. ax.set_ylabel('')
  81. ax.set_title(title)
  82. plt.tight_layout() # 调整布局
  83. plt.show()
  84. # 设置matplotlib支持中文
  85. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  86. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号