【data】上海膜拜数据

news2025/5/17 21:52:35

数据初始样貌
在这里插入图片描述

在这里插入图片描述

一、数据预处理

1. 数据每5分钟栅格统计

  1. 时间数据的处理
path="mobike_shanghai.csv"
df=pd.read_csv(path)   
# 获取时间信息,对于分钟信息,5分钟取整 
def time_info(df,col): 
    df['datetime'] = pd.to_datetime(df[col])
    df['week'] = df.datetime.dt.dayofweek
    df['date'] = df.datetime.dt.date
    df['hour'] = df.datetime.dt.hour 
    df["minute"]=df.datetime.dt.minute 
    df["minute"]=df["minute"].apply(lambda x :ceil_5(x) )  #对时间5分钟取整
    return df[["week","date","hour","minute"]] 
  1. 筛选数据:位置,时间,类型。
    每一条信息,根据起点的(位置,时间)和终点(位置,时间)划分为2条信息了。
#筛选起点信息
df1=time_info(df,"start_time")
dfs=df[["start_location_x","start_location_y"]]
dfs.columns=["x","y"] 
dfs=pd.concat([dfs,df1],axis=1)  
dfs["type"]=1 
# 筛选终点信息
df1=time_info(df,"end_time")
dfe=df[["end_location_x","end_location_y"]]
dfe.columns=["x","y"] 
dfe=pd.concat([dfe,df1],axis=1)  
dfe["type"]=0 
# 两组信息合并
df_new=pd.concat([dfs,dfe]) 
df_new 

在这里插入图片描述

2. 经纬度匹配

  1. 定义网格。确定经纬度的最大范围。确定网格的形状。
    12,13,14,15,16,17
    06,07,08,09,10,11
    00,01,02,03,04,05,
  2. 查看相关信息
    在这里插入图片描述
    删除距离过远的点。
df_new.reset_index(drop=True,inplace=True) # 重置索引
in1=df_new[df_new["x"]<121.0].index.tolist() 
in2=df_new[df_new["y"]<30.95].index.tolist() 
indexes=in1+in2   #删除外部的数据
for idx in indexes:
    df_new.drop(idx,inplace=True)  #删除外部的数据
df_new.reset_index(drop=True,inplace=True) #再次重置索引

删除异常点。

# 获取 区域的极限经纬度
East=df_new["x"].max()
West=df_new["x"].min()
North=df_new["y"].max()
South=df_new["y"].min()
print(East,West,North,South)
# 因为地理位置已经脱敏,所以不是连续型数据。查看多少个地理点。
print(len(set(df_new["x"])) ,len(set(df_new["y"]))  ) 
# 计算区域内的最长距离,平均每个网格的距离为500米。并预估网格个数。
from geopy.distance import geodesic 
distance = geodesic((South,West), (North,East)).m  #geodesic  #计算对角线距离
print(distance/500)
distance = geodesic((South,West), (North,West)).m  #geodesic  #计算南北距离
print(distance/500) 
distance = geodesic((South,West), (South,East)).m  #geodesic  #计算东西距离
print(distance/500) 

out:
121.785 121.172 31.468 30.989
495 441
157.87945410409293
106.21671999130861
117.1015158394339


确定,南北划分100,东西划分120.

  1. 获取每个loc的id号。
########定义获取id号的函数
d_x=(East-West)/100  #东西的经度间隔
d_y=(North-South)/100 #南北的维度间隔
def get_label(x,y):
    i=min(int((x-West)/d_x),99)
    j=min(int((y-South)/d_y),99)
    ID=j*100+i
    return ID 
########
df_new["id"] =df_new[["x","y"]].apply(lambda x :get_label(x["x"],x["y"]),axis=1)  
print(df_new.id.min(),df_new.id.max())  

在这里插入图片描述

idxes=sorted(set(df_new.id.tolist()) ) #id号取独(),再从小到大排序
id_dict={idxes[k]:k for k in range(len(idxes))}   #将索引和网格号对应起来。
#因为网格号的最小值为42,最大值为9938.且共3289个网格。因此可以将索引代表node的id
df_new["id"] =df_new["id"].apply(lambda x :id_dict[x])    

3. 根据id号,type, hour合并数据。

  1. 筛选一周的数据。
df_new['Date']=df_new['date'].apply(lambda x: str(x))  
df2= df_new.query("Date<='2016-08-19'& Date>='2016-08-13' ")
df2.reset_index(drop=True,inplace=True) # 重置索引 
  1. 按照"Date","hour","type","id"统计数据。虽然按照dict的方式比较慢。但是比较准确。主要是分组的方式,我不太会。
### 按关键词统计数据
a =defaultdict(lambda:0) 
for i in range(df2.shape[0]):
    D   =df2.loc[i]["Date"]
    H   =df2.loc[i]["hour"]
    T   =df2.loc[i]["type"]
    ID  =df_new.loc[i]["id"]
    a[D,H,T,ID] +=1 
### 生成新的数据
DF =pd.DataFrame(columns=["Date","hour","type","id","flow"])  
i =0 
for key in a.keys():
    D,H,T,ID =key
    DF.loc[i]=[D,H,T,ID,a[key]]  
    i +=1  
#### id号的loc位置的获取
Loc=df_new.groupby(["id"])[["x","y"]].mean() 
####拼接数据
DF1 = pd.merge(DF, Loc, how = 'left',left_on="id",right_on="id")  
## DF1.isnull().sum() #验证拼接结果没有空值null
  1. 数据的排序
## flow分为正负性
DF1["Flow"]=DF1[["type","flow"]].apply(lambda x :get_flow(x["type"],x["flow"]),axis=1)  
## 数据排序和删除无用序列
DF1.sort_values(by=["Date","hour","id"],ascending=False,inplace=True)  
DF1.reset_index(drop=True,inplace=True) # 重置索引
del DF1["type"]    

附录:case数据改为取送问题。

  1. 原数据形状
    在这里插入图片描述
  2. 对100行数据,重新赋值。使得 ∑ i = 0 99 d i = 0 \sum_{i=0}^{99} d_i=0 i=099di=0, ∑ i ∈ S d i = 900 = − ∑ j ∈ E d j \sum_{i\in S}d_i=900=-\sum_{j\in E}d_j iSdi=900=jEdj. S是pick-up集合。E是drop-out集合。

2.1)在(40-60)之间随机选择一个数字c。划分两个集合S和E. ∣ S ∣ = c |S|=c S=c, ∣ E ∣ = 100 − c |E|=100-c E=100c
2.2) 分别构造集合S和E的id索引a和b。

a=random.sample(range(100),random.randint(40,60))
b=set(range(100))-set(a)  
b =list(b)

2.3) 将900随机分配为 ∣ S ∣ = c |S|=c S=c个数。将-900随机分配到 ∣ E ∣ = 100 − c |E|=100-c E=100c个数。并保证0不会出现,且不会出现超过45的值(值太大的话,会导致局部出现小数字的情况)。

def choise(s,n):
    men=min(45,s-10*n)
    p =random.choice(range(1,men))
    return s-p,p   
A=[]
n=56
s=900
for i in range(n,1,-1):
    s,p=choise(s,i)
    A.append(p)
A.append(900-np.sum(A)) 
B=[]
n=44
s=900
for i in range(n,1,-1):
    s,p=choise(s,i)
    B.append(p)
B.append(900-np.sum(B)) 

2.4) 检查A,B中没有特别大的数字。否则再一次随机。
2.5)构造索引和数值之间的对应的关系,用dict表示。

demand={}
for i in range(56):
    demand[a[i]]=A[i] 
for j in range(44):
    demand[b[j]]=-B[j] 

2.6)按照索引排序,然后获得整体的demand.并赋值给原DataFrame.然后保存。

de=[demand[k] for k in sorted(demand.keys())]
df["demand"]=de
df.to_csv("./case/demand1.csv") 

2.7)查看修改后的结果。demand的正负值交错,非常不错。
在这里插入图片描述
3. 因为对需求值重新赋值过了。我们的车辆的一条最短的轨迹必为:depot-start t o to to 起点 → \to 终点 → \to depot-end.所以,我们要求服务的时间窗口不能太小。因次我们对小的窗口进行松弛。

for i in range(100):
    if df.loc[i]["end_time"]-df.loc[i]["start_time"] < 150:
        a=random.choice(range(40,60))
        df.loc[i]["end_time"] =min(1000,df.loc[i]["end_time"]+a)
        df.loc[i]["start_time"] = max(0,df.loc[i]["start_time"]-a)   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DDS(数据分发服务) 和 P2P(点对点网络) 的详细对比

1. 核心特性对比 维度 DDS P2P 实时性 微秒级延迟&#xff0c;支持硬实时&#xff08;如自动驾驶&#xff09; 毫秒至秒级&#xff0c;依赖网络环境&#xff08;如文件传输&#xff09; 架构 去中心化发布/订阅模型&#xff0c;节点自主发现 完全去中心化&#xff0c;节…

【LeetCode 热题 100】动态规划 系列

&#x1f4c1; 70. 爬楼梯 状态标识&#xff1a;爬到第i层楼梯时&#xff0c;有多少种方法。 状态转移方程&#xff1a;dp[i] dp[i-1] dp[i-2]&#xff0c;表示从走一步和走两步的方式。 初始化&#xff1a;dp[1] 1 , dp[2] 2。 返回值&#xff1a;dp[n]&#xff0c;即走到…

计网实验笔记(一)CS144 Lab1

Lab0 ByteStream : 实现一个在内存中的 有序可靠字节流Lab1 StreamReassembler&#xff1a;实现一个流重组器&#xff0c;一个将字节流的字串或者小段按照正确顺序来拼接回连续字节流的模块Lab2 TCPReceiver&#xff1a;实现入站字节流的TCP部分。Lab3 TCPSender&#xff1a;实…

使用 OpenCV 将图像中标记特定颜色区域

在计算机视觉任务中&#xff0c;颜色替换是一种常见的图像处理操作&#xff0c;广泛用于视觉增强、目标高亮、伪彩色渲染等场景。本文介绍一种简单而高效的方式&#xff0c;基于 OpenCV 检测图像中接近某种颜色的区域&#xff0c;并将其替换为反色&#xff08;对比色&#xff0…

智源联合南开大学开源Chinese-LiPS中文多模态语音识别数据集

2025年5月6日&#xff0c;智源研究院在法国巴黎举行的GOSIM全球开源创新论坛上发布Chinese-LIPS中文多模态语音识别数据集&#xff0c;该数据为智源研究院联合南开大学共同构建。 在语音识别技术飞速发展的背景下&#xff0c;多模态语音识别正逐步成为学术界和工业界的研究热点…

RabbitMQ最新入门教程

文章目录 RabbitMQ最新入门教程1.什么是消息队列2.为什么使用消息队列3.消息队列协议4.安装Erlang5.安装RabbitMQ6.RabbitMQ核心模块7.RabbitMQ六大模式7.1 简单模式7.2 工作模式7.3 发布订阅模式7.4 路由模式7.5 主题模式7.6 RPC模式 8.RabbitMQ四种交换机8.1 直连交换机8.2 主…

python爬虫实战训练

前言&#xff1a;哇&#xff0c;今天终于能访问豆瓣了&#xff0c;前几天爬太多次了&#xff0c;网页都不让我访问了&#xff08;要登录&#xff09;。 先来个小练习试试手吧&#xff01; 爬取豆瓣第一页&#xff08;多页同上篇文章&#xff09;所有电影的排名、电影名称、星…

Redis(三) - 使用Java操作Redis详解

文章目录 前言一、创建项目二、导入依赖三、键操作四、字符串操作五、列表操作六、集合操作七、哈希表操作八、有序集合操作九、完整代码1. 完整代码2. 项目下载 前言 本文主要介绍如何使用 Java 操作 Redis 数据库&#xff0c;涵盖项目创建、依赖导入及 Redis 各数据类型&…

【全网首发】解决coze工作流批量上传excel数据文档数据重复的问题

注意&#xff1a;目前方法将基于前一章批量数据库导入的修改&#xff01;&#xff01;&#xff01;&#xff01;请先阅读上篇文章的操作。抄袭注明来源 背景 上一节说的方法可以批量导入文件到数据库&#xff0c;但是无法解决已经上传的条目更新问题。简单来说&#xff0c;不…

xss-labs靶场第11-14关基础详解

前言&#xff1a; 目录 第11关 第12关 第13关前期思路&#xff1a; 第十四关 内容&#xff1a; 第11关 也和上一关一样&#xff0c;什么输入框都没有&#xff0c;也就是 也是一样的操作&#xff0c;先将这里的hidden属性删掉一个&#xff0c;注意是删掉一个 输入1111&a…

ConcurrentSkipListMap的深入学习

目录 1、介绍 1.1、线程安全 1.2、有序性 1.3、跳表数据结构 1.4、API 提供的功能 1.5、高效性 1.6、应用场景 2、数据结构 2.1、跳表&#xff08;Skip List&#xff09; 2.2、节点类型&#xff1a; 1.Node 2.Index 3.HeadIndex 2.3、特点 3、选择层级 3.1、随…

XML简要介绍

实际上现在的Java Web项目中更多的是基于springboot开发的&#xff0c;所以很少再使用xml去配置项目。所以我们的目的就是尽可能快速的去了解如何读懂和使用xml文件&#xff0c;对于DTD&#xff0c;XMLSchema这类约束的学习可以放松&#xff0c;主要是确保自己知道这里面的大致…

什么是直播美颜SDK?美颜技术底层算法科普

当下&#xff0c;不论是社交直播、电商直播&#xff0c;还是线上教学、虚拟主播场景&#xff0c;都离不开美颜技术的加持。虽然大家在日常使用直播APP时经常体验到美颜效果&#xff0c;但背后的技术原理却相对复杂。本篇文章小编将为大家揭开直播美颜SDK的神秘面纱&#xff0c;…

【pbootcms】打开访问首页显示未检测到您服务器环境的sqlite3数据库拓展,请检查php.ini中是否已经开启该拓展

【pbootcms】新建网站&#xff0c;新放的程序&#xff0c;打开访问首页显示未检测到您服务器环境的sqlite3数据库拓展&#xff0c;请检查php.ini中是否已经开启该拓展。 检查目前网站用到哪个版本的php&#xff0c;然后打开相关文件。 修改一下内容&#xff1a; 查找sqlite3,…

MySQL——十、InnoDB引擎

MVCC 当前读&#xff1a; 读取的是记录的最新版本&#xff0c;读取时还要保证其他并发事务不能修改当前记录&#xff0c;会对读取的记录进行加锁。 -- 当前读 select ... lock in share mode(共享锁) select ... for update update insert delete (排他锁)快照读&#xff1a;…

visual studio生成动态库DLL

visual studio生成动态库DLL 创建动态库工程 注意 #include “pch.h” 要放在上面 完成后点击生成 创建一个控制台项目 设置项目附加目录为刚才创建的动态库工程Dll1&#xff1a; 配置附加库目录&#xff1a; 配置动态库的导入库&#xff08;.lib&#xff09;&#xff1a;链…

IDEA中git对于指定文件进行版本控制

最近在自己写代码的时候遇到了和公司里面不一样的&#xff0c;自己写的代码推到码云上是&#xff0c;会默认对于所有修改都进行提交&#xff0c;这样再提交的时候很不方便。 问了问ai&#xff0c;表示可以手动创建脚本实现&#xff0c;但是ai曲解了我的意思&#xff0c;它实现…

用Python绘制梦幻星空

用Python绘制梦幻星空 在这篇教程中&#xff0c;我们将学习如何使用Python创建一个美丽的星空场景。我们将使用Python的图形库Pygame和随机库来创建闪烁的星星、流星和月亮&#xff0c;打造一个动态的夜空效果。 项目概述 我们将实现以下功能&#xff1a; 创建深蓝色的夜…

GEE计算 RSEI(遥感生态指数)

&#x1f6f0;️ 什么是 RSEI&#xff1f;为什么要用它评估生态环境&#xff1f; RSEI&#xff08;遥感生态指数&#xff0c;Remote Sensing Ecological Index&#xff09; 是一种通过遥感数据计算得到的、综合反映区域生态环境质量的指标体系。 它的设计初衷是用最少的变量&…

python的家教课程管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…