import pandas as pd import numpy as np from datetime import datetime, timedelta import random class FakeDataGenerator: """生成用于测试在线率分析工具的模拟数据""" def __init__(self): # 省份列表 self.provinces = [ '北京市', '上海市', '广东省', '江苏省', '浙江省', '山东省', '河南省', '四川省', '湖北省', '福建省' ] # 制造商列表 self.manufacturers = [ '华为', '中兴', '烽火', '诺基亚', '爱立信', '思科', '新华三', '锐捷', '迈普', '东方通信' ] # 基础在线率范围 self.base_rate_range = (0.85, 0.98) def generate_region_data(self, region_name: str, start_time: str, end_time: str) -> pd.DataFrame: """生成指定地区和时间段的在线率数据""" start_date = datetime.strptime(start_time, '%Y-%m-%d') end_date = datetime.strptime(end_time, '%Y-%m-%d') date_range = pd.date_range(start_date, end_date, freq='D') data = [] base_rate = random.uniform(*self.base_rate_range) for date in date_range: # 添加一些随机波动 daily_rate = min(1.0, max(0.0, base_rate + random.uniform(-0.05, 0.05))) data.append({ 'date': date, 'region': region_name, 'online_rate': daily_rate, 'device_count': random.randint(1000, 5000) }) return pd.DataFrame(data) def generate_ranking_data(self, rank_type: int) -> pd.DataFrame: """生成排名数据""" if rank_type == 1: # 省份排名 entities = self.provinces else: # 厂商排名 entities = self.manufacturers data = [] for entity in entities: base_rate = random.uniform(*self.base_rate_range) data.append({ 'name': entity, 'online_rate': base_rate, 'device_count': random.randint(5000, 20000), 'offline_count': random.randint(100, 1000) }) return pd.DataFrame(data).sort_values('online_rate', ascending=False) def generate_national_trend(self, start_time: str, end_time: str) -> pd.DataFrame: """生成全国在线率趋势数据""" start_date = datetime.strptime(start_time, '%Y-%m-%d') end_date = datetime.strptime(end_time, '%Y-%m-%d') date_range = pd.date_range(start_date, end_date, freq='D') data = [] base_rate = random.uniform(*self.base_rate_range) trend = np.linspace(-0.02, 0.02, len(date_range)) # 添加轻微的趋势 for i, date in enumerate(date_range): # 基础在线率 + 趋势 + 随机波动 daily_rate = min(1.0, max(0.0, base_rate + trend[i] + random.uniform(-0.02, 0.02))) data.append({ 'date': date, 'online_rate': daily_rate, 'total_devices': random.randint(50000, 100000), 'online_devices': random.randint(40000, 90000) }) return pd.DataFrame(data) class MockDBConnection: """模拟数据库连接类""" def __init__(self): self.fake_data = FakeDataGenerator() def query(self, sql: str, params: dict = None) -> pd.DataFrame: """模拟SQL查询""" # 根据SQL语句特征返回相应的模拟数据 if 'region' in sql.lower(): return self.fake_data.generate_region_data( params.get('region_name', '北京市'), params.get('start_time', '2024-01-01'), params.get('end_time', '2024-01-07') ) elif 'rank' in sql.lower(): return self.fake_data.generate_ranking_data( params.get('type', 1) ) elif 'national' in sql.lower(): return self.fake_data.generate_national_trend( params.get('start_time', '2024-01-01'), params.get('end_time', '2024-01-07') ) else: return pd.DataFrame() # 默认返回空数据框