<jupyter_start><jupyter_text>在这个教程中，你将会学到怎么对OD数据应用社区发现算法分析社区发现社区提供的基础数据是：    GIS文件：    1.深圳行政区划    2.深圳栅格        数据：    1.出租车GPS集计栅格OD  基础理论 如果我们把栅格看作节点，而栅格与栅格之间的OD看成连接节点的边，那么出租车的OD信息就可以构建出一个联系网络Graph   网络分析中将具有高度联系的节点的组合定义为社区：>所谓社区是由网络中一些节点的集合构成，社区内部节点之间的连接边密度较高，不同社区节点之间的连接边密度相对较低  借助社区发现算法可以将网络分解为不同的社区，进而研究其中的空间结构关系。    读取基础数据<jupyter_code>#导入必要的包
import pandas as pd
import numpy as np

#绘制图用的包
import matplotlib as mpl
import matplotlib.pyplot as plt

#geopandas包
import geopandas

#shapely包
from shapely.geometry import Point,Polygon,shape<jupyter_output><empty_output><jupyter_text>GIS数据<jupyter_code>#行政区划数据
#读取shapefile文件
shp = r'shapefile\sz.shp'
xzqh = geopandas.GeoDataFrame.from_file(shp,encoding = 'utf-8')

#绘制看看长什么样
xzqh.plot()
#栅格数据
#读取shapefile文件
shp = r'shapefile\grid\grid.shp'
grid = geopandas.GeoDataFrame.from_file(shp,encoding = 'gbk')

#绘制看看长什么样
grid.plot()<jupyter_output><empty_output><jupyter_text>栅格OD数据<jupyter_code>OD = pd.read_csv(r'data-sample\taxi_od_grid.csv')
OD.head(5)
OD.columns<jupyter_output><empty_output><jupyter_text>社区发现  整理数据 每个栅格是一个复杂网络中的一个节点，因此我们把节点信息创建一个表，在社区发现后还可以往表中加列代表节点的社区  先把经纬度LONCOL和LATCOL搞成一个字段 输入OD表是|SLONCOL | SLATCOL |ELONCOL | ELATCOL | VehicleNum(数量) || ----------- |-----------|-----------| ----------- |-----------||65|17|63|18|100|输出grids表是  |gird(由LONCOL和LATCOL得到)| id|| ----------- |-----------||65,17|0||63,18|1||63,19|2|<jupyter_code>###########################你需要在下面写代码#############################












###################################################################################
###############################     答案   ##################################
OD['sgrid'] = OD['SLONCOL'].astype('str')+','+OD['SLATCOL'].astype('str')
OD['egrid'] = OD['ELONCOL'].astype('str')+','+OD['ELATCOL'].astype('str')
grids = list(OD['sgrid'])+list(OD['egrid'])
grids = list(set(grids))
grids = pd.DataFrame(grids)
grids.columns = ['grid']
grids['id'] = range(len(grids))
grids.head(5)
###################################################################################<jupyter_output><empty_output><jupyter_text>把重新编号的grid连到OD表上，得到OD_reindex表  OD_reindex：|oid| eid| VehicleNum|| ----------- |-----------|-----------||1|0|100||0|1|200||1|2|300|<jupyter_code>###########################你需要在下面写代码#############################












###################################################################################
###############################     答案   ##################################
#连到OD表上
OD_reindex = OD[['sgrid','egrid','VehicleNum']]
grids.columns = ['sgrid','oid']
OD_reindex = pd.merge(OD_reindex,grids,on = 'sgrid')
grids.columns = ['egrid','did']
OD_reindex = pd.merge(OD_reindex,grids,on = 'egrid')
OD_reindex.head(5)
###################################################################################<jupyter_output><empty_output><jupyter_text>使用igraph包做社区发现 安装一下python-igraph包>pip install python-igraph<jupyter_code>#导入包
import numpy as np
from igraph import *

#提取边
eages = np.array(OD_reindex[['oid','did']])
eages = list(map(tuple, eages))

#提取边的权重
edge_weights = (np.array(OD_reindex['VehicleNum'])).tolist()

#创建网络
g = Graph()

#在网络中创建节点
g.add_vertices(len(grids))

#把边加入图中
g.add_edges(eages)

#为图中的边添加权重
for i in range(len(edge_weights)):
    g.es[i]["weight"]=edge_weights[i]

edge_weights = np.array(edge_weights)
#调包侠
#对网络应用社区发现的方法
g_clustered =g.community_multilevel(weights = edge_weights)

#计算结果的模块度
md = g_clustered.modularity

#将分组信息赋值到栅格信息表中
grids['group'] = g_clustered.membership<jupyter_output><empty_output><jupyter_text>把grids的信息还原出LONCOL和LATCOL字段，以便后面匹配回grid<jupyter_code>###########################你需要在下面写代码#############################












###################################################################################
###############################     答案   ##################################
tmp = grids['egrid'].apply(lambda r:r.split(','))
grids['LONCOL'] = tmp.apply(lambda r:r[0]).astype('int')
grids['LATCOL'] = tmp.apply(lambda r:r[1]).astype('int')

###################################################################################<jupyter_output><empty_output><jupyter_text>将grids（网络节点信息）与grid（空间信息gdf）匹配，得到gridtoplot变量，以便进行下一步的可视化<jupyter_code>###########################你需要在下面写代码#############################












###################################################################################

###############################     答案   ##################################
gridtoplot = pd.merge(grids[['LONCOL','LATCOL','group']],grid,on = ['LONCOL','LATCOL'])
gridtoplot.head(5)

###################################################################################
# 绘图前，一定要确保变量为GeoDataFrame，而不是DataFrame
gridtoplot = geopandas.GeoDataFrame(gridtoplot)<jupyter_output><empty_output><jupyter_text>可视化 对gridtoplot变量可视化，并用tab10这个colormap来显示<jupyter_code>###########################你需要在下面写代码#############################












###################################################################################


###############################     答案   ##################################

bounds = [113.7, 22.42, 114.5, 22.85]

import matplotlib as mpl
import matplotlib.pyplot as plt
import plot_map
import seaborn as sns
fig     = plt.figure(1,(8,8),dpi = 100)    
ax      = plt.subplot(111)
plt.sca(ax)
fig.tight_layout(rect = (0.05,0.1,1,0.9))

#背景
plot_map.plot_map(plt,bounds,zoom = 12,style = 4)

gridtoplot.plot(ax = ax,column = 'group',cmap = 'tab10',alpha = 0.8)

plt.axis('off')
plt.xlim(bounds[0],bounds[2])
plt.ylim(bounds[1],bounds[3])

# 加比例尺和指北针
plot_map.plotscale(ax,bounds = bounds,textsize = 10,compasssize = 1,accuracy = 2000,rect = [0.06,0.03])

plt.show()
###################################################################################<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.3823018080667594, 'fraction_numerical': 0.01912378303198887, 'mean_word_length': 7.864406779661017, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '367268', 'license': 'MIT', 'n_tokens_mistral': 2432, 'n_tokens_neox': 2457, 'n_words': 219, 'path': 'Fastunfolding.ipynb', 'repo_name': 'ni1o1/pygeo-tutorial', 'size': '5752'}