欢迎来到CloudService文涵的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

基于大数据的房产估价

一、实验目的与要求

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

二、实验内容

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

三、实验步骤

最后有截图

1.数据预处理

(1)导入所需要使用的包(一起执行)

import os 
import re 
import matplotlib as mpl
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
from sklearn.metrics import r2_score

(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))
data = pd.concat(data_list)
len(data)

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

data.describe()

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

data = data.reset_index()  
data = data.drop("index",axis=1)

(5)处理空值(几行在一起的就一起执行,单行的分开执行)

data.head()

msg = data.房屋信息.map(lambda x : len(x.split('|')))  
msg.value_counts()  

data = data[msg == 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.head()

data.楼层.unique()

data = data[data.楼层.str.contains('楼层')]

data.loc[:,'所在楼层'] = data.楼层.map(lambda x : x.split('(')[0]) 
data.loc[:,'总楼层'] = data.楼层.map(lambda x : x.split('(')[-1])

(data.isnull()).sum()

(data.duplicated()).sum()

data = data.drop_duplicates()

len(data)

(6)删除部分数据的中文字符,将数据类型转换为float型(几行在一起的就一起执行,单行的分开执行)

data.总价 = data.总价.map(lambda x : re.sub('[\u4e00-\u9fa5].*','',x))
data.总价 = data.总价.map(lambda x : float(x))
data.面积 = data.面积.map(lambda x : re.sub('[\u4e00-\u9fa5].*','',x))
data.面积 = data.面积.map(lambda x : float(x))

data.单价 = data.单价.map(lambda x : re.sub('[\u4e00-\u9fa5]','',x))
data.单价 = data.单价.map(lambda x : re.sub('/','',x))
data.单价 = data.单价.map(lambda x : float(x))

data.建成时间.unique()

data = data[data.建成时间.str.contains('年建')]
data.建成时间 = data.建成时间.map(lambda x : re.sub('[\u4e00-\u9fa5]','',x))
data.建成时间 = data.建成时间.map(lambda x : int(x))

data.总楼层.unique()

data.总楼层 = data.总楼层.map(lambda x : re.sub('[\u4e00-\u9fa5]','',x))
data.总楼层 = data.总楼层.map(lambda x : re.sub('\)','',x))
data.总楼层 = data.总楼层.map(lambda x : int(x))

data.head()

(7)对部分数据进行独热码编码(几行在一起的就一起执行,单行的分开执行)

data.户型.unique()

data = data.join(pd.get_dummies(data.户型))
data = data.drop('户型', axis = 1)

data.区域.unique()

data = data.join(pd.get_dummies(data.区域))
data = data.drop('区域', axis = 1)

data.类型.unique()

data = data.join(pd.get_dummies(data.类型))
data = data.drop('类型', axis = 1)

data.结构.unique()

data = data.drop(data[data.结构 == ' 暂无数据'].index)

data = data.join(pd.get_dummies(data.结构))
data = data.drop('结构', axis = 1)

data.所在楼层.unique()

data = data.join(pd.get_dummies(data.所在楼层))
data = data.drop('所在楼层', axis = 1)

data = data.reset_index()  
data = data.drop("index",axis=1)

len(data)

def my_get_dummies(house_dir):
    base_dirt = ['东', '南', '西', '北', '东北', '东南', '西南', '西北']
    base_data = np.zeros((len(house_dir),), dtype=np.int)
    dir_one_hot = pd.DataFrame({'东':base_data,'南':base_data,'西':base_data, '北':base_data,'东北':base_data, '东南':base_data,'西南':base_data, '西北':base_data},index=house_dir.index)
    for i in house_dir.index:
        # 分隔字符串
        dir_msg = house_dir[i].strip().split(' ')
        # 遍历每条记录分隔后的方位
        for j in dir_msg:
            dir_one_hot.loc[i,str(j)] = 1      
    return dir_one_hot

df = my_get_dummies(data.朝向)

data = data.join(df,lsuffix='_left',rsuffix='_right')

data = data.drop('朝向',axis = 1)

image

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

data.to_csv('/data.csv')

2、数据分析

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

data = pd.read_csv('/data.csv')

(2)利用二八原则,划分训练集和测试集(几行在一起的就一起执行,单行的分开执行)

data.columns

X = 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厅 ', '7室1厅 ', '7室2厅 ', '7室3厅 ', '7室4厅 ', '7室5厅 ', '8室2厅 ',
       '8室3厅 ', '9室2厅 ', '双流', '大邑', '天府新区', '天府新区南区', '彭州', '新津', '新都', '武侯',
       '温江', '简阳', '蒲江', '郫都', '都江堰', '金堂', '金牛', '锦江', '青白江', '青羊', '高新',
       '高新西', '龙泉驿', ' 其他 ', ' 毛坯 ', ' 简装 ', ' 精装 ', ' 塔楼', ' 平房', ' 板塔结合',
       ' 板楼', ' 中楼层', ' 低楼层', ' 高楼层', '东', '南', '西', '北', '东北', '东南', '西南',
       '西北']]
Y = data.单价

Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2, random_state=10)

(3)建立多元回归模型

reg = LR().fit(Xtrain, Ytrain)

(4)计算估计值

yhat = reg.predict(Xtest)

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

r2_score(Ytest, yhat) 

3、数据可视化

(1)将训练集真实值与模型预测值用折线图的形式表现出来(复制代码一起执行,不分开执行)


mpl.rcParams["font.sans-serif"]="SimHei" #设置字体样式
mpl.rcParams["axes.unicode_minus"]=False #设置为字符显示

yhat_1 = reg.predict(Xtrain)
# 绘制前n条记录
n = 50
# 绘制模型估计值
plt.plot(range(len(yhat_1[:n])),yhat_1[:n])
# 绘制模型实际值
plt.plot(range(len(yhat_1[:n])),Ytrain[:n])

# 图形设置
plt.xlabel('个例')
plt.ylabel('单价')
plt.title('线性回归预测结果')
plt.legend(["预估","实际"])

(2)将测试集真实值与模型预测值用折线图的形式表现出来(复制代码一起执行,不分开执行)

mpl.rcParams["font.sans-serif"]="SimHei" #设置字体样式
mpl.rcParams["axes.unicode_minus"]=False #设置为字符显示

# 绘制前n条记录
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(["预估","实际"])

一定记得写:感想:通过这次实验,我学会了。。。。。。

image

posted on 2024-04-22 10:42  Cloudservice  阅读(1036)  评论(0编辑  收藏  举报