test.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import pandas as pd
  2. from config import ROAD_FUNCTION_LEVEL_MAP
  3. class SpeedingViolation(TrafficViolation):
  4. """超速违规类"""
  5. def __init__(self, df_data: pd.DataFrame):
  6. super().__init__() # 调用父类构造函数
  7. self.traffic_violations_type = "超速违规类"
  8. self.data = df_data
  9. # 初始化违规统计
  10. self.violation_counts = {
  11. 'over_speed_50': 0,
  12. 'over_speed_20_50': 0,
  13. 'over_speed_20': 0,
  14. 'under_speed_set': 0
  15. }
  16. # 处理数据
  17. self.process_violations()
  18. def process_violations(self):
  19. """处理数据帧,检查是否存在超速违规"""
  20. # 定义速度限制
  21. self.data['speed_limit_max'] = self.data['road_speed_max']
  22. self.data['speed_limit_min'] = self.data['road_speed_min']
  23. # 提取有效道路类型(高速和城市快速路)
  24. valid_road_types = [ROAD_FUNCTION_LEVEL_MAP[1], ROAD_FUNCTION_LEVEL_MAP[2]]
  25. # 违规判定
  26. conditions = [
  27. (self.data['road_type'].isin(valid_road_types)) &
  28. (self.data['v'] > self.data['speed_limit_max'] * 1.5), # 超速50%
  29. (self.data['road_type'].isin(valid_road_types)) &
  30. (self.data['v'] > self.data['speed_limit_max'] * 1.2) &
  31. (self.data['v'] <= self.data['speed_limit_max'] * 1.5), # 超速20%-50%
  32. (self.data['road_type'].isin(valid_road_types)) &
  33. (self.data['v'] > self.data['speed_limit_max']) &
  34. (self.data['v'] <= self.data['speed_limit_max'] * 1.2), # 超速20%
  35. (self.data['road_type'].isin(valid_road_types)) &
  36. (self.data['v'] < self.data['speed_limit_min']) # 低于最低时速
  37. ]
  38. violation_types = ['heavy_speeding', 'moderate_speeding', 'minor_speeding', 'below_minimum_speed']
  39. # 设置违规类型
  40. for condition, violation_type in zip(conditions, violation_types):
  41. self.data.loc[condition, 'violation_type'] = violation_type
  42. # 统计违规情况
  43. self.violation_counts['over_speed_50'] = self.data['violation_type'].value_counts().get('heavy_speeding', 0)
  44. self.violation_counts['over_speed_20_50'] = self.data['violation_type'].value_counts().get('moderate_speeding', 0)
  45. self.violation_counts['over_speed_20'] = self.data['violation_type'].value_counts().get('minor_speeding', 0)
  46. self.violation_counts['under_speed_set'] = (self.data['v'] < self.data['speed_limit_min']).sum()
  47. def get_violation_info(self) -> str:
  48. return (
  49. f"{super().get_violation_info()} - 超速统计: "
  50. f"超过50%: {self.violation_counts['over_speed_50']}, "
  51. f"超过20%-50%: {self.violation_counts['over_speed_20_50']}, "
  52. f"超过20%以内: {self.violation_counts['over_speed_20']}, "
  53. f"低于最低时速: {self.violation_counts['under_speed_set']}"
  54. )