Bowen Chiu / Jan 04 2021 / Published
2021-002 🇹🇼臺灣竟沒在人類發展指數 (HDI) !我們來找🐷莉亞
人類發展指數 Human Development Index (HDI) 是聯合國綜合評估:健康壽命、知識教育、生活水準,用來評估一個國家發展水準,因為這個指數比GDP只看經濟情況更吻合人民生活舒適度,我們也很想知道臺灣在世界舞臺上,發展處於哪個位置。
搜尋一下就發現這個聯合國資料網址,裡面有相對完整的各國HDI比較,赫然發現Taiwan臺灣不在裡面,是怎樣,我們親切可愛的臺灣不住人類嗎?好吧!與其憤世忌俗起來,不如我們就親自動手把臺灣加入這個人類發展指數的數據空間。
🧮主計處 怎麼說?
關鍵字找一下「臺灣 HDI」可以很開心的發現,臺灣其實在人類發展領域,可以算資優生之一,讓我們放心的繼續來彰顯可愛臺灣人的幸福威力吧:
因為我們希望製作一次數據動圖之後,每年都會全自動更新,所以需要勤勞的找到這個原始資料網址:
apt-get install python3
pip3 install pandas
pip3 install xlrd
17.4s
Bash in Julia
using Pkg;Pkg.add(["PyCall","DataFrames","CSV"]);
using PyCall,DataFrames,CSV
20.6s
Julia
function read_excel(str_in,str_out)
pd=PyCall.pyimport("pandas")
df_pandas=pd.read_excel(str_in)
df_julia=DataFrame()
for str_column in df_pandas.columns
ary=df_pandas[str_column].values
if typeof(ary)==Array{PyObject,1}
df_julia[Symbol(str_column)]=pystr.(ary)
else
df_julia[Symbol(str_column)]=ary
end
end
CSV.write(str_out,df_julia)
end
str_in=人類發展指數.xls
str_out="/results/臺灣人類發展指數hdi.csv"
read_excel(str_in,str_out)
2.8s
Julia
🐷莉亞 Julia 資料前處理為_年_國家_HDI數值
to_flo=x->try parse(Float64,x) catch e 0 end
function 🐷莉亞julia資料前處理臺灣hdi轉為_年_hdi數值(str_in,str_out)
df=CSV.read(str_in)
names!(df,[Symbol("x$i") for i in 1:size(df,2)])
df=df[[:x1,:x3,:x5,:x7,:x9]]
ary_result=[]
for row in eachrow(df)
if (int_年=to_flo(row.x1)) <=0 continue end
flo_hdi=0
[flo_hdi=to_flo(x) for x in [row.x3,row.x5,row.x7,row.x9] if to_flo(x)>0]
push!(ary_result,(int_年,flo_hdi))
end
df=DataFrame(ary_result[9:end])
names!(df,[:Years,:Taiwan])
nan_to_zero(ary)=map(x->isnan(x) ? zero(x) : x,ary)
df[:Years]=nan_to_zero(df[:,:Years]) #years如果有Nan全部換為0
df[:Years]=convert.(Int64,df[:,:Years]) #Float to Int
CSV.write(str_out,df)
end
str_in=臺灣人類發展指數hdi.csv
str_out="/results/🐷莉亞julia資料前處理臺灣hdi轉為_年_hdi數值.csv"
🐷莉亞julia資料前處理臺灣hdi轉為_年_hdi數值(str_in,str_out)
4.1s
Julia
🇺🇳聯合國 資料前處理為_年_國家_HDI數值
不要以為聯合國的CSV資料很乾淨結構化,其實用 Python 以及用 Julia 都會出現讀取錯誤,沒那麼簡單處理啊,哈哈哈,硬是要給我們數據分析師表演舞臺這樣。
Python 解析聯合國CSV會有錯誤訊息:Error tokenizing data. 而Julia 解析聯合國CSV照樣有錯誤訊息:Julia process crashed unexpectedly. 所以我們能做的就只有一行一行讀取出來,自己手動程式碼慢慢拆解該CSV了。
#使用 Python Pandas 解析聯合國HDI CSV會出現錯誤訊息,代表格式有異常 (Julia也異常)
import pandas as pd
try:
df=pd.read_csv(Human Development Index (HDI).csv)
except Exception as e:
print(e)
2.0s
Python
人生就是這樣,碰到髒資料OOXX,最終我們還是得平心靜氣「來喔🐷,動手弄乾淨」。
using CSV,DataFrames
function 讀取每一列CSV用逗點隔開_清除年份是空字串(str_in,str_out)
ary_csv每一列資料=readlines(open(str_in))
ary_result=[]
for str_一列資料 in ary_csv每一列資料
str_一列資料=replace(str_一列資料,[' ','\"']=>"")
ary_用逗點隔開一列=split(str_一列資料,",")
if length(ary_用逗點隔開一列)==62
push!(ary_result,ary_用逗點隔開一列)
end
end
df_欄位數量一致但仍然包含許多空字串尚未清除=DataFrame(ary_result)
df_清資料空字串年份=DataFrame()
for row in eachrow(df_欄位數量一致但仍然包含許多空字串尚未清除)
if length(row.x1)>=4
push!(df_清資料空字串年份,row)
end
end
CSV.write(str_out, df_清資料空字串年份)
end
str_in=Human Development Index (HDI).csv
str_out="/results/讀取每一列CSV用逗點隔開_清除年份是空字串.csv"
讀取每一列CSV用逗點隔開_清除年份是空字串(str_in,str_out)
1.0s
Julia
挑選幾個國家來比較HDI多年變化吧
function 只挑選數據動圖要展示的國家hdi(str_in,str_out,ary_國家列表)
df=CSV.read(str_in)
df=df[2:end,:] #去除HDI排行榜
names!(df,Symbol.(convert(Array,df[1,:]))) #欄位名稱改為國家名稱
df=df[10:end,:] #刪除1997之前的rows
df=df[Symbol.(ary_國家列表)] #只選擇少數國家展示
names!(df,Symbol.(vcat(["Years"],names(df)[2:end]))) #把第一個欄位名稱改Years
CSV.write(str_out,df)
end
str_in=讀取每一列CSV用逗點隔開_清除年份是空字串.csv
str_out="/results/只挑選數據動圖要展示的國家hdi.csv"
ary_國家列表=["Country","Norway","Singapore","UnitedStates","Spain","France","Italy","Japan","China"]
只挑選數據動圖要展示的國家hdi(str_in,str_out,ary_國家列表)
0.4s
Julia
是不是清資料乾淨到一個很爽的境界!
最後把臺灣合併到聯合國HDI,耶!大功告成~
function 合併聯合國與臺灣hdi(str_in1,str_in2,str_out)
df1=CSV.read(str_in1)
df2=CSV.read(str_in2)
df=leftjoin(df1,df2,on=:Years)
CSV.write(str_out,df)
end
str_in1=只挑選數據動圖要展示的國家hdi.csv
str_in2=🐷莉亞julia資料前處理臺灣hdi轉為_年_hdi數值.csv
str_out="/results/合併聯合國與臺灣hdi.csv"
合併聯合國與臺灣hdi(str_in1,str_in2,str_out)
0.2s
Julia
哈哈哈,接下去我們就可以在下一篇分享當中,將這個「合併臺灣與聯合國HDI」的試算表,轉化為「美學驚嘆」的網頁數據動圖嘍。