1515
1616def load_data ():
1717 """Load data from the CSV files referundum/regions/departments."""
18- referendum = pd .DataFrame ({})
19- regions = pd .DataFrame ({})
20- departments = pd .DataFrame ({})
18+
19+ referendum = pd .read_csv ('./data/referendum.csv' , sep = ';' )
20+ regions = pd .read_csv ('./data/regions.csv' , sep = ',' )
21+ departments = pd .read_csv ('./data/departments.csv' , sep = ',' )
2122
2223 return referendum , regions , departments
2324
@@ -27,9 +28,15 @@ def merge_regions_and_departments(regions, departments):
2728
2829 The columns in the final DataFrame should be:
2930 ['code_reg', 'name_reg', 'code_dep', 'name_dep']
30- """
31+ """
32+ # target name code reg
33+
34+ merged = departments .merge (regions , left_on = 'region_code' , right_on = 'code' , suffixes = ('_dep' , '_reg' ))
35+ result = merged [['code_reg' , 'name_reg' , 'code_dep' , 'name_dep' ]]
36+ result .columns = ['code_reg' , 'name_reg' , 'code_dep' , 'name_dep' ]
37+
3138
32- return pd . DataFrame ({})
39+ return result
3340
3441
3542def merge_referendum_and_areas (referendum , regions_and_departments ):
@@ -38,8 +45,13 @@ def merge_referendum_and_areas(referendum, regions_and_departments):
3845 You can drop the lines relative to DOM-TOM-COM departments, and the
3946 french living abroad.
4047 """
41-
42- return pd .DataFrame ({})
48+ referendum ['Department code' ] = referendum ['Department code' ].str .zfill (2 )
49+ merged_referendum = referendum .merge (
50+ regions_and_departments ,
51+ left_on = 'Department code' ,
52+ right_on = 'code_dep'
53+ )
54+ return merged_referendum
4355
4456
4557def compute_referendum_result_by_regions (referendum_and_areas ):
@@ -48,8 +60,10 @@ def compute_referendum_result_by_regions(referendum_and_areas):
4860 The return DataFrame should be indexed by `code_reg` and have columns:
4961 ['name_reg', 'Registered', 'Abstentions', 'Null', 'Choice A', 'Choice B']
5062 """
51-
52- return pd .DataFrame ({})
63+ print ('refrenduma nd areas : ' , referendum_and_areas .shape )
64+ grouped = referendum_and_areas .groupby (by = ['code_reg' , 'name_reg' ]).sum (numeric_only = True ).reset_index ()
65+ result = grouped [['code_reg' , 'name_reg' , 'Registered' , 'Abstentions' , 'Null' , 'Choice A' , 'Choice B' ]]
66+ return result .set_index ('code_reg' )
5367
5468
5569def plot_referendum_map (referendum_result_by_regions ):
@@ -61,8 +75,18 @@ def plot_referendum_map(referendum_result_by_regions):
6175 should display the rate of 'Choice A' over all expressed ballots.
6276 * Return a gpd.GeoDataFrame with a column 'ratio' containing the results.
6377 """
78+
79+ geo_data = gpd .read_file ('data/regions.geojson' )
80+
81+ total_votes = referendum_result_by_regions ['Choice A' ]+ referendum_result_by_regions ['Choice B' ]
82+ referendum_result_by_regions ['ratio' ] = referendum_result_by_regions ['Choice A' ]/ total_votes
83+
84+ geo_merged = geo_data .merge (referendum_result_by_regions , left_on = 'code' , right_on = 'code_reg' )
85+
86+ geo_merged .plot (column = 'ratio' , legend = True , cmap = 'coolwarm' )
87+
6488
65- return gpd . GeoDataFrame ({})
89+ return geo_merged
6690
6791
6892if __name__ == "__main__" :
@@ -81,3 +105,4 @@ def plot_referendum_map(referendum_result_by_regions):
81105
82106 plot_referendum_map (referendum_results )
83107 plt .show ()
108+ plt .savefig ('referendum_result' )
0 commit comments