對中國姓氏數據進行處理,查看姓氏「廣泛指數」和奔波指數html
三張數據表,兩張我的信息表(數據量總和263w+),一張中國行政代碼對照表(數據量3500+)json
os.chdir('G:\數據分析資料*******')
#讀取數據:
df1=pd.read_csv('data01.csv',encoding='utf-8')
df2=pd.read_csv('data02.csv',encoding='utf-8')
df3=pd.read_excel('中國行政代碼對照表.xlsx',sheet_name =0,encoding='utf-8')
複製代碼
#數據錶鏈接,結合「戶籍地城市編號」及「中國城市代碼對照表」數據,將城市經緯度鏈接進數據中
def data_combine(df_data01,df_data02,df_code):
#df_data01,df_data02爲兩張我的信息表,df_code爲城市代碼對照表
df_con=pd.concat([df_data01,df_data02])#合併成一個數據表
df_code['行政編碼']=pd.to_numeric(df_code['行政編碼'],errors='coerce')
df_con['戶籍地城市編號']=pd.to_numeric(df_con['戶籍地城市編號'],errors='coerce')
df_code['行政編碼']=pd.to_numeric(df_code['行政編碼'],errors='coerce')
data_01=pd.merge(df_con,df_code,left_on='戶籍地城市編號',right_on='行政編碼')
print('merge前的數據爲:',len(df_con),'\n,merge後的數據爲:',len(data_01))
del data_01['戶籍地城市編號']
del data_01['行政編碼']
data_01['工做地']=data_01['工做地'].str[:15]
return(data_01)
data_01=data_combine(df1,df2,df3)
複製代碼
這裏值得一提的是數據表merge合併的時候須要統一轉換數據類型和考慮數據有效性。我開始直接合並,報錯,我試着用pd.astype()函數直接都轉換爲字符型,合併後發現260w+的數據少了接近200w數據。而後使用了pandas.to_numeric(arg,errors ='raise',downcast = None )函數轉換數據才使得合併後的數據量正常。c#
def get_provinces(df):#提取省
df['工做地_省']=df['工做地'].str.split('省').str[0]
return(df)
data_01=get_provinces(data_01)
def get_city(df):#提取市
df['工做地_市'] = df['工做地'].str.split('省').str[1].str.split('市').str[0]
df['工做地_市'][df['工做地_省'].str.len() > 5] = df['工做地_省'].str.split('市').str[0]
return(df)
data_02=get_city(data_01)
def get_county(df):#提取區縣
df['工做地_區縣']=''
df['工做地_區縣'][(df['工做地_市'].str.len() < 5)&(df['工做地'].str.contains('區'))] = df['工做地'].str.split('市').str[1].str.split('區').str[0] + '區'
df['工做地_區縣'][(df['工做地_市'].str.len() > 5)&(df['工做地'].str.contains('區'))] = df['工做地'].str.split('區').str[0] + '區'
df['工做地_區縣'][(df['工做地_市'].str.len() < 5)&(df['工做地'].str.contains('縣'))] = df['工做地'].str.split('市').str[1].str.split('縣').str[0] + '縣'
df['工做地_區縣'][(df['工做地_市'].str.len() > 5)&(df['工做地'].str.contains('縣'))] = df['工做地'].str.split('縣').str[0] + '縣'
return(df)
data_03=get_county(data_02)
def get_else(df):#整理未識別工做地
df['工做地_省'][df['工做地_省'].str.len() > 5] = '未識別'
df['工做地_市'][df['工做地_市'].str.len() > 5] = '未識別'
df['工做地_區縣'][(df['工做地_區縣'].str.len() > 5) | (df['工做地_區縣'].str.len() < 2)] = '未識別'
return(df)
data_04=get_else(data_03)
data_04.columns = ['姓', '工做地', '戶籍所在地_省', '戶籍所在地_市','戶籍所在地_區縣', '戶籍所在地_lng', '戶籍所在地_lat', '工做地_省','工做地_市','工做地_區縣' ]
#調整數據列順序
複製代碼
這塊使用bokeh作可視化api
import matplotlib.pyplot as plt
from bokeh.plotting import figure,show,output_file
from bokeh.models import ColumnDataSource,HoverTool
from bokeh.layouts import gridplot
#(1)數將數據按照「姓」作統計,找到數量最多的TOP20
name_count=data_04['姓'].value_counts()[:20]
result_01=pd.DataFrame({
'count':name_count,
'count_per':name_count/name_count.sum()
})
name_list=result_01.index.tolist()
source=ColumnDataSource(result_01)
output_file('name_rank.html')
#姓氏top20計數圖
hover1 = HoverTool(tooltips = [('姓氏計數', "@count")])
result1=figure(plot_width = 800, plot_height = 250, x_range = name_list,
title = '中國姓氏TOP20 - 計數',
tools = [hover1, 'reset, xwheel_zoom, pan'])
result1.vbar(x='index', top='count', source=source,width=0.9, alpha = 0.8,color = 'lightseagreen')
result1.ygrid.grid_line_dash = [6, 4]
result1.xgrid.grid_line_dash = [6, 4]
#姓氏top20佔比圖
hover2=HoverTool(tooltips=[('姓氏佔比',"@count_per")])
result2=figure(plot_width = 800, plot_height = 250, x_range = name_list,
title = '中國姓氏TOP20 - 佔比',
tools = [hover2, 'reset, xwheel_zoom, pan'])
result2.vbar(x='index', top='count_per', source=source,width=0.9, alpha = 0.8,color = 'deeppink')
result2.ygrid.grid_line_dash = [6, 4]
result2.xgrid.grid_line_dash = [6, 4]
p = gridplot([result1], [result2])
show(p)
複製代碼
可視化圖形以下bash
這裏選擇查看老王家的姓氏全國分佈,先獲取老王的數據,並讀取到本地‘.xlsx’文件中echarts
data_wang=data_04[data_04['姓']=='王']
write_file=pd.ExcelWriter('G:\數據分析資料\數據分析師羣資料\【很是重要】項目資料\項目09中國姓氏排行研究(更新地圖shp)\項目09中國姓氏排行研究\wangb1.xlsx')
data_wang.to_excel(write_file,'sheet1',index=False)
write_file.save()
複製代碼
打開文件,這裏使用Excel的powermap製做,函數
打開3D地圖ui
3D人口柱狀圖編碼
打開powermap後,選擇平面地圖——>點的經度、維度——>主題環境spa
製做人口柱狀圖以下: 以姓的數量做爲柱狀圖的高度
生成echarts製圖須要的數據
data_wang2=data_wang.groupby(['戶籍所在地_lng', '戶籍所在地_lat', '戶籍所在地_市'])['姓'].count()
data_wang2 = data_wang2.reset_index()
data_wang2.columns = ['lng', 'lat', 'name', 'value']
writer=pd.ExcelWriter('G:\數據分析資料\數據分析師羣資料\【很是重要】項目資料\項目09中國姓氏排行研究(更新地圖shp)\項目09中國姓氏排行研究\wangb2.xlsx')
data_wang2.to_excel(writer,'sheet1',index=False)
writer.save()
複製代碼
將‘wangb2.xlsx’替換到‘data.xlsx’文件中
import pandas as pd
import os
os.chdir('G:\數據分析資料******\ch0403_空間柱狀圖\data02_3D_Bar_Map') # 輸入文件所在路徑,'
data = pd.read_excel('data.xlsx', sheetname=0,header=0)
datajs = data.to_json(orient='records',force_ascii=False)
print('轉換後數據爲:\n',datajs)
複製代碼
而後將此數據複製echarts的data中
圖形上的點都比較小,並且分佈須要調整
打開座標拾取器,選取中部地區武漢的經緯度,作地圖中心點