我们利用scrapy爬虫框架对去哪儿网对景点数据进行抓取,部分数据如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#加载数据
df = pd.read_csv("data.csv")
df.head()
处理景区等级,只保留数字,且对没有等级的用0填充
df['level'] = df['level'].fillna(0)
df['level'] = df['level'].apply(lambda x:0 if x==0 else int(x[0]))
df.head(10)
处理热度,只保留数值,且小数点保留两位数字
df['hot'] = df['hot'].apply(lambda x:float("%.2f"%float(x.split(" ")[-1])))
df.head(10)
地区处理,将area拆分为省,市,区,并新增这三列数据,最后删除area这一列
df['province'] = df['area'].apply(lambda x:x.split("·")[0] )
df['city'] = df['area'].apply(lambda x:x.split("·")[1] )
df['mini_city'] = df['area'].apply(lambda x:x.split("·")[-1] )
del df['area']
df.head()
统计销量最多的前10个景点
# 统计销量最多的前10个景点
num_top = df.sort_values(by='num',axis=0,ascending=False)
num_top = num_top.reset_index(drop=True)
plt.rcParams['font.sans-serif']=['Microsfot YaHei']
plt.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="SimHei")
sns.set_context("talk")
fig = plt.figure()
sns.barplot(num_top['name'][:10],num_top['num'][:10])
plt.xticks(rotation=90)
fig.show()
景区评级和省份的关系
#景区评级和省份的关系
df['level_sum']=1
var = df.groupby(['province','level']).level_sum.sum()
var.unstack().plot(kind="bar",figsize=(35,10),stacked=False,color=['red','blue','green','black'])
统计人最多的前10个5A景区
#统计人最多的前10个5A景区
top_5A = df[df['level']==5].sort_values(by="num",axis=0,ascending=False).reset_index(drop=True)
# top_5A.head()
fit = plt.figure(figsize=(35,15))
# plt.pie(top_5A["num"][:10],labels=top_5A["name"][:10],autopct='%1.2f%%')
sns.barplot(top_5A["name"][:10],top_5A["num"][:10])
plt.title("人数最多的10个5A景区")
plt.xticks(rotation=90)
plt.show()
统计人最少的前10个5A景区
#统计人最少的前10个5A景区
top_5A = df[df['level']==5].sort_values(by="num",axis=0,ascending=True).reset_index(drop=True)
# top_5A.head()
fit = plt.figure(figsize=(35,15))
# plt.pie(top_5A["num"][:10],labels=top_5A["name"][:10],autopct='%1.2f%%')
sns.barplot(top_5A["name"][:10],top_5A["num"][:10])
plt.title("人数最多的10个5A景区")
plt.xticks(rotation=90)
plt.show()
景区等级分布
#景区等级分布
plt.figure(figsize=(20,1))
sns.countplot(y='level',data=df)
热度分布
# 热度分布
sns.distplot(df['hot'])
plt.xticks(rotation=25)
价格分布
#价格分布
sns.distplot(df['price'])
plt.xticks(rotation=25)
销量分析
#销量分析
sns.distplot(df['num'])
plt.xticks(rotation=25)
将num进行分组并可视化
df['num_cut'] = pd.cut(df['num'],10)
plt.figure()
sns.countplot(y='num_cut',data=df)
one-hot编码
df =df[['name','level','hot','price','num','province','city','mini_city']]
one_hot_df = pd.get_dummies(df[['province','city','mini_city']])
one_hot_df.head()
合并数据
df = df[['level','hot','price','num']]
df = pd.merge(df,one_hot_df,left_index=True,right_index=True)
df.head()
导包
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error,mean_absolute_error
数据准备
X = df[df.columns.difference(['price'])].values
Y = df['price'].values
划分数据集并训练模型
x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.3,random_state=6)
rf = RandomForestRegressor(n_estimators=20,max_depth=7)
rf.fit(x_train,y_train)
pred = rf.predict(x_test)
print(mean_squared_error(y_test,pred))
print(mean_absolute_error(y_test,pred))
模型结果预测
result_df = pd.DataFrame(np.concatenate((y_test.reshape(-1,1),pred.reshape(-1,1)),axis=1),columns=['y_test','y_pred'])
result_df.head()
以下是心得体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。