姓氏排行研究


 

1、數據清洗、整合
要求:
① 將“data01”、“data02”分別讀取,並且合並成一個數據
② 結合“戶籍地城市編號”及“中國城市代碼對照表”數據,將城市經緯度連接進數據中
③ 分別提取“工作地”中的省、市
提示:
① 可以先讀取“data01”、“data02”,然后用pd.concat()來連接數據
② 新建字段“工作地-省”,“工作地-市”,“工作地-區縣”,如果數據中“工作地”字段無法提取省和市,則用“未識別”填充單元格
   * 通過查看識別后的單元格,如果字數超過5則為“未識別”

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource
import warnings
warnings.filterwarnings('ignore')

'''
(1)數據加載及合並
'''
import os
os.chdir('C:\\Users\\Administrator\\Desktop\\python數據分析\\項目\\09姓氏')
df01 = pd.read_csv('data01.csv', encoding = 'utf-8')
df02 = pd.read_csv('data02.csv', encoding = 'utf-8')
df_city = pd.read_excel('中國行政代碼對照表.xlsx', sheetname = 0)
#讀取數據
df = pd.concat([df01, df02])
df = pd.merge(df,df_city, left_on = '戶籍地城市編號', right_on = "行政編碼")
 
df['工作地'] = df['工作地'].str[:15]
del df['戶籍地城市編號']
del df['行政編碼']

'''
(2)提取工作地的省市區縣
'''
df['工作地_省'] = df['工作地'].str.split('').str[0]
#提取省
df['工作地_市'] = df['工作地'].str.split('').str[1].str.split('').str[0]
df['工作地_市'][df['工作地_省'].str.len() > 5] = df['工作地_省'].str.split('').str[0]
#提取市
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] + ''

#識別區縣
df['工作地_省'][df['工作地_省'].str.len() > 5] = '未識別'
df['工作地_市'][df['工作地_市'].str.len() > 5] = '未識別'
df['工作地_區縣'][(df['工作地_區縣'].str.len() > 5) | (df['工作地_區縣'].str.len() < 2)] = '未識別'

#整理未識別單元格
df.columns = ['', '工作地', '戶籍所在地_省', '戶籍所在地_市','戶籍所在地_區縣', '戶籍所在地_lng', '戶籍所在地_lat', '工作地_省','工作地_市','工作地_區縣' ]

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource
import warnings
warnings.filterwarnings('ignore')

'''
(1)數據統計,找到姓氏TOP20
'''
name_count = df[''].value_counts()[:20]
result1_01 = pd.DataFrame({'count': name_count,
                           'count_pre': name_count/name_count.sum()})
#篩選數據並統計
'''
(2)bokeh做聯動柱狀圖
'''
from bokeh.models import HoverTool
from bokeh.layouts import gridplot

name_list = result1_01.index.tolist()
source = ColumnDataSource(result1_01)
#創建數據
output_file('project09_01.html')

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.7, color = 'red')
result1.ygrid.grid_line_dash = [6, 4]
result1.xgrid.grid_line_dash = [6, 4]
#柱狀圖1

hover2 = HoverTool(tooltips = [('姓氏占比', "@count_pre")])
result2 = figure(plot_width = 800, plot_height = 250, x_range = result1.x_range,
                 title = '中國姓氏TOP20 - 占比',
                 tools = [hover2, 'reset, xwheel_zoom, pan'])
result2.vbar(x = 'index', top = 'count_pre', source = source,
             width = 0.9, alpha = 0.7, color = 'green')
result1.ygrid.grid_line_dash = [6, 4]
result1.xgrid.grid_line_dash = [6, 4]
#柱狀圖1

p = gridplot([result1], [result2])
show(p)

print('finish')

 

'''
(3)查看“王”姓氏分布
'''
data_wang1 = df[df[''] == '']
writer = pd.ExcelWriter('C:\\Users\\Administrator\\Desktop\\python數據分析\\項目\\09姓氏\\wangb1.xlsx')
data_wang1.to_excel(writer, 'sheet1', index = False)
writer.save()
#導出數據1

 

 

 

 

data_wang2 = data_wang1.groupby([ '戶籍所在地_lng', '戶籍所在地_lat', '戶籍所在地_市'],)[''].count()
data_wang2 = data_wang2.reset_index()

data_wang2.columns = ['lng', 'lat', 'name', 'value'] 

writer = pd.ExcelWriter('C:\\Users\\Administrator\\Desktop\\python數據分析\\項目\\09姓氏\\wangb2.xlsx')
data_wang2.to_excel(writer, 'sheet1', index = False)
writer.save()
#導出數據2

然后把數據data.xlsx替換下

import pandas as pd
import os

os.chdir(r'C:\Users\Administrator\Desktop\python數據分析\項目\09姓氏\data02_3D_Bar_Map')  # 輸入文件所在路徑,例如:'C:/Users/Desktop/'
data = pd.read_excel('data.xlsx', sheetname=0,header=0)

datajs = data.to_json(orient='records',force_ascii=False)

print('轉換后數據為:\n',datajs) #轉換為json數據

在百度地圖拾取中心點坐標(以武漢為點),在settings.py里邊設置下

http://loo2k.com/getpoint/

 

 HTML頁面展示

 

 

 

 

 

另存為start.shap

 

終點文件---->>>

跟上邊一樣,加載end.shap

 

使用LinePlotter插件

 

另存為:轉換為48N的坐標系經緯度帶,它是中心

 

 把項目屬性的坐標也改成48N的

 

 添加長度length字段:

給length字段加個漸進的樣式

最終得到圖

 

 

 

把line2轉為地理坐標系WGS84

與此同時屬性表里邊應該有個value字段,它的計數;count字段是個字符串的格式,要把它轉成一個整數;

記得要把空值null給去掉了

再進行反選

再給它轉換為json格式文件

這樣子試了它還是有空值;

 

有時候它會識別不了,僅保存選中要素,剛剛做了反選。

 

 

 

 

 

 然后使用 http://mapshaper.org/  把它轉換導出json文件

導出json文件

 

 

 

 把data文件換成-->>轉換好的json文件;再在settings里邊調節線的寬度和尾跡的寬度。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM