4 數據分析-案例:亞洲國家人口數據計算

數據截圖:

該數據包含了2006年-2015年10年間亞洲地區人口數量數據,共10行50列數據。咱們須要使用Numpy完成以下數據任務:python

  1. 計算2015年各個國家人口數據
  2. 計算朝鮮歷史各個時期人口數據
  3. 計算緬甸2014年的人口數據
  4. 計算每個國家歷史平均人口數據
  5. 計算亞洲2015年總人口,及平均人口
  6. 計算印度、柬埔寨、阿富汗在20十一、20十二、2013年總人口及平均人口
  7. 計算任意兩個國家之間的人口差數據
  8. 計算2012年亞洲人口數量排名前10的國家

示例代碼:

  1. 計算2015年各個國家人口數據

思路拿出第一行全部國家的名稱和拿出第二行2015年全部國家對應的人口數組

由於numpy對中文的支持並非很好,因此在取出國家的時候能夠採用python中自帶的打開文件的方式(open)app

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年的人口spa

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列數據3d

 

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年全部國家人口的數據,在獲取緬甸的下標,取出緬甸的人口code

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 計算每個國家歷史平均人口數據

思路:把數組反轉成每一行都是不一樣時間段的人口,直接按行取平均值就能夠獲得每一個國家平均的人口blog

# 列是國家列表 行是年限列表
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年全部國家的人口數據索引

  在把裏面空的值設置爲0ip

  把字符串類型轉換成數字

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. 計算印度、柬埔寨、阿富汗在20十一、20十二、2013年總人口及平均人口

思路分析:

  1 取出11,12,13年全部國家的數據,放入到一個列表中,最後要把列表轉換成數組

  2 獲取指定國家對應的索引

  3 根據指定國家的索引取出值

contry = ['印度', '柬埔寨', '阿富汗']

year = ['2011', '2012', '2013']
# 先得到全部國家十一、十二、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))

 

 

關於對索引進行排序的技巧

兩個數組中的值一一對應,對其中的一個數組的索引進行排序取值,另外一個數組也用上一個數組排序後的索引取值,關係仍是一一對應

相關文章
相關標籤/搜索