zoukankan      html  css  js  c++  java
  • 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))

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

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

  • 相关阅读:
    java基础知识复习
    红黑二叉查找树(原理、实现)
    Django admin
    redis+sentinel 安装与配置
    浅谈saltstack
    python3 通过smtplib模块发送邮件
    django 自定义分页模块
    chouti项目
    Django 进阶篇二
    Django 进阶篇
  • 原文地址:https://www.cnblogs.com/crazymagic/p/8973900.html
Copyright © 2011-2022 走看看