第七天项目实战二

张开发
2026/4/18 9:48:33 15 分钟阅读

分享文章

第七天项目实战二
目录北京房源二手房房价预测项目背景变量说明小区数据 community_describe.csv房源数据 house.csv数据融合数据提取在housetype中删除车位和别墅的数据。提取客厅数房间数卫生间数去掉square中的平米在taxtype中提取地铁距离房本类型在tagList中提取地铁站删除没用的列将数值类型字符串转为数值类型处理异常值缺失值处理编码建模北京房源二手房房价预测项目背景提高成单量促成售卖促成租赁变量说明小区数据 community_describe.csvindex 索引id 小区IDcommunity 小区名称district 区bizcircle 街道tagList 标签列表onsale 在售房源数量房源数据 house.csvindex 索引title 房屋标题community 小区名关联字段years 房屋年限信息housetype 房屋类型square 平米数floor 层数taxtype 契税信息totalPrice 总价格万元unitPrice 单价元followInfo 带看信息数据融合importpandasaspdimportnumpyasnpimportwarnings warnings.filterwarnings(ignore)housepd.read_csv(./二手房数据/house.csv)communitypd.read_csv(./二手房数据/community_describe.csv)datahouse.merge(community,oncommunity,howleft)数据提取使用正则提取数字数据#当前层data[当前层]data.years.str.extract((\w*?)\()#总楼层data[总楼层]data.years.str.extract(共(\d)层)#建成年份data[建成年份]data.years.str.extract(\)(\d)年)#建筑结构data[建筑结构]data.years.str.extract(建(\w))deldata[years]deldata[floor]在housetype中删除车位和别墅的数据。提取客厅数房间数卫生间数datadata[~data.housetype.str.contains(别|车)]#卧室data[卧室]data.housetype.str.extract((\d)室|房)#客厅data[客厅]data.housetype.str.extract((\d)厅)#卫生间data[卫生间]data.housetype.str.extract((\d)卫)deldata[housetype]去掉square中的平米data[square]data.square.str.replace(平米,)在taxtype中提取地铁距离房本类型data[地铁距离]data.taxtype.str.extract(站(\d))data[房本类型]data.taxtype.str.extract(满(\w)年)deldata[taxtype]在tagList中提取地铁站data[地铁站]data.tagList.str.extract(线(\w))deldata[tagList]删除没用的列datadata.drop([index_x,title,totalPrice,followInfo,index_y,id,onsale],axis1)将数值类型字符串转为数值类型data[square]data[square].astype(float64)data[总楼层]data[总楼层].astype(float64)data[建成年份]data[建成年份].astype(float64)data[卧室]data[卧室].astype(float64)data[客厅]data[客厅].astype(float64)data[卫生间]data[卫生间].astype(float64)data[地铁距离]data[地铁距离].astype(float64)处理异常值使用掩码调整数据datadata[data.unitPrice30000]datadata[data[总楼层]40]datadata[data[卧室]5]datadata[data[客厅]2]deldata[卫生间]datadata[data[当前层]!地下室]datadata[data[建筑结构]!平房]缺失值处理data.info()classpandas.core.frame.DataFrameInt64Index:15255entries,0to16115Data columns(total14columns):# Column Non-Null Count Dtype----------------------------0community15255non-nullobject1square15255non-null float642unitPrice15255non-null int643district14188non-nullobject4bizcircle14188non-nullobject5当前层15255non-nullobject6总楼层15255non-null float647建成年份15221non-null float648建筑结构15145non-nullobject9卧室15255non-null float6410客厅15255non-null float6411地铁距离10117non-null float6412房本类型12821non-nullobject13地铁站10655non-nullobjectdtypes:float64(6),int64(1),object(7)memory usage:1.7MB# district缺失值删掉datadata[~data.district.isna()]#地铁距离的缺失值使用最大值填充data.地铁距离[data.地铁距离.isna()]data.地铁距离.max()#房本类型缺失值认为不满2年使用1填充data.房本类型[data.房本类型.isna()]1#地铁站的缺失值填充无data.地铁站[data.地铁站.isna()]无#建成年份的缺失值使用同小区的众数进行填充。填充失败的直接删除defgetyears(items):valdata.建成年份[data.communityitems].mode()ifval.size0:returnval[0]else:returnnp.nan data.建成年份[data.建成年份.isna()]data.community[data.建成年份.isna()].apply(getyears)# 填充失败的直接删掉data.dropna(subset[建成年份],inplaceTrue)#建筑结构的缺失值使用同小区的众数进行填充。填充失败的直接删除defgetyears(items):valdata.建筑结构[data.communityitems].mode()ifval.size0:returnval[0]else:returnnp.nan data.建筑结构[data.建筑结构.isna()]data.community[data.建筑结构.isna()].apply(getyears)# 填充失败的直接删掉data.dropna(subset[建筑结构],inplaceTrue)编码#districtdis_onehotpd.get_dummies(data.district)#进行独热编码datapd.concat((data,dis_onehot),axis1)deldata[district]# 当前层# data.当前层.unique()dic_floor{底层:1,低楼层:2,中楼层:3,顶层:4,高楼层:5}data[当前层]data.当前层.map(dic_floor)# 建筑结构# data.建筑结构.unique()dic_build{板塔结合:1,塔楼:2,板楼:3}data[建筑结构]data.建筑结构.map(dic_build)# 房本类型# data.房本类型.unique()dic_housebook{五:5,两:2,1:1}data[房本类型]data.房本类型.map(dic_housebook)# bizcircledic_bizdict(data.bizcircle.value_counts())data[bizcircle]data.bizcircle.map(dic_biz)# 地铁站dic_subdict(data.groupby(地铁站)[unitPrice].mean())data[地铁站]data.地铁站.map(dic_sub)# communitydic_comdict(data.groupby(community)[unitPrice].mean())data[community]data.community.map(dic_com)# 将unitPrice放到最后一列data[y]data[unitPrice]deldata[unitPrice]建模importsklearn.model_selectionasms#模型选择xdata.iloc[:,:-1]ydata.iloc[:,-1]train_x,\ test_x,\ train_y,\ test_yms.train_test_split(x,y,test_size0.1,random_state7)#回归defselect_model(name,model):passdic_model{模型名:模型对象}forname,objindic_model.items():select_model(name,obj)例子defselect_model(name,model):print(--------,name,----------)model.fit(train_x,train_y)pred_test_ymodel.predict(test_x)print(sm.classification_report(test_y,pred_test_y))model_dict{单颗决策树:st.DecisionTreeClassifier(),Adaboost:se.AdaBoostClassifier(st.DecisionTreeClassifier(),n_estimators100),GBDT:se.GradientBoostingClassifier(n_estimators100),随机森林:se.RandomForestClassifier(n_estimators100)}forname,objinmodel_dict.items():select_model(name,obj)

更多文章