MovingPandas时空轨迹数据探索和分析——上海市出租车数据集

一、
是一个基于、和的库,用于处理运动数据 。为运动数据探索和分析提供了轨迹数据结构和功能 。
是为处理运动数据而开发的,更具体地说是处理轨迹,该库基于一个轨迹类及相关方法 。
可以用于:
本文首先对原始数据进行简单处理并入库,然后举一些处理轨迹数据的基本功能的例子 。
二、数据预处理
【MovingPandas时空轨迹数据探索和分析——上海市出租车数据集】import osimport pandas as pdimport timefrom sqlalchemy import create_enginepath = 'E:\AppDownload\BaiduCloud\上海市出租车数据\Taxi_070220'# 获取path目录下所有文件名,添加后缀.txtfile_list = os.listdir(path)for name in file_list:oldname = path + '\\' + namenewname = path + '\\' + name + '.txt'os.rename(oldname, newname)# 重命名# print(oldname, '======>', newname)# 读取每个txt文件并写入数据库db_name = 'trajectory'# 数据库名file_list1 = os.listdir(path)# 获取path目录下所有文件名for name in file_list1:# 循环读取每个文件名file_path = path + '\\' + namedf = pd.read_csv(file_path, header=None)# 读取txt文件df.rename(columns={0:'id',1:'date',2:'lon',3:'lat',4:'speed(km/h)',5:'direction',6:'passenger'},inplace=True)# 重命名列名# 判断lon和lat是否全部一样if(df['lon'].nunique() == 1 and df['lat'].nunique() == 1):# 将同位置数据写入数据库try:engine = create_engine("postgresql://postgres:123@localhost:5432/" + db_name)# 连接数据库df.to_sql('shanghai20070220_sameloc', con=engine, index=False, if_exists='append')# 第一个参数为写入数据库时的表名,没有就自动创建,有的话就自动添加数据except Exception as e:print(e)finally:engine.dispose()# 关闭数据库连接else:# 将不同位置数据写入数据库try:engine = create_engine("postgresql://postgres:123@localhost:5432/" + db_name)# 连接数据库df.to_sql('shanghai20070220', con=engine, index=False, if_exists='append')# 第一个参数为写入数据库时的表名,没有就自动创建,有的话就自动添加数据print(f'{name}写入数据库成功!')except Exception as e:print(e)finally:engine.dispose()# 关闭数据库连接
三、轨迹分析 用到的库
import pandas as pdimport geopandas as gpdimport movingpandas as mpdimport matplotlib.pyplot as pltfrom datetime import datetime, timedeltafrom mpl_toolkits.axes_grid1 import make_axes_locatablefrom sqlalchemy import create_engine, text
随机提取十条轨迹数据
# 从数据库中读取数据db_name = 'trajectory'engine = create_engine(f'postgresql://postgres:123@localhost:5432/' + db_name) # 连接数据库# sql = 'select * from shanghai20070220'# 查询所有数据sql = 'select * from shanghai20070220 where id ' \'in (select id from shanghai20070220 group by id order by random() limit 10)'# 随机查询10条数据try:# df = pd.read_sql_query(text(sql), engine.connect())df = pd.read_sql(text(sql), engine.connect())except Exception as e:print(e)finally:engine.dispose()# 关闭数据库连接
数据格式转换
df['trajectory_id'] = df['id']df['id'] = df.indexdf['date'] = pd.to_datetime(df['date'])# 将时间转换为时间格式gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['lon'], df['lat']), crs=4326)# 将经纬度转换为几何数据gdf.to_crs('32651', inplace=True)# 设置投影坐标系(数据来源上海市,对数据使用UTM区)mdf = mpd.TrajectoryCollection(gdf, 'trajectory_id', t='date')# 创建轨迹集合# 使用to_traj_gdf()方法查看轨迹数据mdf.to_traj_gdf()