GenerateReport.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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("Report Summary:")
  36. print(f"Total Users: {report['total_users']}")
  37. print(f"Total Actions: {report['total_actions']}")
  38. print(f"Anomalies: {report['anomalies']}")
  39. print(f"User Segments: {report['user_segments']}")
  40. # 展示每个流程的行为次数漏斗图
  41. for process, actions in self.process_stats.items():
  42. self.plot_bar(actions, f"{process} Funnel")
  43. # 展示行为统计图表
  44. self.plot_stats(self.action_stats, "Action Statistics")
  45. # 展示产品统计图表
  46. self.plot_stats(self.product_stats, "Product Statistics")
  47. # 展示渠道统计图表
  48. self.plot_stats(self.channel_stats, "Channel Statistics")
  49. return report
  50. def plot_stats(self, stats, title):
  51. # 生成并展示统计图表
  52. labels, values = zip(*stats.items())
  53. plt.figure(figsize=(12, 6)) # 增加图表宽度
  54. plt.bar(labels, values)
  55. plt.title(title)
  56. plt.xticks(rotation=45, ha='right', fontsize=10) # 旋转标签,右对齐,减小字体大小
  57. plt.tight_layout() # 调整布局以避免标签被截断
  58. plt.show()
  59. def plot_bar(self, actions, title):
  60. # 生成并展示逆序的水平柱状图
  61. labels = list(actions.keys())
  62. values = list(actions.values())
  63. # 根据值对标签和值进行排序(从小到大,以实现逆序显示)
  64. sorted_indices = np.argsort(values)
  65. labels = np.array(labels)[sorted_indices].tolist()
  66. values = np.array(values)[sorted_indices].tolist()
  67. # 水平柱状图的矩形位置
  68. positions = np.arange(len(labels))
  69. fig, ax = plt.subplots(figsize=(10, 6))
  70. ax.barh(positions, values, color='teal')
  71. # 在矩形旁边添加具体数值
  72. for i, value in enumerate(values):
  73. ax.text(value, positions[i], str(value),
  74. ha='right', va='center', color='black', fontsize=10)
  75. # 设置横坐标和纵坐标
  76. ax.set_yticks(positions)
  77. ax.set_yticklabels(labels)
  78. ax.set_xlabel('Number of Actions')
  79. ax.set_ylabel('Behavior')
  80. ax.set_title(title)
  81. plt.tight_layout() # 调整布局
  82. plt.show()
  83. # 设置matplotlib支持中文
  84. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  85. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号