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)
网友评论