55from OTAnalytics .application .config import DEFAULT_EVENTLIST_FILE_TYPE
66from OTAnalytics .application .datastore import EventListParser
77from OTAnalytics .application .export_formats import event_list
8+ from OTAnalytics .application .export_formats .event_list import (
9+ DATE_TIME_FORMAT ,
10+ DIRECTION_VECTOR_X ,
11+ DIRECTION_VECTOR_Y ,
12+ EVENT_COORDINATE_X ,
13+ EVENT_COORDINATE_Y ,
14+ EVENT_TYPE ,
15+ FRAME_NUMBER ,
16+ HOSTNAME ,
17+ INTERPOLATED_EVENT_COORDINATE_X ,
18+ INTERPOLATED_EVENT_COORDINATE_Y ,
19+ INTERPOLATED_OCCURRENCE ,
20+ OCCURRENCE ,
21+ OCCURRENCE_DATE ,
22+ OCCURRENCE_TIME ,
23+ ROAD_USER_ID ,
24+ ROAD_USER_TYPE ,
25+ SECTION_ID ,
26+ SECTION_NAME ,
27+ VIDEO_NAME ,
28+ )
829from OTAnalytics .application .export_formats .export_mode import INITIAL_MERGE
930from OTAnalytics .application .logger import logger
1031from OTAnalytics .application .use_cases .export_events import (
2445OTC_CSV_FORMAT_NAME = "CSV (OpenTrafficCam)"
2546OTC_OTEVENTS_FORMAT_NAME = "OTEvents (OpenTrafficCam)"
2647
48+ OCCURRENCE_SEC = f"{ OCCURRENCE } _sec"
49+
50+ NUMBER_ROUNDED_COLUMNS = {
51+ event_list .EVENT_COORDINATE_X : 1 ,
52+ event_list .EVENT_COORDINATE_Y : 1 ,
53+ event_list .INTERPOLATED_EVENT_COORDINATE_X : 1 ,
54+ event_list .INTERPOLATED_EVENT_COORDINATE_Y : 1 ,
55+ event_list .DIRECTION_VECTOR_X : 4 ,
56+ event_list .DIRECTION_VECTOR_Y : 4 ,
57+ }
58+
59+ DATETIME_ROUNDED_COLUMNS = {
60+ event_list .OCCURRENCE : "ms" ,
61+ event_list .INTERPOLATED_OCCURRENCE : "ms" ,
62+ }
63+
64+ EXPORT_COLUMNS = [
65+ ROAD_USER_ID ,
66+ ROAD_USER_TYPE ,
67+ HOSTNAME ,
68+ OCCURRENCE ,
69+ FRAME_NUMBER ,
70+ SECTION_ID ,
71+ EVENT_TYPE ,
72+ VIDEO_NAME ,
73+ OCCURRENCE_SEC ,
74+ EVENT_COORDINATE_X ,
75+ EVENT_COORDINATE_Y ,
76+ DIRECTION_VECTOR_X ,
77+ DIRECTION_VECTOR_Y ,
78+ SECTION_NAME ,
79+ OCCURRENCE_DATE ,
80+ OCCURRENCE_TIME ,
81+ INTERPOLATED_OCCURRENCE ,
82+ INTERPOLATED_EVENT_COORDINATE_X ,
83+ INTERPOLATED_EVENT_COORDINATE_Y ,
84+ ]
85+
2786
2887class EventListDataFrameBuilder :
2988 def __init__ (self , events : Iterable [Event ], sections : Iterable [Section ]):
@@ -39,7 +98,20 @@ def build(self) -> pd.DataFrame:
3998 self ._split_columns_with_lists ()
4099 self ._add_section_names ()
41100 self ._add_detailed_date_time_columns ()
42- return self ._df
101+ self ._round ()
102+ return self ._df .loc [:, EXPORT_COLUMNS ]
103+
104+ def _round (self ) -> None :
105+ for column , decimals in NUMBER_ROUNDED_COLUMNS .items ():
106+ if column in self ._df .columns :
107+ self ._df .loc [:, column ] = self ._df .loc [:, column ].round (decimals )
108+ for column , freq in DATETIME_ROUNDED_COLUMNS .items ():
109+ if column in self ._df .columns :
110+ self ._df .loc [:, column ] = (
111+ pd .to_datetime (self ._df .loc [:, column ])
112+ .dt .round (freq )
113+ .dt .strftime (DATE_TIME_FORMAT )
114+ )
43115
44116 def _add_detailed_date_time_columns (self ) -> None :
45117 occurrence_column = pd .to_datetime (self ._df [event_list .OCCURRENCE ])
@@ -69,8 +141,21 @@ def _split_columns_with_lists(self) -> None:
69141 self ._df [event_list .DIRECTION_VECTOR ].tolist (), index = self ._df .index
70142 )
71143 )
144+ self ._df [
145+ [
146+ event_list .INTERPOLATED_EVENT_COORDINATE_X ,
147+ event_list .INTERPOLATED_EVENT_COORDINATE_Y ,
148+ ]
149+ ] = pd .DataFrame (
150+ self ._df [event_list .INTERPOLATED_EVENT_COORDINATE ].tolist (),
151+ index = self ._df .index ,
152+ )
72153 self ._df = self ._df .drop (
73- columns = [event_list .EVENT_COORDINATE , event_list .DIRECTION_VECTOR ]
154+ columns = [
155+ event_list .EVENT_COORDINATE ,
156+ event_list .DIRECTION_VECTOR ,
157+ event_list .INTERPOLATED_EVENT_COORDINATE ,
158+ ]
74159 )
75160
76161 def _add_section_names (self ) -> None :
0 commit comments