123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- """
- @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()
- plt.rcParams['font.sans-serif'] = ['SimHei']
- plt.rcParams['axes.unicode_minus'] = False
|