共享单车之租赁需求预估

2023-12-29 20:36

本文主要是介绍共享单车之租赁需求预估,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 第1关:数据探索与可视化
  • 第2关:特征工程
  • 第3关:租赁需求预估


第1关:数据探索与可视化

相关知识
为了完成本关任务,你需要掌握:

读取数据
数据探索与可视化
读取数据
数据保存在./step1/bike_train.csv中,共享单车的训练集数据总共有8709个训练样本,训练样本中有12个特征(其中count为标签)。特征说明如下:

datetime:时间。年月日小时格式
season:季节。1:春天;2:夏天;3:秋天;4:冬天
holiday:是否节假日。0:否;1:是
workingday:是否工作日。0:否;1:是
weather:天气。1:晴天;2:阴天;3:小雨或小雪;4:恶劣天气
temp:实际温度
atemp:体感温度
humidity:湿度
windspeed:风速
casual:未注册用户租车数量
registered:注册用户租车数量
count:总租车数量
想要读取数据很简单,使用pandas即可,代码如下:

import pandas as pd
train_df = pd.read_csv(‘./step1/bike_train.csv’)#打印数据中的前5行
print(train_df.head(5))
输出如下图所示:

数据探索与可视化
一般拿到数据之后都需要做数据探索(EDA),因为我们需要看看数据到底长什么样子,有什么特性是可以挖掘出来的。假设我们需要看看数据的大概分布是什么样的。可以用pandas提供的describe()函数。输出如下:

此时我们能看到count的标准差很大,我们可以将count的数据分布可视化出来,代码如下:

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
#画count的直方图
plt.hist(train_df[‘count’],bins=20)
plt.title(‘count histgram’)
plt.xlabel(‘count’)
可视化结果如下:

从可视化结果可以看出,count的整体的分布倾斜比较严重,需要处理一下,不然可能过拟合会有点严重。此时我们可以考虑将count的数值在3个标准差之外的样本给扔掉,减少训练集中的噪声,并对count做log变换。代码如下:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
#筛选3个标准差以内的数据
train_df=train_df[np.abs(train_df[‘count’]-train_df[‘count’].mean())<=3*train_df[‘count’].std()]
#log变换
y=train_df[‘count’].values
y_log=np.log(y)
#可视化
sns.distplot(y_log)
plt.title(‘distribution of count after log’)
处理后可视化结果如下:

可以从可视化结果看出,转换过后,count的分布倾斜没有那么严重了,差异也变小了。

接下来我们看看其他的一些特征对于共享单车租赁量的影响。

首先来看看季节对于租赁量的影响,代码如下:

day_df=train_df.groupby(‘date’).agg({‘season’:‘mean’,
‘casual’:‘sum’, ‘registered’:‘sum’,
‘count’:‘sum’,‘temp’:‘mean’,
‘atemp’:‘mean’,‘workingday’:‘mean’,‘holiday’:‘mean’})
season_day_mean=day_df.groupby([‘season’],as_index=True).agg({‘casual’:‘mean’, ‘registered’:‘mean’,‘count’:‘mean’})
temp_df = day_df.groupby([‘season’], as_index=True).agg({‘temp’:‘mean’, ‘atemp’:‘mean’})
season_day_mean.plot(figsize=(15,9),xticks=range(1,4))
plt.title(‘count in different season’)
可视化结果如下:

从可视化结果可以看出,临时用户和注册用户用车数量变化趋势大体一致,且两年间都在秋季左右达到了比较高的用车辆,说明美国人也都比较喜欢在这段时间外出游玩。这是符合常理的。

接下来看看天气对租赁数量的影响,代码如下:

weather_group=train_df.groupby([‘weather’])
weather_count=weather_group[[‘count’,‘registered’,‘casual’]].count()
weather_mean=weather_group[[‘count’,‘registered’,‘casual’]].mean()#不同天气的每小时平均租赁数量
weather_mean.plot.bar(stacked=True,title=‘count per hour in different weather’)
可视化结果如下:

讲道理,天气比较好的时侯,骑共享单车的人才比较多。但上图中像4(恶劣天气)这种天气的租赁数量也比较高,这是不是有点反常呢?我们可以从数据集中找出对应的数据看看,代码如下:

print(train_df.loc[train_df.weather==4])
数据结果如下:

数据的时间是下午6点,刚好是下班的高峰期,所以能够理解为什么这条数据对应的租赁量均值那么高了,这也是符合常理的。

那么一天中不同时间段对于租赁数量有什么样的影响呢?这个就留给你做练习吧。

编程要求
根据提示,在右侧编辑器Begin-End处补充代码,将./step1/bike_train.csv中的数据按照hour这个特征分组,然后求每一组的count的平均值。并使用matplotlib.pyplot绘制折线图,并保存到./step1/result/plot.png。

测试说明
平台会对你生成的折线图与正确答案进行比对,因此请按照以下要求可视化:

折线图的figsize为(10, 10)
折线图的标题为average count per hour
测试输入:
预期输出:你的答案与正确答案一致

开始你的任务吧,祝你成功!
示例代码如下:

import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
#********* Begin *********#
import pandas as pd
import matplotlib.pyplot as plt
train_df = pd.read_csv('./step1/bike_train.csv')
train_df['hour'] = train_df.datetime.apply(lambda x:x.split()[1].split(':')[0]).astype('int')
group_hour=train_df.groupby(train_df.hour)
hour_mean=group_hour[['count','registered','casual']].mean()
fig=plt.figure(figsize=(10,10))
plt.plot(hour_mean['count'])
plt.title('average count per hour')
plt.savefig('./step1/result/plot.png')
#********* End *********#

在这里插入图片描述

第2关:特征工程

任务描述
本关任务:编写python代码,完成时间细化的功能。

相关知识
为了完成本关任务,你需要掌握:

相关性分析
特征选择
相关性分析
在选择特征之前,我们可以看看各个特征相关性的强弱。代码如下:

#计算特征对的相关性
corr_df=train_df.corr()
corr_df1=abs(corr_df)
#画热力图
fig=plt.gcf()
fig.set_size_inches(30,12)
sns.heatmap(data=corr_df1,square=True,annot=True,cbar=True)
相关性热力图如下(其中颜色越亮,代表线性相关性越高):

选择特征
在使用相关性这一指标来选择特征时,通常选择相关性较低,也就是颜色较暗的特征。因为如果选择相关性较高的,比如temp和atemp。从图可以看出这两个特征的相关性很高,也就是说在训练模型的时候,这两个特征所对应的权重是成比例的。既然成比例,那么之选其中一个就行了。

根据热力图我们暂且可以选择时段(hour)、温度(temp)、湿度(humidity)、季节(season)、天气(weather)、风速(windspeed)、是否工作日(workingday)、是否假日(holiday
、注册用户租赁数量(registered)作为特征。

编程要求
现在可能觉得datetime这个字段有必要再细化挖掘一下,比如细化成年份、月份、日期、星期几等。

根据提示,在右侧编辑器Begin-End处补充代码,实现transform_data函数。该函数需要你将train_df中的datetime字段进行细化,细化成year(年份)、month(月份)、date(日期)、weekdat(星期几)、hour(小时)。并返回细化后的DataFrame。

例如,原始数据如下:

细化后数据如下:

测试说明
平台会对你返回的DataFrame与答案进行比对,您只需实现transform_data即可。

测试输入:
预期输出:你的答案与正确答案一致

开始你的任务吧,祝你成功!
示例代码如下:

import pandas as pd
import numpy as np
from datetime import datetime
def transform_data(train_df):'''将train_df中的datetime划分成year、month、date、weekday:param train_df:从bike_train.csv中读取的DataFrame:return:'''#********* Begin *********#train_df['date'] = train_df.datetime.apply(lambda x: x.split()[0])train_df['hour'] = train_df.datetime.apply(lambda x: x.split()[1].split(':')[0]).astype('int')train_df['year'] = train_df.datetime.apply(lambda x: x.split()[0].split('-')[0]).astype('int')train_df['month'] = train_df.datetime.apply(lambda x: x.split()[0].split('-')[1]).astype('int')train_df['weekday'] = train_df.date.apply(lambda x: datetime.strptime(x, '%Y-%m-%d').isoweekday())return train_df#********* End **********#

在这里插入图片描述

第3关:租赁需求预估

任务描述
本关任务:编写python代码,实现租赁需求预估。

相关知识
为了完成本关任务,你需要掌握:

独热编码
sklearn机器学习算法的使用
生成预测结果
独热编码
一般来说,代表类型型的特征我们需要对其进行独热编码。像数据中季节这种类别型的特征,应该使用独热编码。因为如果使用原始的1、2、3、4的话,机器学习算法可能会认为4这个季节更重要。为了防止这种偏见,我们就需要对其进行独热编码。

独热编码其实很简单,就是将待编码的特征的所有可能的取值列出来,然后再在对应的位置上填1,其他位置填0。可以看成是二进制的一种变形。

比如有4个样本的season分别为2、2、2、1。如下图所示:

那么将其独热编码后,如下图所示(第1行到第3行的season=2,所以编码后,每行的season_2这一列为1,其他列为0。而第4行的season=1,所以编码后,season_1这一列为1,其他列为0):

代码如下:

import pandas as pd
#将train_df中的season这一列进行独热编码
dummies_season = pd.get_dummies(train_df[‘season’], prefix=‘season’)
#打印
print(dummies_season)
sklearn机器学习算法的使用
sklearn中提供了非常多的机器学习算法的接口,例如逻辑回归、弹性网络、随机森林等等。而且使用起来非常简单,只需要fit、predict二连即可。而本关是对共享单车的租赁需求量做预测,所以这是一个回归问题。在这里给出sklearn解决回归问题的示例代码:

from sklearn.linear_model import Ridge
#实例化Ridge回归对象
ridge = Ridge(alpha=1.0)
#使用训练集的数据和标签训练
ridge.fit(train_df, train_label)
#对测试集数据进行预测
pred_result = ridge.predict(test_df)
生成预测结果
想要将预测结果保存到文件中,可以使用pandas来实现,示例代码如下:

import pandas as pd
#构建DataFrame,pred_result为机器学习算法的预测结果
result = pd.DataFrame({‘count’:pred_result})
#将DataFrame保存成result.csv,并且保存时不保留index
result.to_csv(‘./result.csv’, index=False)
编程要求
根据提示,在右侧编辑器补充代码。代码主要任务如下:

读取./step3/bike_train.csv中的数据作为训练集,读取./step3/bike_test.csv中的数据作为测试集
将数据处理成你想要的样子
使用sklearn对训练集数据进行训练,并对测试集进行预测
将预测结果保存至./step3/result.csv
测试说明
平台会计算你保存的./step3/result.csv的r2 score。若r2 score高于0.95视为过关。

测试输入:
预期输出:你的预测结果的r2 score高于0.95

PS:./step3/result.csv中需要两列。一列为datetime,另一列为count。其中datetime为./step3/bike_test.csv中的datetime,count为你的预测结果。如:

开始你的任务吧,祝你成功!
示例代码如下:

#********* Begin *********#
import pandas as pd
import numpy as np
from datetime import datetime
from sklearn.linear_model import Ridge
train_df = pd.read_csv('./step3/bike_train.csv')
# 舍弃掉异常count
train_df=train_df[np.abs(train_df['count']-train_df['count'].mean())<=3*train_df['count'].std()]
# 训练集的时间数据处理
train_df['date']=train_df.datetime.apply(lambda x:x.split()[0])
train_df['hour']=train_df.datetime.apply(lambda x:x.split()[1].split(':')[0]).astype('int')
train_df['year']=train_df.datetime.apply(lambda x:x.split()[0].split('-')[0]).astype('int')
train_df['month']=train_df.datetime.apply(lambda x:x.split()[0].split('-')[1]).astype('int')
train_df['weekday']=train_df.date.apply( lambda x : datetime.strptime(x,'%Y-%m-%d').isoweekday())
# 独热编码
train_df_back=train_df
dummies_month = pd.get_dummies(train_df['month'], prefix='month')
dummies_year = pd.get_dummies(train_df['year'], prefix='year')
dummies_season = pd.get_dummies(train_df['season'], prefix='season')
dummies_weather = pd.get_dummies(train_df['weather'], prefix='weather')
train_df_back = pd.concat([train_df, dummies_month,dummies_year, dummies_season,dummies_weather], axis = 1)
train_label = train_df_back['count']
train_df_back = train_df_back.drop(['datetime', 'season', 'weather', 'atemp', 'date', 'month', 'count'], axis=1)
test_df = pd.read_csv('./step3/bike_test.csv')
# 测试集的时间数据处理
test_df['date']=test_df.datetime.apply(lambda x:x.split()[0])
test_df['hour']=test_df.datetime.apply(lambda x:x.split()[1].split(':')[0]).astype('int')
test_df['year']=test_df.datetime.apply(lambda x:x.split()[0].split('-')[0]).astype('int')
test_df['month']=test_df.datetime.apply(lambda x:x.split()[0].split('-')[1]).astype('int')
test_df['weekday']=test_df.date.apply( lambda x : datetime.strptime(x,'%Y-%m-%d').isoweekday())
# 独热编码
test_df_back=test_df
dummies_month = pd.get_dummies(test_df['month'], prefix='month')
dummies_year = pd.get_dummies(test_df['year'], prefix='year')
dummies_season = pd.get_dummies(test_df['season'], prefix='season')
dummies_weather = pd.get_dummies(test_df['weather'], prefix='weather')
test_df_back = pd.concat([test_df, dummies_month,dummies_year, dummies_season,dummies_weather], axis = 1)
test_df_back = test_df_back.drop(['datetime', 'season', 'weather', 'atemp', 'date', 'month'], axis=1)
clf = Ridge(alpha=1.0)
# 训练
clf.fit(train_df_back, train_label)
# 预测
count = clf.predict(test_df_back)
# 保存结果
result = pd.DataFrame({'datetime':test_df['datetime'], 'count':count})
result.to_csv('./step3/result.csv', index=False)
#********* End *********#

在这里插入图片描述


这篇关于共享单车之租赁需求预估的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/550643

相关文章

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

# VMware 共享文件

VMware tools快速安装 VMware 提供了 open-vm-tools,这是 VMware 官方推荐的开源工具包,通常不需要手动安装 VMware Tools,因为大多数 Linux 发行版(包括 Ubuntu、CentOS 等)都包含了 open-vm-tools,并且已经优化以提供与 VMware 环境的兼容性和功能支持。 建议按照以下步骤安装 open-vm-tools 而不

未来工作趋势:零工小程序在共享经济中的作用

经济在不断发展的同时,科技也在飞速发展。零工经济作为一种新兴的工作模式,正在全球范围内迅速崛起。特别是在中国,随着数字经济的蓬勃发展和共享经济模式的深入推广,零工小程序在促进就业、提升资源利用效率方面显示出了巨大的潜力和价值。 一、零工经济的定义及现状 零工经济是指通过临时性、自由职业或项目制的工作形式,利用互联网平台快速匹配供需双方的新型经济模式。这种模式打破了传统全职工作的界限,为劳动

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

OpenStack:Glance共享与上传、Nova操作选项解释、Cinder操作技巧

目录 Glance member task Nova lock shelve rescue Cinder manage local-attach transfer backup-export 总结 原作者:int32bit,参考内容 从2013年开始折腾OpenStack也有好几年的时间了。在使用过程中,我发现有很多很有用的操作,但是却很少被提及。这里我暂不直接

基于springboot+vue+uniapp的“共享书角”图书借还管理系统小程序

开发语言:Java框架:springboot+uniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 后台登录界面 管理员功能界面 出借者管理 图书信息管理 图书归还管理 出租收入管理

Nacos Config 配置中心支持配置共享

文章目录 一、什么是配置中心二、Nacos Config2.1 Nacos Config 工作原理 (★)2.2 Nacos Config 的使用2.3 动态刷新2.4 配置共享2.4.1 同一个微服务的不同环境之间共享配置2.4.2 不同微服务中间共享配置 一、什么是配置中心 微服务架构下关于配置文件的存在以下问题: 配置文件相对分散。在一个微服务架构下,配置文件会随

十四、我们应当怎样做需求分析:子用例与扩展用例

用例模型作为UML中4+1视图中非常重要的一员,非常集中地体现了面向对象的分析与设计思想。用例模型将现实世界中连续的一个一个业务流程,按照场景划分到了一个一个的用例中。由于场景的出现,使得用例中的业务流程存在着高度的内聚性,从而成为了日后各种对象的雏形。同时,在用例分析中,又将那些存在于各个用例中的,相同或相近的业务操作提取出来,形成一个一个的子用例或扩展用例,又体现了面向对象设计中的复用性。现在

十三、我们应当怎样做需求分析:查询报表分析

在我以往的用例分析中,使用这样格式的用例模式,对于大多数业务操作流程来说是得心应手的,但对于有些功能来说总感觉不对劲。感觉不对劲的,就是那些查询、汇总与报表功能。对于这部分功能,需要我们描述的不是什么操作流程,而更重要的是那些数据项、数据来源、报表格式、数据链接,以及使用者、使用频率的说明。而这些,在以往的用例说明格式中统统都没有,怎么办呢?俗话说“东西是死的人是活的”,把我们的用例格式改改吧。