美文网首页
me: kaggle共享单车

me: kaggle共享单车

作者: 贝尔_138c | 来源:发表于2020-11-18 13:06 被阅读0次

1.0基础步骤

读取清洗过后的数据

# coding: utf-8

# In[ ]:

'''

##表示展示结果后注释掉的代码

'''

#设置jupyter可以多行输出

from IPython.core.interactiveshell import InteractiveShell

InteractiveShell.ast_node_interactivity = 'all' #默认为'last'

#让在jupyter绘图可以自由拖拽,实时显示坐标的魔术方法

get_ipython().magic('matplotlib notebook')

# 导入相关库

import numpy as np

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

from dateutil.parser import parse

from datetime import datetime

from sklearn.ensemble import RandomForestRegressor

from sklearn.tree import DecisionTreeRegressor

# 读取数据

train_data = pd.read_csv('train_data_clean.csv')

test_data = pd.read_csv('test_data_clean.csv')

4.0 绘制图片

index
TYPE 1: 4.6、4.4 基本plt.plot
TYPE 2: 4.4 2 lines chart
TYPE 3: plt.bar原始应用

非工作日
只要把workingday_df 改成
workingday_df = train_data[train_data['workingday']==0]即可
但实际命名应该是nworkingday_df = train_data[train_data['workingday']==0],这里只是为了代码复用简单处理了

TYPE 1: 4.6-行索引进阶

'''
4.0 数据分析与可视化
'''
#将训练集和测试集合并

#按月份查看11-12年每月的自行车租赁总量
count_month = train_data.groupby(['year','month'],as_index=False).agg({'count':'sum','registered':'sum','casual':'sum','weekday':'min'})
count_month.rename(columns={'weekday':'day'},inplace=True)
count_month['date'] = pd.to_datetime(count_month[['year','month','day']])
count_month.set_index('date',inplace=True)
count_month.drop(['year','month','day'],axis=1,inplace=True)


workingday_df =count_month


y1=['count']

y1=pd.DataFrame(workingday_df,columns=y1)

#完美的行索引
x1 =workingday_df.index


y2=['registered']

y2=pd.DataFrame(workingday_df,columns=y2)

y3=['casual']

y3=pd.DataFrame(workingday_df,columns=y3)

#设置输出的图片大小

figsize = 11,9

figure, ax = plt.subplots(figsize=figsize)

#在同一幅图片上画两条折线

A,=plt.plot(x1,y1,'#017b92',label='count',linewidth=1.0)

B,=plt.plot(x1,y2,'darkorange',label='registered',linewidth=1.0)

C,=plt.plot(x1,y3,'g',label='casual',linewidth=1.0)
plt.xticks(rotation=45)

#设置图例并且设置图例的字体及大小

font1 = {'family' : 'Calibri',

'weight' : 100,

'size'  : 23,

}

font3 = {'family' : 'Times New Roman',

'weight' : 'normal',

'size'  : 23,

}


legend = plt.legend(handles=[A,B,C],prop=font3)

#设置坐标刻度值的大小以及刻度值的字体

plt.tick_params(labelsize=20)

labels = ax.get_xticklabels() + ax.get_yticklabels()

[label.set_fontname('Calibri') for label in labels]

#设置横纵坐标的名称以及对应字体格式

font2 = {'family' : 'Times New Roman',

'weight' : 'normal',

'size'  : 30,

}

plt.xlabel('date',font2)

# plt.ylabel('num',font2)


plt.show()

4.4

代码集成比较好的了

workingday_df = train_data.groupby(['humidity']).agg({'count':'mean','registered':'mean','casual':'mean'})


y1=['count']

y1=pd.DataFrame(workingday_df,columns=y1)

x1 = np.linspace(0,len(y1)-1,len(y1))


y2=['registered']

y2=pd.DataFrame(workingday_df,columns=y2)

y3=['casual']

y3=pd.DataFrame(workingday_df,columns=y3)

#设置输出的图片大小

figsize = 11,9

figure, ax = plt.subplots(figsize=figsize)

#在同一幅图片上画两条折线

A,=plt.plot(x1,y1,'#017b92',label='count',linewidth=1.0)

B,=plt.plot(x1,y2,'c',label='registered',linewidth=1.0)

C,=plt.plot(x1,y3,'g',label='casual',linewidth=1.0)

#设置图例并且设置图例的字体及大小

font1 = {'family' : 'Calibri',

'weight' : 100,

'size'  : 23,

}

font3 = {'family' : 'Times New Roman',

'weight' : 'normal',

'size'  : 23,

}


legend = plt.legend(handles=[A,B,C],prop=font3)

#设置坐标刻度值的大小以及刻度值的字体

plt.tick_params(labelsize=23)

labels = ax.get_xticklabels() + ax.get_yticklabels()

[label.set_fontname('Calibri') for label in labels]

#设置横纵坐标的名称以及对应字体格式

font2 = {'family' : 'Times New Roman',

'weight' : 'normal',

'size'  : 30,

}

plt.xlabel('temp',font2)

plt.ylabel('num',font2)


plt.show()

TYPE 2 :4.4 两条线在line chart,且必须原始数据

# coding: utf-8

# In[ ]:
'''
##表示展示结果后注释掉的代码
'''
#设置jupyter可以多行输出
from IPython.core.interactiveshell import InteractiveShell 
InteractiveShell.ast_node_interactivity = 'all' #默认为'last'



#让在jupyter绘图可以自由拖拽,实时显示坐标的魔术方法
get_ipython().magic('matplotlib notebook')

# 导入相关库
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from dateutil.parser import parse
from datetime import datetime
from sklearn.ensemble import RandomForestRegressor

# 读取数据
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

#train_data.shape
#test_data.shape

##train_data[:5]#展示数据

#首先将datetime列进行拆分,方便后续的处理与分析。

#训练集datetime列处理
train_data['date']=train_data['datetime'].map(lambda x:parse(x).date())
train_data['year']=train_data['datetime'].map(lambda x:parse(x).year)
train_data['month']=train_data['datetime'].map(lambda x:parse(x).month)
train_data['hour']=train_data['datetime'].map(lambda x:parse(x).hour)
train_data['weekday']=train_data['datetime'].map(lambda x:parse(x).isoweekday())

#测试集datetime列处理
test_data['date']=test_data['datetime'].map(lambda x:parse(x).date())
test_data['year']=test_data['datetime'].map(lambda x:parse(x).year)
test_data['month']=test_data['datetime'].map(lambda x:parse(x).month)
test_data['hour']=test_data['datetime'].map(lambda x:parse(x).hour)
test_data['weekday']=test_data['datetime'].map(lambda x:parse(x).isoweekday())


#检查训练集集有无缺失数据
##train_data.info()

#检查训练集有无重复数据
##train_data.duplicated().value_counts()

#训练集和测试集都没有缺失值和重复值。
#先来看下训练集中的数值型数据情况
##train_data[['temp','atemp','humidity','windspeed','casual','registered','count']].describe()


'''
#发现count列的数值差异很大,
最大值和最小值相差很多。
为了进一步观察,
我们可以绘制一份散点图矩阵来看下。

'''

##sns.pairplot(train_data[['temp','atemp','humidity','windspeed','count']])

##3.1 atemp列处理
##len(train_data[(train_data['temp']-train_data['atemp'])>10])

#atemp列异常数据的量只有24个,数据量不大,可以直接剔除。
train_data = train_data[(train_data['temp']-train_data['atemp'])<=10]

##3.2 humidity列处理
##len(train_data[train_data['humidity']==0])

#humidity列值为0的数据量共22个,也是可以直接剔除。
train_data = train_data[train_data['humidity']!=0]

#3.3 count列处理
#剔除极端值
train_data_withoutoutliers = train_data[np.abs(train_data['count'] - train_data['count'].mean()) < (3 * train_data['count'].std())]

#去除异常值之后再看下count列的分布

#数据偏斜依旧很严重,所以这里我们需要将count列进行对数转换,减小波动。
train_data = train_data_withoutoutliers
train_data['count_log'] = np.log(train_data['count'])

"""
'''
3.4 windspeed列处理
这里我们使用随机森林对训练集中windspeed值为0的数据进行回补。
'''
"""



#2
train_data['windspeed_rfr'] = train_data['windspeed']

#将训练集数据分为风速值为0和不为0两部分
windspeed0_data = train_data[train_data['windspeed_rfr']==0]
windspeed1_data = train_data[train_data['windspeed_rfr']!=0]

#设定训练集数据
windspeed_columns = ['season','weather','temp','atemp','humidity','year','month','hour']
X_train = windspeed1_data[windspeed_columns].values
y_train = windspeed1_data['windspeed_rfr'].values

#生成回归器并进行拟合
windspeed_rfr = RandomForestRegressor(n_estimators=1000,random_state=42)
windspeed_rfr.fit(X_train,y_train)

#预测风速值
X_test = windspeed0_data[windspeed_columns].values
windspeed_pred = windspeed_rfr.predict(X_test)

#将预测值填充到风速为0的数据中,并将两个df合并
windspeed0_data['windspeed_rfr'] = windspeed_pred
train_data = pd.concat([windspeed0_data,windspeed1_data]).sort_values('datetime')
#2


'''
3.5 测试集数据处理
对训练集数据进行处理之后,我们同样需要对测试集进行数据清洗,需要注意的一点就是测试集我们不能删除数据,不然提交结果时会出错。

先来看下测试集数据的散点图矩阵
'''

'''
#测试集中没有count列
sns.pairplot(test_data[['temp','atemp','humidity','windspeed']])
'''
#windspeed列仍有大量值为0的异常数据,和训练集一样,我们使用随机森林对测试集windspeed值为0的数据进行回补。

test_data['windspeed_rfr'] = test_data['windspeed']

#将测试集数据分为风速值为0和不为0两部分
windspeed0_data = test_data[test_data['windspeed_rfr']==0]
windspeed1_data = test_data[test_data['windspeed_rfr']!=0]

#设定训练集数据

windspeed_columns = ['season','weather','temp','atemp','humidity','year','month','hour']
X_train = windspeed1_data[windspeed_columns].values
'''
try:
    X_train = windspeed1_data[windspeed_columns].values
except KeyError:
    print ('catch an exception')
'''

    

#判断变量

#print("{0}是{1}".format(X_train,getType(X_train)))

y_train = windspeed1_data['windspeed_rfr'].values

#生成回归器并进行拟合
windspeed_rfr = RandomForestRegressor(n_estimators=1000,random_state=42)
windspeed_rfr.fit(X_train,y_train)

#预测风速值
X_test = windspeed0_data[windspeed_columns].values
windspeed_pred = windspeed_rfr.predict(X_test)

#将预测值填充到风速为0的数据中,并将两个df合并
windspeed0_data['windspeed_rfr'] = windspeed_pred
test_data = pd.concat([windspeed0_data,windspeed1_data]).sort_values('datetime')

#将训练集和测试集合并
bike_data = pd.concat([train_data,test_data],ignore_index=True)

'''
4.0 数据分析与可视化
'''
#贴代码区域,A=,B=plt自己备注

#按天对风速进行汇总,取一天的均数
windspeed_daily = bike_data.groupby(['date'],as_index=False).agg({'windspeed':'mean'})

#按月对风速进行汇总,取一月的均值
windspeed_monthly = bike_data.groupby(['year','month'],as_index=False).agg({'weekday':'min','windspeed':'mean'})
windspeed_monthly.rename(columns={'weekday':'day'},inplace=True)
windspeed_monthly['date'] = pd.to_datetime(humidity_monthly[['year','month','day']])

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
A,=plt.plot(windspeed_daily['date'],windspeed_daily['windspeed'],label='daily average')
B,=plt.plot(humidity_monthly['date'],windspeed_monthly['windspeed'],marker='o',label='monthly average')
ax.legend()



#!!自己的创建

plt.xticks(rotation=45)

font1 = {'family' : 'Calibri',

'weight' : 100,

'size'  : 23,

}

font3 = {'family' : 'Times New Roman',

'weight' : 'normal',

'size'  : 14,

}

legend = plt.legend(handles=[A,B],prop=font3)

TYPE 3: plt.bar原始应用

workingday_df=train_data.groupby(['season']).agg({'registered':'sum','casual':'sum'})

#数据设置


y1=workingday_df['registered'].tolist()

y2=workingday_df['casual'].tolist()
# workingday_df
x=workingday_df.index.tolist()
#正常作图others
x2=range(len(y1))
A=plt.bar(x2, y1,color = '#0e87cc', label='registered')
B=plt.bar(x2, y2, bottom=y1,color = 'darkorange', label='casual',tick_label=x)
# B=plt.bar(x2, y2, bottom=y1,color = 'orange', label='casual')
#按天对风速进行汇总,取一天的均数

font1 = {'family' : 'Calibri',

'weight' : 100,

'size'  : 23,

}

font3 = {'family' : 'Times New Roman',

'weight' : 'normal',

'size'  : 14,

}

legend = plt.legend(handles=[A,B],prop=font3)

5 predict

dummies_month = pd.get_dummies(train_data['month'], prefix= 'month')
# dummies_season=pd.get_dummies(train_data['season'],prefix='season')
dummies_weather=pd.get_dummies(train_data['weather'],prefix='weather')
dummies_year=pd.get_dummies(train_data['year'],prefix='year')

#把5个新的DF和原来的表连接起来,设定训练集
X_train =  pd.concat([train_data,dummies_month,dummies_weather,dummies_year],axis=1).drop(['casual' , 'count' , 'datetime' , 'date' , 'registered',
'windspeed' , 'atemp' , 'month','weather', 'year','count_log'],axis=1)
y_train = train_data['count_log']

#生成模型并进行拟合
rfr = RandomForestRegressor(n_estimators=1000)
rfr.fit(X_train,y_train)

dummies_month = pd.get_dummies(test_data['month'], prefix= 'month')
# dummies_season=pd.get_dummies(test_data['season'],prefix='season')
dummies_weather=pd.get_dummies(test_data['weather'],prefix='weather')
dummies_year=pd.get_dummies(test_data['year'],prefix='year')

#把5个新的DF和原来的表连接起来生成测试集
X_test = pd.concat([test_data,dummies_month,dummies_weather,dummies_year],axis=1).drop([ 'datetime' , 'date' ,'windspeed' , 'atemp' , 'month','weather', 'year'],axis=1)

#进行预测
y_pred = rfr.predict(X_test)

#生成结果过并保存
submission=pd.DataFrame({'datetime':test_data['datetime'] , 'count':[max(0,x) for x in np.exp(y_pred)]})
submission.to_csv('bike_predictions2.csv',index=False)

相关文章

  • me: kaggle共享单车

    1.0基础步骤 读取清洗过后的数据 4.0 绘制图片 indexTYPE 1: 4.6、4.4 基本plt.plo...

  • kaggle共享单车项目

    转载请在文章起始处注明出处,谢谢。 数据来源:kaggle提供的一份2011-2012的共享单车的数据 datet...

  • 数据可视化之共享单车需求可视化分析

    1 共享单车项目 1.1 收集数据: 数据下载自Kaggle Bike Sharing Demand | Kagg...

  • Kaggle共享单车租赁预测

    前言: 共享单车项目中,我们需要根据天气,风速,湿度,温度,时段等信息来预测华盛顿的自行车租赁需求。 训练集提供了...

  • kaggle共享单车项目实战

    1. 数据来源及数据背景 数据来源: https://www.kaggle.com/c/bike-sharing-...

  • Kaggle-共享单车项目分析

    项目链接:Bike Sharing Demand | Kaggle 思路:1.认识数据 2.特征工程 3.建模...

  • 共享单车使用影响因素分析

    转载请在文章起始处注明出处,谢谢。 一、项目背景及目的 kaggle有个共享单车的分析项目,提供一份2011到20...

  • 共享单车

    一、数据源 在 kaggle上下载共享单车数据,数据字段结构如下表: 上图为可视化结果,整体上可见2012年相较于...

  • 共享单车还能火多久?

    ** 什么是共享单车 **现在提到共享单车,大家应该都不陌生,距离共享单车进入市场已有段时间。共享单车是共享经济的...

  • 共享XX

    共享电单车 芒果电单车 七号电单车 共享汽车 gofun 共享单车 摩拜 ofo bluegogo

网友评论

      本文标题:me: kaggle共享单车

      本文链接:https://www.haomeiwen.com/subject/micciktx.html