Bowen Chiu / Jan 04 2021 / Published
2021-002 🇹🇼臺灣竟沒在人類發展指數 (HDI) !我們來找🐷莉亞
人類發展指數 Human Development Index (HDI) 是聯合國綜合評估:健康壽命、知識教育、生活水準,用來評估一個國家發展水準,因為這個指數比GDP只看經濟情況更吻合人民生活舒適度,我們也很想知道臺灣在世界舞臺上,發展處於哪個位置。
搜尋一下就發現這個聯合國資料網址,裡面有相對完整的各國HDI比較,赫然發現Taiwan臺灣不在裡面,是怎樣,我們親切可愛的臺灣不住人類嗎?好吧!與其憤世忌俗起來,不如我們就親自動手把臺灣加入這個人類發展指數的數據空間。
🧮主計處 怎麼說?
關鍵字找一下「臺灣 HDI」可以很開心的發現,臺灣其實在人類發展領域,可以算資優生之一,讓我們放心的繼續來彰顯可愛臺灣人的幸福威力吧:
因為我們希望製作一次數據動圖之後,每年都會全自動更新,所以需要勤勞的找到這個原始資料網址:
apt-get install python3pip3 install pandaspip3 install xlrd17.4s
Bash in Julia
using Pkg;Pkg.add(["PyCall","DataFrames","CSV"]);using PyCall,DataFrames,CSV20.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)endstr_in=人類發展指數.xlsstr_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 endfunction 🐷莉亞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)endstr_in=臺灣人類發展指數hdi.csvstr_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 pdtry: df=pd.read_csv(Human Development Index (HDI).csv)except Exception as e: print(e)2.0s
Python
人生就是這樣,碰到髒資料OOXX,最終我們還是得平心靜氣「來喔🐷,動手弄乾淨」。
using CSV,DataFramesfunction 讀取每一列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_清資料空字串年份)endstr_in=Human Development Index (HDI).csvstr_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用逗點隔開_清除年份是空字串.csvstr_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.csvstr_in2=🐷莉亞julia資料前處理臺灣hdi轉為_年_hdi數值.csvstr_out="/results/合併聯合國與臺灣hdi.csv"合併聯合國與臺灣hdi(str_in1,str_in2,str_out)0.2s
Julia
哈哈哈,接下去我們就可以在下一篇分享當中,將這個「合併臺灣與聯合國HDI」的試算表,轉化為「美學驚嘆」的網頁數據動圖嘍。


