使用Python进行食品配送时间预测

一般的食品配送服务需要显示交付订单所需的准确时间,以保持与客户的透明度。这些公司使用机器学习算法来预测食品配送时间,基于配送合作伙伴过去在相同距离上花费的时间。

食品配送时间预测

为了实时预测食物的交付时间,我们需要计算食物准备点和食物消耗点之间的距离。在找到餐厅和送货地点之间的距离之后,我们需要找到送货合作伙伴在过去相同距离内运送食物所花费的时间之间的关系。

导入必要的Python库和数据集:

import pandas as pd
import numpy as np
import plotly.express as pxdata = pd.read_csv("deliverytime.txt")
print(data.head())

输出

     ID Delivery_person_ID  Delivery_person_Age  Delivery_person_Ratings  \
0  4607     INDORES13DEL02                   37                      4.9   
1  B379     BANGRES18DEL02                   34                      4.5   
2  5D6D     BANGRES19DEL01                   23                      4.4   
3  7A6A    COIMBRES13DEL02                   38                      4.7   
4  70A2     CHENRES12DEL01                   32                      4.6   Restaurant_latitude  Restaurant_longitude  Delivery_location_latitude  \
0            22.745049             75.892471                   22.765049   
1            12.913041             77.683237                   13.043041   
2            12.914264             77.678400                   12.924264   
3            11.003669             76.976494                   11.053669   
4            12.972793             80.249982                   13.012793   Delivery_location_longitude Type_of_order Type_of_vehicle  Time_taken(min)  
0                    75.912471        Snack      motorcycle                24  
1                    77.813237        Snack         scooter                33  
2                    77.688400       Drinks      motorcycle                26  
3                    77.026494       Buffet      motorcycle                21  
4                    80.289982        Snack         scooter                30

在继续之前,让我们先看看数据大概信息:

data.info()

输出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 45593 entries, 0 to 45592
Data columns (total 11 columns):#   Column                       Non-Null Count  Dtype  
---  ------                       --------------  -----  0   ID                           45593 non-null  object 1   Delivery_person_ID           45593 non-null  object 2   Delivery_person_Age          45593 non-null  int64  3   Delivery_person_Ratings      45593 non-null  float644   Restaurant_latitude          45593 non-null  float645   Restaurant_longitude         45593 non-null  float646   Delivery_location_latitude   45593 non-null  float647   Delivery_location_longitude  45593 non-null  float648   Type_of_order                45593 non-null  object 9   Type_of_vehicle              45593 non-null  object 10  Time_taken(min)              45593 non-null  int64  
dtypes: float64(5), int64(2), object(4)
memory usage: 3.8+ MB

看看这个数据集是否包含任何null值:

data.isnull().sum()

输出

ID                             0
Delivery_person_ID             0
Delivery_person_Age            0
Delivery_person_Ratings        0
Restaurant_latitude            0
Restaurant_longitude           0
Delivery_location_latitude     0
Delivery_location_longitude    0
Type_of_order                  0
Type_of_vehicle                0
Time_taken(min)                0
dtype: int64

计算两个经纬度之间的距离

该数据集没有任何显示餐厅和送货地点之间差异的功能。我们只有餐厅的经纬度和送货地点。我们可以使用半正矢公式根据两个位置的纬度和经度计算它们之间的距离。

下面是我们如何通过使用半正矢公式根据其纬度和经度来计算餐厅和送货地点之间的距离:

# Set the earth's radius (in kilometers)
R = 6371# Convert degrees to radians
def deg_to_rad(degrees):return degrees * (np.pi/180)# Function to calculate the distance between two points using the haversine formula
def distcalculate(lat1, lon1, lat2, lon2):d_lat = deg_to_rad(lat2-lat1)d_lon = deg_to_rad(lon2-lon1)a = np.sin(d_lat/2)**2 + np.cos(deg_to_rad(lat1)) * np.cos(deg_to_rad(lat2)) * np.sin(d_lon/2)**2c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))return R * c# Calculate the distance between each pair of points
data['distance'] = np.nanfor i in range(len(data)):data.loc[i, 'distance'] = distcalculate(data.loc[i, 'Restaurant_latitude'], data.loc[i, 'Restaurant_longitude'], data.loc[i, 'Delivery_location_latitude'], data.loc[i, 'Delivery_location_longitude'])

我们现在已经计算出了餐厅和送货地点之间的距离。我们还在数据集中添加了一个新的特征作为距离。让我们再看看数据集:

print(data.head())

输出

     ID Delivery_person_ID  Delivery_person_Age  Delivery_person_Ratings  \
0  4607     INDORES13DEL02                   37                      4.9   
1  B379     BANGRES18DEL02                   34                      4.5   
2  5D6D     BANGRES19DEL01                   23                      4.4   
3  7A6A    COIMBRES13DEL02                   38                      4.7   
4  70A2     CHENRES12DEL01                   32                      4.6   Restaurant_latitude  Restaurant_longitude  Delivery_location_latitude  \
0            22.745049             75.892471                   22.765049   
1            12.913041             77.683237                   13.043041   
2            12.914264             77.678400                   12.924264   
3            11.003669             76.976494                   11.053669   
4            12.972793             80.249982                   13.012793   Delivery_location_longitude Type_of_order Type_of_vehicle  Time_taken(min)  \
0                    75.912471        Snack      motorcycle                24   
1                    77.813237        Snack         scooter                33   
2                    77.688400       Drinks      motorcycle                26   
3                    77.026494       Buffet      motorcycle                21   
4                    80.289982        Snack         scooter                30   distance  
0   3.025149  
1  20.183530  
2   1.552758  
3   7.790401  
4   6.210138

数据探索

现在,让我们探索数据以找到特征之间的关系。先来看看距离和运送食物所需时间之间的关系:

figure = px.scatter(data_frame = data, x="distance",y="Time_taken(min)", size="Time_taken(min)", trendline="ols", title = "Relationship Between Distance and Time Taken")
figure.show()

在这里插入图片描述
在运送食物所花费的时间和行进的距离之间存在一致的关系。这意味着,无论距离远近,大多数配送合作伙伴都能在25-30分钟内将食物送达。

现在我们来看看送餐时间和送餐人年龄的关系:

figure = px.scatter(data_frame = data, x="Delivery_person_Age",y="Time_taken(min)", size="Time_taken(min)", color = "distance",trendline="ols", title = "Relationship Between Time Taken and Age")
figure.show()

在这里插入图片描述
在运送食物所花费的时间与运送人的年龄之间存在线性关系。这意味着与年长的合作伙伴相比,年轻的交付合作伙伴需要更少的时间来交付食物。

现在我们来看看送餐时间和送餐人评分之间的关系:

figure = px.scatter(data_frame = data, x="Delivery_person_Ratings",y="Time_taken(min)", size="Time_taken(min)", color = "distance",trendline="ols", title = "Relationship Between Time Taken and Ratings")
figure.show()

在这里插入图片描述
在运送食物所花费的时间与运送人的评级之间存在逆线性关系。这意味着与评分较低的合作伙伴相比,评分较高的合作伙伴需要更少的时间来交付食物。

现在让我们来看看客户订购的食品类型和送货合作伙伴使用的车辆类型是否会影响送货时间:

fig = px.box(data, x="Type_of_vehicle",y="Time_taken(min)", color="Type_of_order")
fig.show()

在这里插入图片描述
因此,根据他们驾驶的车辆和他们运送的食物类型,送货合作伙伴所花费的时间没有太大差异。

因此,根据我们的分析,对食品交付时间贡献最大的特征是:

  • 交付伙伴的年龄
  • 交付合作伙伴的评级
  • 餐厅和送货地点之间的距离

在下面的部分中,带你学习如何训练机器学习模型来预测食物交付时间。

食品配送时间预测模型

现在,让我们使用LSTM神经网络模型来训练机器学习模型,用于食物交付时间预测任务:

#splitting data
from sklearn.model_selection import train_test_split
x = np.array(data[["Delivery_person_Age", "Delivery_person_Ratings", "distance"]])
y = np.array(data[["Time_taken(min)"]])
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.10, random_state=42)# creating the LSTM neural network model
from keras.models import Sequential
from keras.layers import Dense, LSTM
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape= (xtrain.shape[1], 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
model.summary()

输出

Model: "sequential"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================lstm (LSTM)                 (None, 3, 128)            66560     lstm_1 (LSTM)               (None, 64)                49408     dense (Dense)               (None, 25)                1625      dense_1 (Dense)             (None, 1)                 26        =================================================================
Total params: 117,619
Trainable params: 117,619
Non-trainable params: 0
_________________________________________________________________
# training the model
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(xtrain, ytrain, batch_size=1, epochs=9)

输出

Epoch 1/9
41033/41033 [==============================] - 410s 10ms/step - loss: 69.7154
Epoch 2/9
41033/41033 [==============================] - 405s 10ms/step - loss: 63.6772
Epoch 3/9
41033/41033 [==============================] - 404s 10ms/step - loss: 61.4656
Epoch 4/9
41033/41033 [==============================] - 406s 10ms/step - loss: 60.5741
Epoch 5/9
41033/41033 [==============================] - 401s 10ms/step - loss: 59.7685
Epoch 6/9
41033/41033 [==============================] - 401s 10ms/step - loss: 59.3501
Epoch 7/9
41033/41033 [==============================] - 397s 10ms/step - loss: 59.3121
Epoch 8/9
41033/41033 [==============================] - 402s 10ms/step - loss: 58.6929
Epoch 9/9
41033/41033 [==============================] - 399s 10ms/step - loss: 58.6897

现在,让我们通过输入来预测食物交付时间来测试我们的模型的性能:

print("Food Delivery Time Prediction")
a = int(input("Age of Delivery Partner: "))
b = float(input("Ratings of Previous Deliveries: "))
c = int(input("Total Distance: "))features = np.array([[a, b, c]])
print("Predicted Delivery Time in Minutes = ", model.predict(features))

输出

Food Delivery Time Prediction
Age of Delivery Partner: 29
Ratings of Previous Deliveries: 2.9
Total Distance: 6
1/1 [==============================] - 0s 23ms/step
Predicted Delivery Time in Minutes =  [[41.34929]]

这就是如何使用机器学习来完成使用Python进行食物配送时间预测的任务。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】数据库排查慢查询、死锁进程排查、预防以及解决方法

MySQL数据库排查慢查询、死锁进程及解决方法 一、排查慢查询 1.1检查慢查询日志是否开启 1.1.1使用命令检查是否开启慢查询日志: SHOW VARIABLES LIKE slow_query_log;如果是 Value 为 off 则并未开启 1.1.2开启并且查看慢查询日志: MySQL提供了慢查询日志功能,可以记录所…

北邮22级信通院数电:Verilog-FPGA(5)第四第五周实验 密码保险箱的设计

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.密码箱的功能和安全性 显示&#xff1a;…

通过动态IP解决网络数据采集问题

前言 网络数据采集是目前互联网上非常重要且广泛应用的技术之一&#xff0c;它可以帮助我们获取互联网上各种类型的数据&#xff0c;并将其转化为可用的信息。然而&#xff0c;一些网站为了保护其数据被滥用&#xff0c;采取了一系列的限制措施&#xff0c;其中包括对访问者的…

远控项目02:项目的创建以及git的配置

&#x1f482; 个人主页:pp不会算法v &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 c/MFC远程控制项目系列文章 1、在github创建仓库 2、在本地创建一个空文…

C#(Csharp)我的基础教程(二)(我的菜鸟教程笔记)-属性和字段的探究与学习

目录 1、字段字段特点&#xff1a;2、属性属性的特点 1、字段 字段是定义在方法外面的变量&#xff0c;是成员变量&#xff0c;主要是为了类的内部数据交换使用&#xff0c;字段一般是用private修饰&#xff0c;也可以用readonly修饰&#xff0c;表示只读字段&#xff0c;其它…

袖口收缩包装机包装效果如何调整

袖口收缩包装机是一种使用非常广泛的包装设备&#xff0c;老百姓最常见的啤酒瓶和可乐瓶的包装就是袖口包装&#xff0c;我们看到的成品效果都是非常好的&#xff0c;那是因为厂商在出厂时已经对设备进行了非常好的调试&#xff0c;那么对于初次使用或者已经使用了&#xff0c;…

C++ (Chapter 1)

C (一) 1.C的命名空间 先来看一个C语言的例子: 下面这段代码是可以正常运行的. #include<stdio.h> int rand 0; int main() {printf("%d \n", rand);return 0; }但是,包含了一个头文件之后,甚至无法通过编译. #include<stdio.h> #include<stdli…

CSS 之 table 表格布局

一、简介 ​ 除了使用HTML的<table>元素外&#xff0c;我们还可以通过display: table/inline-table; 设置元素内部的布局类型为表格布局。并结合table-cell、table-row等相关CSS属性值可以实现HTML中<table>系列元素的效果&#xff0c;具有表头、表尾、行、单元格…

Python之函数详解

一、函数的定义与调用 函数定义语法&#xff1a; def 函数名([参数列表]): ‘’‘注释’‘’ 函数体 注意事项 函数形参不需要声明类型&#xff0c;也不需要指定函数返回值类型即使该函数不需要接收任何参数&#xff0c;也必须保留一对空的圆括号 括号后面的冒号必不可少函数…

IntelliJ IDEA 2023.1 版本可以安装了

Maven 的导入时间更加快了。 收到的有邮件提醒安装。 安装后的版本&#xff0c;其实就是升级下&#xff0c;并没有什么主要改变。 IntelliJ IDEA 2023.1 版本可以安装了 - 软件技术 - OSSEZMaven 的导入时间更加快了。 收到的有邮件提醒安装。 安装后的版本&#xff0c;其实就是…

Lumen/Laravel - 数据库读写分离原理 - 探究

1.应用场景 主要用于学习与探究Lumen/Laravel的数据库读写分离原理。 2.学习/操作 1.文档阅读 chatgpt & 其他资料 数据库入门 | 数据库操作 | Laravel 8 中文文档 入门篇&#xff08;一&#xff09;&#xff1a;数据库连接配置和读写分离 | 数据库与 Eloquent 模型 | La…

OrcaTerm AI

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

为什么选择虚拟展会展览?了解虚拟展会展览的应用领域

引言&#xff1a; 相较于传统的实体展览&#xff0c;虚拟展会展览具有吸引力和便捷性&#xff0c;能够在全球范围内进行宣传活动。这种创新形式不仅能够降低成本、扩大受众范围&#xff0c;还能够提供没有过的互动性和数据分析。 一&#xff0e;虚拟展会展览简介 虚拟展会展览…

[RoarCTF 2019]Easy Calc - RCE(函数输出)+参数waf绕过(PHP字符串解析特性)

[RoarCTF 2019]Easy Calc 1 解题流程2 思考总结1 解题流程 打开页面让我们输入,输了没反应(执行报错),F12发现js有代码$(#calc).submit(function(){$.ajax(

【23-24 秋学期】NNDL 作业3

过程推导 - 了解BP原理数值计算 - 手动计算&#xff0c;掌握细节代码实现 - numpy手推 pytorch自动 对比【numpy】和【pytorch】程序&#xff0c;总结并陈述。激活函数Sigmoid用PyTorch自带函数torch.sigmoid()&#xff0c;观察、总结并陈述。激活函数Sigmoid改变为Relu&#…

身份证读卡器跟OCR有何区别?哪个好?

二代身份证读卡器&#xff08;以下简称读卡器&#xff09;和OCR&#xff08;光学字符识别&#xff09;是两种常见的身份证信息获取技术&#xff0c;它们在原理、功能和应用方面存在一些区别。下面将详细介绍二者的区别并探讨哪个更好。 1. 原理&#xff1a; - 读卡器&#xff…

CSS图文悬停翻转效果完整源码附注释

实现效果截图 HTML页面源码 <!DOCTYPE html> <html><head><meta http-equiv="content-type

【AntDesign】多环境配置和启动

环境分类&#xff0c;可以分为 本地环境、测试环境、生产环境等&#xff0c;通过对不同环境配置内容&#xff0c;来实现对不同环境做不同的事情。 AntDesign 项目&#xff0c;通过 config.xxx.ts 添加不同的后缀来区分配置文件&#xff0c;启动时候通过后缀启动即可。 config…

Centos7安装Gitlab--gitlab--ee版

1 安装必要依赖 2 配置GitLab软件源镜像 3 下载安装GitLab 4 查看管理员root用户默认密码 5 登录GitLab 6 修改密码 7 gitlab相关命令 1 安装必要依赖 sudo yum install -y curl policycoreutils-python openssh-server perl sudo systemctl enable sshd sudo systemctl sta…

antd Form shouldUpdate 关联展示 form 数组赋值

form 数组中嵌套数值更新 注意&#xff1a;数组是引用类型 项目需求&#xff0c;表单中包含多个产品信息&#xff0c;使用form.list 数组嵌套&#xff0c;提货方式如果是邮寄展示地址&#xff0c;如果是自提&#xff0c;需要在该条目中增加两项 代码如下&#xff1a;// An hi…