一、提出问题
查看季节、时间段、节假日等与车辆租借数的关系如何。
数据来源:下载数据需要注册账户
https://www.kaggle.com/c/bike-sharing-demand/data?select=sampleSubmission.csvwww.kaggle.com二、理解数据
先读取数据并理解各项字段含义。
#导入包
import pandas as pd
#读取datas文件夹下的共享单车数据
bikeData = pd.read_csv('datas/train_bike.csv')
#展示数据前5条
bikeData.head()
![5e0aefc5dd7ab8c329252d5475ddd10d.png](https://i-blog.csdnimg.cn/blog_migrate/f8d7d56abcac37f5a7fa4d7df034c35d.jpeg)
![fe883ff3b546f2653c09653cf0221d58.png](https://i-blog.csdnimg.cn/blog_migrate/e2ff32de5876c75c822f6386660a4519.jpeg)
三、清洗数据
①查看数据完整度找出缺失值
#查看信息完整度
bikeData.info()
![ec5d934baae97cddac716448d14d88f9.png](https://i-blog.csdnimg.cn/blog_migrate/57d238224383fddc7038a4c50054df1f.jpeg)
每列数据的总数都是10886条,表示该数据没有缺失值。
②提取特征
因为日期字段是字符串类型,为方便分析将其进行切分,分别生成年、月、日、时间字段。
#展示日期数据前5条
bikeData['datetime'].head()
![4aafbff3334d0a148e68106bc3a5a99a.png](https://i-blog.csdnimg.cn/blog_migrate/3f1eb3d00b7d6924aedd03cc13bd0577.png)
#创建一个拆分日期的函数changeDatatime
def changeDatatime(datetime):
#存放年的列表
year = []
#存放月的列表
month = []
#存放日的列表
day = []
#存放时间的列表
time = []
#遍历带入的日期数据
for i in datetime:
#将日期拆分成:年月日 和 时分秒 两组
splitDatetime = i.split(' ')
#将年月日再拆分成:年、月、日
data = splitDatetime[0].split('-')
#添加年、月、日、时间至各自对应的列表中
year.append(data[0])
month.append(data[1])
day.append(data[2])
time.append(splitDatetime[1])
#返回所有列表
return year,month,day,time
#创建一个新的日期数据框
newDatetime = pd.DataFrame()
#通过函数生成年、月、日、时间列表
year,month,day,time = changeDatetime(bikeData['datetime'])
#将列表添加到新建的数据框中
newDatetime['year'] = year
newDatetime['month'] = month
newDatetime['day'] = day
newDatetime['time'] = time
#显示数据前5条
newDatetime.head()
![6748c6400139a971c9f0b7990d8cf25a.png](https://i-blog.csdnimg.cn/blog_migrate/2faba3c9eed19ae13a2d7470969e1167.png)
#将新建日期数据合并到原来的数据中
bikeData = pd.concat([bikeData,newDatetime],axis = 1)
#删除原有的日期字段
bikeData.drop('datetime',axis = 1,inplace = True)
#显示数据前5条
bikeData.head()
![43a2f546d2edb34491fe79208062ec94.png](https://i-blog.csdnimg.cn/blog_migrate/375c3856d0831e433cefe2ecf962bdab.jpeg)
四、数据可视化
①查看各季节的租借数量 - 柱状图
#导入绘图包
import matplotlib.pyplot as plt
#在jupyter下绘制图形时,导入包后加入下代码,可避免图形不显示的异常
%matplotlib inline
#按季节对数据进行分组
newSeries = bikeData.groupby('season')
#对每组数据里的“未注册用户租借数”和“已注册用户租借数”进行求和,并将其取出
casual = newSeries['casual'].sum()
registered = newSeries['registered'].sum()
#创建一个季节列表
season = ['春','夏','秋','冬']
#绘制堆叠柱状图
#1.创建画布并设置大小
fig = plt.figure(figsize = (6,6))
#2.设置柱状图统一的宽度
width = 0.35
#2.绘制底层柱状图:以季节为X轴,未注册用户数为Y轴
plt.bar(season,casual,width,label = '未注册',color = 'tomato')
#3.绘制堆叠柱状图:以季节为X轴,已注册用户数为Y轴,并通过bottom参数堆叠到底层柱状图
plt.bar(season,registered,width,label = '已注册',color = 'bisque',bottom = casual)
#4.显示label属性值
plt.legend()
#4.添加坐标文本、标题、网格线
plt.xlabel('季节')
plt.ylabel('租借数')
plt.title('各季节租借数')
plt.grid(True)
#5.显示图形
plt.show()
![8e247a053aa6b3b31f3e20a565a22d18.png](https://i-blog.csdnimg.cn/blog_migrate/a3f74f34d7b2a72aabfc3fcbd2d4895f.png)
②工作日和非工作日里,各时段的租借数量 - 折线图
#判断每一天是 工作日 还是 非工作日,返回一个Boolean列表
isWork = bikeData['workingday'] = 1
isHoli = bikeData['workingday'] = 0
#将 工作日 和 非工作日 里的数据按时间段进行分组
newSeries1 = bikeData[isWork].groupby('time')
newSeries0 = bikeData[isHoli].groupby('time')
#将各时间段的租借数量分别进行求和
work = newSeries1['count'].sum()
holi = newSeries0['count'].sum()
#用时间列生成一个set时间段列表,用作x轴
time = set(bikeData['time'])
#将set列表转化为list列表
time = list(time)
#对list列表进行升序排序
time.sort()
#创建画布并设置大小
fig = plt.figure(figsize=(20,6))
#绘制 工作日 和 非工作日 的折线图
plt.plot(time,work,label='工作日')
plt.plot(time,holi,label='非工作日')
#显示label属性值
plt.legend()
#添加坐标文本、标题、网格线
plt.xlabel('时间段')
plt.ylabel('租借数')
plt.title('各时间段租借数')
plt.grid(True)
#显示图形
plt.show()
![41df6c32a8cbe54fdb57242366b563eb.png](https://i-blog.csdnimg.cn/blog_migrate/872706a380651111e3afe8e490f0e55d.jpeg)
③湿度、风速 与租借数的相关性 - 散点图
#创建画布并设置大小
fig = plt.figure(figsize=(14,6))
#创建画纸1,用来绘制 湿度与租借数 的散点图
ax1 = plt.subplot(1,2,1)
plt.scatter(bikeData['humidity'],bikeData['count'])
plt.xlabel('湿度')
plt.ylabel('租借数')
plt.title('湿度与租借数相关性')
#创建画纸2,用来绘制 风速与租借数 的散点图
ax2 = plt.subplot(1,2,2)
plt.scatter(bikeData['windspeed'],bikeData['count'])
plt.xlabel('风速')
plt.ylabel('租借数')
plt.title('风速与租借数相关性')
#显示图形
plt.show()
![bc7ef82f61a009de40b17f7f16e8084f.png](https://i-blog.csdnimg.cn/blog_migrate/0dfb9ef2b303e77a38f7de554f451786.jpeg)