处理国家数据

Pandas在处理特征数据时(而不是图像文字这种raw data)时很有用,下面分享一个基于pandas和pygal的各个国家人均GDP可视化的python代码。

1
2
3
4
5
import pandas as pd
from geonamescache import GeonamesCache
from geonamescache.mappers import country
from pygal.maps.world import World
mapper = country(from_key='name', to_key='iso')

mapper是一个将国家名映射到简称的函数,比如'ES'=mapper('Spain')

1
2
3
4
5
6
7
pop = pd.read_csv('pop.csv',index_col=0)
gdp = pd.read_csv('gdp.csv',index_col=0)
pop_2016 = pop[['2016']]
gdp_2016 = gdp[['2016']]
pop_2016 = pop_2016.rename(columns={'2016':'pop_2016'})
gdp_2016 = gdp_2016.rename(columns={'2016':'gdp_2016'})
all_2016 = pd.concat([pop_2016,gdp_2016],axis=1).dropna(axis=0,how='any')
pop.csv

gdp.csv分别是国家人口和人均GDP的数据,我们把这两个表合并成一个表,这和数据库的操作很类似,pandas最好的就是可以处理一下异常数据,空缺数据。

1
2
3
4
5
6
7
8
9
selected = all_2016.query('gdp_2016 > 8000' )
selected_gdp = selected[['gdp_2016']]
country_map = {}
for country in selected_gdp.index:
try:
country_map[country] = mapper(country).lower()
except:
pass
selected_gdp = selected_gdp.rename(index=country_map).to_dict()['gdp_2016']

这一步是把人均GDP大于8000美金的国家挑选出来,最后一步就是可视化了,这里我们用比较简单粗糙的pygal提供的接口,更好的可以选择basemap。

1
2
3
4
worldmap_chart = World()
worldmap_chart.title = 'GDP per capita'
worldmap_chart.add('In 2016', selected_gdp)
worldmap_chart.render_in_browser()

最后的效果图: