4 数据分析-案例:亚洲国家人口数据计算

数据截图:

该数据包含了2006年-2015年10年间亚洲地区人口数量数据,共10行50列数据。我们需要使用Numpy完成如下数据任务:

  1. 计算2015年各个国家人口数据
  2. 计算朝鲜历史各个时期人口数据
  3. 计算缅甸2014年的人口数据
  4. 计算每一个国家历史平均人口数据
  5. 计算亚洲2015年总人口,及平均人口
  6. 计算印度、柬埔寨、阿富汗在2011、2012、2013年总人口及平均人口
  7. 计算任意两个国家之间的人口差数据
  8. 计算2012年亚洲人口数量排名前10的国家

示例代码:

  1. 计算2015年各个国家人口数据

思路拿出第一行所有国家的名称和拿出第二行2015年所有国家对应的人口

因为numpy对中文的支持并不是很好,所以在取出国家的时候可以采用python中自带的打开文件的方式(open)

import numpy as np

#在这里直接读取首行的时候会出现换行符 
 所以利用切边给它过滤掉,在通过字符串分割转换成列表

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))

关于对索引进行排序的技巧

两个数组中的值一一对应,对其中的一个数组的索引进行排序取值,另一个数组也用上一个数组排序后的索引取值,关系还是一一对应

原文地址:https://www.cnblogs.com/crazymagic/p/8973900.html