4 数据分析-案例:亚洲国家人口数据计算
数据截图:
该数据包含了2006年-2015年10年间亚洲地区人口数量数据,共10行50列数据。我们需要使用Numpy完成如下数据任务:
- 计算2015年各个国家人口数据
- 计算朝鲜历史各个时期人口数据
- 计算缅甸2014年的人口数据
- 计算每一个国家历史平均人口数据
- 计算亚洲2015年总人口,及平均人口
- 计算印度、柬埔寨、阿富汗在2011、2012、2013年总人口及平均人口
- 计算任意两个国家之间的人口差数据
- 计算2012年亚洲人口数量排名前10的国家
示例代码:
-
计算2015年各个国家人口数据
思路拿出第一行所有国家的名称和拿出第二行2015年所有国家对应的人口
因为numpy对中文的支持并不是很好,所以在取出国家的时候可以采用python中自带的打开文件的方式(open)
import numpy as np #在这里直接读取首行的时候会出现换行符 \n 所以利用切边给它过滤掉,在通过字符串分割转换成列表 with open('亚洲国家20年人口数据-utf8.csv',encoding='utf-8') as f: columns_index=np.array(f.readline()[:-1].split(',')) columns_index
获取国家的2015年的人口
data = np.genfromtxt('亚洲国家20年人口数据-utf8.csv', delimiter=',', dtype=np.str, skip_header=1) line_index = data[:, 0] line_index
year = '2015' data[line_index == year]
把国家和人口通过zip模块进行一一映射
for k,v in zip(columns_index[1:],data[line_index == year][0][1:]): print('国家:%s 人口:%s' % (k, v))
2 计算朝鲜历史各个时期人口数据
data[:,n] 取出第n列数据
country = '朝鲜' # 计算朝鲜在列索引中的位置 country_index = np.argwhere(columns_index == country)[0][0] # 获得朝鲜各个历史时期的人口数据 for a,b in zip( line_index,data[:, country_index]): print('%s年,%s国家的人口数据为:%s' % (a, country, b))
3. 计算缅甸2014年的人口数据
先取出2014年所有国家人口的数据,在获取缅甸的下标,取出缅甸的人口
year = '2014' country = '缅甸' # 计算2014年所有国家人口数据 all_2014 = data[line_index == year][0] ret = all_2014[ np.argwhere(columns_index == country)[0][0] ] print('%s国家%s年的人口数据为:%s' % (country, year, ret))
把二维数组列变成行,行变成列(行列互换)
np.arange(12).reshape((3, 4))
np.arange(12).reshape((3, 4)).T
4 计算每一个国家历史平均人口数据
思路:把数组反转成每一行都是不同时间段的人口,直接按行取平均值就可以得到每个国家平均的人口
# 列是国家列表 行是年限列表 ret_data = data[:, 1:].T # 处理缺失值 handle_data = np.where(ret_data == '', 0, ret_data) # 将数据类型转换为数字类型 result = handle_data.astype(np.int32).mean(axis=1) for a, b in zip(columns_index[1:], result): print('国家%s 历史平均人口:%s' %(a, b))
5. 计算亚洲2015年总人口,及平均人口
思路分析:
先取出2015年所有国家的人口数据
在把里面空的值设置为0
把字符串类型转换成数字
year = '2015' # 求2015年所有国家人口数据 all_2015_data = data[line_index == year][0][1:] # 处理缺失数据 all_2015_data = np.where(all_2015_data == '', 0, all_2015_data) # 数据类型转换 all_2015_data = all_2015_data.astype(np.int32) total_data = all_2015_data.sum() mean_data = all_2015_data.mean() print('%s年亚洲人口总数据:%s 平均人口数据:%s' %(year, total_data, mean_data))
6. 计算印度、柬埔寨、阿富汗在2011、2012、2013年总人口及平均人口
思路分析:
1 取出11,12,13年所有国家的数据,放入到一个列表中,最后要把列表转换成数组
2 获取指定国家对应的索引
3 根据指定国家的索引取出值
contry = ['印度', '柬埔寨', '阿富汗'] year = ['2011', '2012', '2013'] # 先获得所有国家11、12、13年的人口数据 all_country_data_by_year = [] for y in year: all_country_data_by_year.append(data[line_index == y][0]) # 计算国家所对应的列索引 indexes = [] for c in contry: indexes.append(np.argwhere(columns_index == c)[0][0]) # 计算指定国家的数据 all_country_data_by_year = np.array(all_country_data_by_year) all_country_data_by_year = all_country_data_by_year[:, indexes] # 处理数据中可能存在的缺失值 all_country_data_by_year = np.where(all_country_data_by_year == '', 0, all_country_data_by_year).astype(np.int32) # 计算每一年的人口总和 population_sum = all_country_data_by_year.sum(axis=1) # 计算每一年的人口平均数 population_mean = all_country_data_by_year.mean(axis=1) for y, s, m in zip(year, population_sum, population_mean): print('%s年%s国家的人口总和为:%s, 平均人口为:%s' % (y, ','.join(contry), s, m))
7 计算任意两个国家之间的人口差数据
思路分析:
1 首先根据指定的年份对所有国家的人口数据进行处理(主要是把空值转换成空字符串,在转换成整形)
2 把数组进行反转,直接取值,就是一个数组里面放一个bool值的列表,会显示为真的
country1 = '越南' country2 = '柬埔寨' year = '2015' # 计算2015年人口数据 data_2015 = data[line_index == year] data_2015 = np.where(data_2015 == '', 0, data_2015).astype(np.int32) # 获得两个国家的人口数据 country1_data1 = data_2015.T[columns_index == country1][0][0] country2_data = data_2015.T[columns_index == country2][0][0] print('%s和%s的人口差是:%s !' % (country1, country2, np.abs(country1_data1 - country2_data)))
8. 计算2012年亚洲人口数量排名前10的国家
思路分析:
1 取出2012所有国家的数据
2 对数据进行处理
3 对数据按照索引进行排序,在反转(因为没有降序)取前十
# 计算2012年亚洲人口数据 year = '2012' # 获得2012年数据 data_2012 = data[line_index == year][0][1:] # 处理缺失值 data_2012 = np.where(data_2012 == '', 0, data_2012) # 数据转换为数字类型 data_2012 = data_2012.astype(np.int32) # 对结果排序 sorted_index = np.argsort(data_2012) # 人口数量前10的国家 ret_data = data_2012[sorted_index][::-1][:10] ret_index = columns_index[1:][sorted_index][::-1][:10] # 输出结果 for a,b in zip(ret_index, ret_data): print("国家:%s 人口:%s" % (a, b))
关于对索引进行排序的技巧
两个数组中的值一一对应,对其中的一个数组的索引进行排序取值,另一个数组也用上一个数组排序后的索引取值,关系还是一一对应