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里邊設置下
HTML頁面展示
另存為start.shap
終點文件---->>>
跟上邊一樣,加載end.shap
使用LinePlotter插件
另存為:轉換為48N的坐標系經緯度帶,它是中心
把項目屬性的坐標也改成48N的
添加長度length字段:
給length字段加個漸進的樣式
最終得到圖
把line2轉為地理坐標系WGS84
與此同時屬性表里邊應該有個value字段,它的計數;count字段是個字符串的格式,要把它轉成一個整數;
記得要把空值null給去掉了
再進行反選
再給它轉換為json格式文件
這樣子試了它還是有空值;
有時候它會識別不了,僅保存選中要素,剛剛做了反選。
然后使用 http://mapshaper.org/ 把它轉換導出json文件
導出json文件
把data文件換成-->>轉換好的json文件;再在settings里邊調節線的寬度和尾跡的寬度。