首页 > 其他分享 >基于大数据的房产估价

基于大数据的房产估价

时间:2024-04-22 10:44:05浏览次数:22  
标签:map 基于 plt 估价 楼层 pd 房产 data lambda

一、实验目的与要求

1、掌握使用numpy和pandas库处理数据的基本方法。
2、掌握使用Sklearn库对多元线性回归算法的实现及其评价方法。
3、掌握使用matplotlib结合pandas库对数据分析可视化处理的基本方法。

二、实验内容

1、利用python中pandas等库完成对数据的预处理,最后将处理好的文件进行保存。
2、利用pandas、matplotlib等库完成对预处理数据的可视化。
3、结合pandas、matplotlib库对聚类完成的结果进行可视化处理。

三、实验步骤

1.数据预处理

(1)导入所需要使用的包

import os
import re
import pandas as pd
import numpy as np

(2)读取文件

input_dir='/data/bigfiles/'

files=os.listdir(input_dir)

data_list=[]

for file in files:
    data_list.append(pd.read_excel(input_dir +file))

(3)查看数据的基本统计信息

data=pd.concat(data_list)
data

(4)删除csv文件中索引列,并重置


data= data.reset_index()

data=data.drop("index",axis=1)
data.head(10) 

(5)处理空值

(data.isnull()).sum()

(data.duplicated()).sum()

data.drop_duplicates(inplace=True)

(6)删除部分数据的中文字符,将数据类型转换为float型

#使用正则表达式查看单价列中含有的中文字符种类
data.总价.map(lambda x: re.sub('[^\u4E00-\u9FA5]','',x)).unique()
print(data.单价.map(lambda x: re.sub('[^\u4E00-\u9FA5]','',x)).unique())
 
data['单价']=data.单价.map(lambda x : round(float(re.findall(r'单价(.*?)元/平米',x)[0])/10000,2))
 
#删去字符串“万”,将类型转换float,保留两位小数
data['总价']=data.总价.map(lambda x : round(float(x.replace('万','')),2))
data
#拆分房屋信息所在列
a = data.房屋信息.map(lambda x : len(x.split('|')))
data= data[a == 7]
data.loc[:,'户型'] = data.房屋信息.map(lambda x : x.split('|')[0])
data.loc[:,'面积'] = data.房屋信息.map(lambda x : x.split('|')[1])
data.loc[:,'朝向'] = data.房屋信息.map(lambda x : x.split('|')[2])
data.loc[:,'类型'] = data.房屋信息.map(lambda x : x.split('|')[3])
data.loc[:,'楼层'] = data.房屋信息.map(lambda x : x.split('|')[4])
data.loc[:,'建成时间'] = data.房屋信息.map(lambda x : x.split('|')[5])
data.loc[:,'结构'] = data.房屋信息.map(lambda x : x.split('|')[6])
# data = data.drop('房屋信息',axis = 1)
data['面积']=data.面积.map(lambda x : round(float(x.replace('平米','')),2))
len(data[~data.建成时间.str.contains('年建')])
# data['建成时间']=data.建成时间.map(lambda x:float(x.replace('年建','')))
data.head()

(7)对部分数据进行独热码编码


#对户型进行独热编码
data=data.join(pd.get_dummies(data.户型))
# data = data.drop('户型',axis = 1)
 
#对区域类型结构
print(data.区域.unique())
data=data.join(pd.get_dummies(data.区域))
data.head()

(8)存储预处理后的文件

# #说白了就是清晰数据
# #去掉字符串前后空格
data.head()
data.类型.unique()
data.结构.unique()
data['类型'] = data.类型.str.strip()
data['结构'] = data.结构.str.strip()
#丢弃无效数据
data=data[(data.类型 != '其他')&(data.结构!='暂无数据')]
#使用独热码编码
data =data.join(pd.get_dummies(data.类型))
data =data.join(pd.get_dummies(data.结构))
# data = data.drop('类型',axis = 1)
 
#处理朝向列种类
def my_get_dummies(ser):
    base_dirt=['东','南','西','北','东北','东南','西南','西北']
    base_data=np.zeros((len(ser),),dtype=np.int)
    df = pd.DataFrame({'东':base_data,'南':base_data,'西':base_data,'北':base_data,'东北':base_data,'东南':base_data,'西南':base_data,
                      '西北':base_data})
    for irec in ser.index:
        rec=ser[irec].strip().split(' ')
        for dirt in rec:
            #检查是否存在8个基本方位以外的记录
            if dirt not in base_dirt:
                print(dirt)
            else:
                df[dirt][irec]=1
    return df
data=data.join(my_get_dummies(data.朝向))
#删除原有列
data=data.drop('朝向',axis=1)
data.head()
#检测数据格式一致性
(~data.楼层.str.contains('楼层')).sum()
#舍弃数据
data = data[data.楼层.str.contains('楼层')]
#查看数据唯一值
data.楼层.unique()
#提取所在楼层
 
data['所在楼层']=data.楼层.map(lambda x:x.split('(')[0])
#对所在楼层进行独热编码
data=data.join(pd.get_dummies(data.所在楼层))
#使用正则表达式提取数据并转换为int类型
data['总楼层'] =data.楼层.map(lambda x: int(re.findall(r'\(共(.*?)\层',x)[0]))
#删除原有列
# data = data.drop('楼层',axis=1)
# data = data.drop('所在楼层',axis=1)
data.head(5)
# #删除发布时间列信息
# data=data.drop('发布时间',axis=1)
#去掉空格
data=data.rename(columns = lambda x:x.strip())
#保存数据,如果服务器挂掉重新跑一边但不要跑这段代码
# output_file_path = '/data/bigfiles/房产信息_预处理.xlsx'
# data.to_excel(output_file_path,index=False)

2、数据分析

(1)读取预处理后的文件

#不要运行
#input_dir='/data/bigfiles/房产信息_预处理.xlsx'
#data=pd.read_excel(input_dir)

(2)利用二八原则,划分训练集和测试集

#二分原则为80%为样例数据作为模型训练集20%为样本数据作为测试集检查估计能力
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
 
from sklearn.model_selection import train_test_split #划分测试集与训练集
from sklearn.linear_model import LinearRegression as LR #回归模块
##在ipy中显示图像
%matplotlib inline
#设置绘图显示中文字体
plt.rcParams['font.sans-serif']=['SimHei']
pd.set_option('display.max_columns', None)
 
 
print(data.columns)
 
#特征提取
total_price=data.总价
unit_price=data.单价
house_area=data.面积
house_type=data[['0室0厅', '0室1厅', '1室0厅', '1室1厅', '1室2厅', '2室0厅', '2室1厅',
       '2室2厅', '3室0厅', '3室1厅', '3室2厅', '3室3厅', '3室4厅', '4室0厅', '4室1厅', '4室2厅',
       '4室3厅', '4室4厅', '5室0厅', '5室1厅', '5室2厅', '5室3厅', '5室4厅', '6室1厅', '6室2厅',
       '6室3厅', '6室4厅', '6室5厅', '7室1厅', '7室2厅', '7室3厅', '7室4厅', '7室5厅', '8室2厅',
       '8室3厅', '9室2厅']]
region=data[['双流', '大邑' ,'天府新区' ,'天府新区南区', '彭州', '新津', '新都', '武侯' ,'温江', '简阳', '蒲江', '郫都' ,'都江堰',
 '金堂' ,'金牛', '锦江', '青白江' ,'青羊' ,'高新', '高新西', '龙泉驿']]
house_class= data[['塔楼','板塔结合','板楼']]
house_layer=data[['低楼层','中楼层','高楼层']]
house_dirt=data[['东','南','西','北','东北','东南','西南','西北']]
total_layer=data.总楼层
# 选择自变量与因变量
X = pd.concat([house_area,house_type,region,house_class,house_layer,house_dirt,total_layer],axis=1)
Y = unit_price
print(type(X))
X = X.fillna(0)
#划分测试集与训练集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)

(3)建立多元回归模型

reg=LR().fit(Xtrain,Ytrain)#这里其实就是建立模型把训练的值放进去返回一个拟合对象
#预测
Yhat=reg.predict(Xtest)
#查看回归系数
print(list(zip(X.columns,reg.coef_)))
#查看截距
print(reg.intercept_)

(4)计算估计值

from sklearn.metrics import mean_squared_error #MSE
from sklearn.metrics import mean_absolute_error #MAE
from sklearn.metrics import r2_score #R2
mse= mean_squared_error(Ytest,Yhat)
mae= mean_absolute_error(Ytest,Yhat)
r2=r2_score(Ytest,Yhat)
#调整R2
n=Xtest.shape[0]
k=Xtest.shape[1]
adj_r2=1-(1-r2)*((n-1)/(n-k-1))

(5)判断模型拟合的好坏程度

print('MSE:'+str(mse))
print('MAE:'+str(mae))
print('R2:'+str(r2))
print('调整后R2:'+str(adj_r2))

3、数据可视化

(1)将训练集真实值与模型预测值用折线图的形式表现出来


#绘制前50条记录
n=50
#绘制模型预测值
plt.plot(range(len(Yhat[:n])),Yhat[:n])
#绘制模型真实值
plt.plot(range(len(Ytrain[:n])),Ytrain[:n])
#图形设置
plt.xlabel('个例')
plt.ylabel('单价')
plt.title('线性回归预测结果')
plt.legend(["预估","实际"])

(2)将测试集真实值与模型预测值用折线图的形式表现出来

#绘制前50条记录
n=50
#绘制模型预测值
plt.plot(range(len(Yhat[:n])),Yhat[:n])
#绘制模型真实值
plt.plot(range(len(Ytest[:n])),Ytest[:n])
#图形设置
plt.xlabel('个例')
plt.ylabel('单价')
plt.title('线性回归预测结果')
plt.legend(["预估","实际"])

标签:map,基于,plt,估价,楼层,pd,房产,data,lambda
From: https://www.cnblogs.com/whwh/p/18150164

相关文章

  • 如何基于Django中的WebSockets和异步视图来实现实时通信功能
    本文分享自华为云社区《结合Django中的WebSockets和异步视图实现实时通信功能的完整指南》,作者:柠檬味拥抱。在现代Web应用程序中,实时通信已经成为了必不可少的功能之一。无论是在线聊天、实时数据更新还是实时通知,都需要通过实时通信技术来实现。Django作为一个强大的Web框架,提......
  • C#的基于.net framework的Dll模块编程(一) - 编程手把手系列文章
    从此博文开始分几篇介绍C#的开发。这次讲讲C#的.netframework的Dll文件类库模块的编程方法。对于Windows来说,要运行应用程序要基于Dll类库和Exe执行文件。对于笔者来说,模块化的编程方式,就是将一些函数等封装到Dll类库文件中,将这些类库集中和分模块进行编写和管理。就是......
  • LLM开源小工具(基于代码库快速学习/纯shell调用LLM灵活管理系统)
    随着AI的各种信息的发展,LLM各种模型不断涌现,作为一名IT人员不得不向前走,不断探索学习发现新知识。随着学习,也了解到一些对于模型的调用,从而解决一些问题,或者对已有工具或应用的重写。如下是两个小工具介绍:QA-Pilot 是一个基于github开放的代码库进行对话式学习使用的工具(目前......
  • 基于python语言命令行模式的nmap扫描- python-nmap
    使用python命令行模式进行nmap扫描,简化流程首先安装python环境https://www.python.org/downloads/安装nmap,python-nmap需要借助nmap运行https://nmap.org/download写python-nmap脚本https://github.com/home-assistant-libs/python-nmap代码:点击查看代码......
  • Django不显示CSS的效果(基于Django模板的静态资源配置问题)
    在搞毕设过程中,习惯起见我直接在网上找了现成的前端设计页面,如图:这种前端项目的结构一般是一个login.html、一个style.css、一个背景图片即可搞定的,直接点击html,浏览器中打开的就是上图所示的界面效果。但是:当我把前端所有文件扔进DjangoApp的templates文件夹后,运行项目的效果......
  • 基于resnet50的糖尿病视网膜分类-messidor数据集
    1importos2importtorch3fromtorchvisionimportdatasets,transforms4fromtorch.utils.dataimportDataLoader,SubsetRandomSampler56importtorch7fromtorchimportnn8fromtorch.utils.dataimportDataLoader,Dataset9import......
  • 3月30日成功举办——基于实在智能RPA的微信私域自动化运营公开课
    3月30日,RPA学习天地成功举办了,基于微信私域运营的RPA自动化直播公开课,成功地帮助学员们普及了社交化工具私域运营的自动化技巧。 本次公开课,主要介绍了如何使用实在智能RPA工具来自动化实现微信的好友添加,建群,群发信息等私域互动信息,受到了观众的好评。以下为公开课部分精彩......
  • 1月20日,RPA 学习天地成功举办基于弘玑RPA公开课,让更多人用上RPA,用好RPA!
    1月20日,RPA学习天地成功举办了,基于弘玑CycloneRPA工具直播公开课,成功地帮助学员们初步了解了弘玑CycloneRPA的特色。  本次公开课,主要介绍了如何弘玑CycloneRPA工具来实现在中国执行信息公开网批量查询失信被执行的公司及个人的信息,并实现自动化保存的自动化流程。 RPA学......
  • m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
    1.算法仿真效果VIVADO2019.2仿真结果如下:   系统RTL结构如下:   2.算法涉及理论知识概要       多通道FIR(FiniteImpulseResponse)滤波器是一种在数字信号处理中广泛应用的线性时不变滤波技术,尤其适用于多通道音频、视频、图像等多维数据的处理。   ......
  • 基于事件驱动的测试框架ETS
    ETS(Event-drivenTestSystem)是一种基于事件驱动的测试框架,它可以用于自动化测试和软件质量保障。ETS的生命周期包括测试计划、测试设计、测试实现、测试执行和测试报告等阶段。本文将通过代码示例和图表的形式详细介绍ETS生命周期的各个阶段。测试计划在测试计划阶段,我们需要明......