11from mapswipe_workers .definitions import logger
22from mapswipe_workers .definitions import DATA_PATH
3+ from mapswipe_workers .generate_stats import project_stats , overall_stats
34
4- from mapswipe_workers .generate_stats import project_stats
5- from mapswipe_workers .generate_stats import overall_stats
65
6+ def generate_stats (project_id_list : list ):
7+ """
8+ Query attributes for all projects from postgres projects table
9+ Write information on status (e.g. active, inactive, finished) and further attributes
10+ for all projects to projects_static.csv.
11+ Computationally more expensive tasks are only performed for projects specified in project_id_list.
12+ Write information on progress and contributors and further attributes
13+ only for projects specified in project_id_list to projects_dynamic.csv.
14+ Write information on project progress history and aggregated results
15+ only for projects specified in project_id_list to csv and geojson files.
16+ Merge projects_static.csv and projects_dynamic.csv into projects.csv.
17+ Convert projects.csv file into GeoJSON format using project geometry and project centroid.
718
8- def generate_stats (project_id_list , all_projects = False ):
19+ Parameters
20+ ----------
21+ project_id_list: list
22+ """
23+ logger .info (f"will generate stats for: { project_id_list } " )
924
10- projects_info_filename = f' { DATA_PATH } /api-data/projects/projects_static.csv'
25+ projects_info_filename = f" { DATA_PATH } /api-data/projects/projects_static.csv"
1126 projects_df = overall_stats .get_project_static_info (projects_info_filename )
27+ project_id_list_postgres = projects_df ["project_id" ].to_list ()
1228
13- projects_info_dynamic_filename = f'{ DATA_PATH } /api-data/projects/projects_dynamic.csv'
14- projects_dynamic_df = overall_stats .load_project_info_dynamic (projects_info_dynamic_filename )
15-
16- if all_projects :
17- project_id_list = projects_df ['project_id' ].to_list ()
18- logger .info (f'will generate stats for all projects.' )
19-
20- logger .info (f'will generate stats for: { project_id_list } ' )
29+ projects_info_dynamic_filename = (
30+ f"{ DATA_PATH } /api-data/projects/projects_dynamic.csv"
31+ )
32+ projects_dynamic_df = overall_stats .load_project_info_dynamic (
33+ projects_info_dynamic_filename
34+ )
2135
2236 # get per project stats and aggregate based on task_id
2337 for project_id in project_id_list :
2438
25- # check if project id is correct
26- if not project_id in projects_df [ 'project_id' ]. to_list () :
27- logger .info (f' project { project_id } does not exist. skip this one.' )
39+ # check if project id is existing
40+ if project_id not in project_id_list_postgres :
41+ logger .info (f" project { project_id } does not exist. skip this one." )
2842 continue
2943
30- logger .info (f'start generate stats for project: { project_id } ' )
31- idx = projects_dynamic_df .index [projects_dynamic_df ['project_id' ] == project_id ].tolist ()
44+ logger .info (f"start generate stats for project: { project_id } " )
45+ idx = projects_dynamic_df .index [
46+ projects_dynamic_df ["project_id" ] == project_id
47+ ].tolist ()
3248 if len (idx ) > 0 :
3349 projects_dynamic_df .drop ([idx [0 ]], inplace = True )
3450
3551 # aggregate results and get per project statistics
3652 project_stats_dict = project_stats .get_per_project_statistics (project_id )
3753 if project_stats_dict :
38- projects_dynamic_df = projects_dynamic_df .append (project_stats_dict , ignore_index = True )
39- projects_dynamic_df .to_csv (projects_info_dynamic_filename , index_label = 'idx' )
54+ projects_dynamic_df = projects_dynamic_df .append (
55+ project_stats_dict , ignore_index = True
56+ )
57+ projects_dynamic_df .to_csv (
58+ projects_info_dynamic_filename , index_label = "idx"
59+ )
4060
4161 # TODO: for build area projects generate tasking manager geometries
4262
4363 # merge static info and dynamic info and save
4464 if len (project_id_list ) > 0 :
45- projects_filename = f'{ DATA_PATH } /api-data/projects/projects.csv'
46- overall_stats .save_projects (projects_filename , projects_df , projects_dynamic_df )
65+ projects_filename = f"{ DATA_PATH } /api-data/projects/projects.csv"
66+ overall_stats .save_projects (projects_filename , projects_df , projects_dynamic_df )
67+
68+
69+ def generate_stats_all_projects ():
70+ """
71+ queries all existing project ids from postgres projects table
72+ saves them into a csv file and returns a list of all project ids
73+ then generates project statistics using the derived list of project ids
74+ """
75+
76+ logger .info (f"will generate stats for all projects." )
77+
78+ # get all project ids from postgres database
79+ projects_info_filename = f"{ DATA_PATH } /api-data/projects/projects_static.csv"
80+ projects_df = overall_stats .get_project_static_info (projects_info_filename )
81+ project_id_list = projects_df ["project_id" ].to_list ()
82+
83+ # generate stats for the derived project ids
84+ generate_stats (project_id_list )
0 commit comments