[原创]
1 利用手机信令数据计算人口流动数据
手机信令数据是研究人口的整体流动情况的重要数据来源。移动运营商在为手机用户提供实时通讯服务时,积累了大量的基站与设备的服务配对数据。根据配对和唤醒发生的时间以及基站的地理位置,可以很自然划定一定时间和空间范围,统计每一个时间范围内在特定空间区域内手机设备的停留,进入和离开数据,并据此估算相应的人流数据。
传统的人口网格分析过程一般只关注单个网格内某个时间点人口流动的截面数据以及城市当中不同区域的人口分布统计情况;没有将时间和空间融合考虑,不能对城市整体的人口流动形成一个完整连续的直观描述。但是,作为城市安全运营管理者和规划人员职责是需要把握好城市人口流动规律,建立有效的时空数据分析模型,从而为城市安全运行管理做好相应的人口短时预测与应急管理服务。
2 人口流动数据网格图像流处理
2.1 流处理思路
原始手机信令数据,按照一定的时间间隔(例如15分钟),划分出每个时间段的信令数据情况。主要包括:时间,格网ID,格网中心点经度,格网中心点维度,时间段内格网的停留人数,进入人数,离开人数。
根据原始数据的时空关系,将原始数据转化为4维向量空间矩阵,维度分别为时间维度、空间维度横坐标,空间维度纵坐标以及停留,进入或离开的类别:Matrix[t,i,j,k]=p意味着在t时刻,第i行第j列的空间栅格位置,k=0时则停留人数为p,k=1时则进入人数为p,k=2时则离开人数为p。
在这样的转换关系下,可以将源数据处理为3通道的时空数据。考虑到单个人员流动的时空连续性,可以认为表示人口流通的整体统计量的时空矩阵也具备一定局部关联性,换而言之,一个栅格点的人口流动数据会与该栅格附近的人口流行数据相互关联,也会与前后时间段该栅格的人口流动数据相互关联。而具体的关联形式和影响强度,则需要我们利用卷积神经,对历史数据进行学习来发现和记录相应的关联关系。
更进一步地,通过数据洞察注意到,不同栅格网络间人口流动的时间变化曲线往往倾向于若干种固定模式,直观上,商业区,住宅区,办公区域会呈现出不同的人流曲线变化模式。这种模式与地理位置,用地规划,交通路网信息等属性息息相关。本模型后续将进一步讨论不同用地类型的栅格人口流动模式的比较分析。
TIME
TAZID
STAY
ENTER
EXIT
2017-04-05 00:00:00
1009897
460
460
52
2.2 人口栅格数据矢量化
基于一定的空间距离间隔(例如250m),将分析的目标空间划分为若干网格(141*137)。统计T时间内,属于网格M_(p,q)的手机设备停留、进入和离开的数据。按照业务需求,将手机设备数扩样为人口数量,将停留、进入和离开的数据标准化到(0,255)的空间,并将标准化后的数据作为图像的3个颜色通道,据此将T时间的整体网格数据转化为一张三通道格式的图片数据。按照时间维度将经过上述处理的图像作为视频的每一帧图像。
import pandas as pd
import numpy as np
import h5py
# 数据转换成张量类型
data_enter_exit_sz = pd.read_csv('data/sz/data/TBL_ENTER_EXIT_SZ20170401-20170431.csv')
time_list = data_enter_exit_sz['TIME'].unique()
N = len(time_list)
string_to_ix = {string:i for i,string in enumerate(time_list)}
tensor_data = np.zeros([N,141,137,3])
for _,line in data_enter_exit_sz.iterrows():
if int(line['TAZID']) <= 1000000:
continue
x,y = divmod(int(line['TAZID'])-1000000,144)
x = x - 2
y = y - 2
t = string_to_ix[line['TIME']]
tensor_data[t][x][y][0] = line['STAY']
tensor_data[t][x][y][1] = line['ENTER']
tensor_data[t][x][y][2] = line['EXIT']
# 数据保存成h5类型
h5 = h5py.File('model_data/tensor_data_sz.h5','w')
h5.create_dataset('dataset_1', data = tensor_data)
h5.close()
# 数据准备:区分X和Y
h5 = h5py.File('model_data/tensor_data_sz.h5','r')
tensor_data = h5['dataset_1'][:]
h5.close()
M = len(tensor_data)
X = []
Y = []
for i in range(M - 8):
X.append(tensor_data[i:i+8]) # 延迟预测前8个时段预测下1时段
Y.append([tensor_data[i+8][20:120,20:116]]) # 取部分城区
X = np.array(X)
Y = np.array(Y)
# print(X.shape) # (2104, 8, 141, 137, 3)
# print(Y.shape) # (2104, 1, 100, 96, 3)
h5 = h5py.File('./drive/model_data/model_data_sz.h5','w')
h5.create_dataset('date_sz', data=X)
h5.create_dataset('data_sz', data=Y)