一、引入数据
1.1 引入相关包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
1.2 读入数据
#读入数据
# 考虑到文件编码方式的不同
data_list = []
for i in range(1,8):
try:
data = pd.read_csv('D:\Jupyter/fangchan/lianjia{}.csv'.format(i),encoding = 'gbk') #文件名前要写路径 .表示当前文件夹,i最后取代{} 编码方式是gbk的读取
except:
data = pd.read_csv('D:\Jupyter/fangchan/lianjia{}.csv'.format(i)) #如果文件编码方式不是gbk,为utf-8(默认),读取
finally:
#合并数据集 方法1
data_list.append(data)
data = pd.concat(data_list) #concat: 行叠加
1.3 查看数据
#查看数据都包含哪些部分
data.head(3)
#查看每列的数据类型
data.info()
二、数据预处理
目标:找出2012–2016年远洋山水这个小区的价格走势,进行房价走势预测
1 将数据中的nan值去掉
data.isnull().sum()
data1 = data[['cjdanjia','cjxiaoqu','cjshijian']]
data1.columns
data1.columns
data1.dropna(inplace = True)
len(data1)
处理cjdanjia
2 将成交单价中元/平 去掉
data1.cjdanjia = data1.cjdanjia.map(lambda x: x.replace('元/平',''))
data1
3 将成交单价转换为float类型
#****等价于
data1.cjdanjia = data1.cjdanjia.map(lambda x: float(x))
4 变为万元
#****等价于
data1.cjdanjia = data1.cjdanjia.map(lambda x: x/10000)
5 小数点后保留为小数点后1位
data1.cjdanjia = data1.cjdanjia.map(lambda x: round(x,1))
6 查看单价cjdanjia的一些性质
#查看最大值
data1.cjdanjia.max()
#查看最小值
data1.cjdanjia.min()
data1=data1[data1.cjdanjia>2] #去掉异常值
#将数据变成时间序列
data1.cjshijian=data1.cjshijian.map(lambda x:x[5:])
pd.to_datetime(data1.cjshijian) #pd.to_datetime 将数列变成时间序列
#获取远洋山水的成交记录
data = data1[data1.cjxiaoqu.str.contains('远洋山水')]
#将数据进行时间排序
data=data.sort_values( by = 'cjshijian') #按时间排序
pd.to_datetime(data.cjshijian)
#将cjshijian设置为index
data = data.set_index('cjshijian')
#取出2012年以后的数据
data = data['2012':]
预测问题
采用回归方法
目标是想找出2012–2016年远洋山水这个小区的价格走势,进行房价走势预测
#剔除异常值:价格>1才是有效数据
data =data[data.cjdanjia>1]
#处理数据:计算距离2012-01-01 的天数,并添加一列time
data = data.assign(time =(pd.to_datetime(data.index)-pd.to_datetime('20120101')).days) #距离2012的时间为time
#找出时间和价格的走势的情况
#目标:若了解2012到2016年远洋山水小区的价格走势,进行房价趋势预测。关注cjdanjia\cjshijian
data1 = data[['time','cjdanjia']]
plt.scatter(data1.time,data.cjdanjia) #自变量只有一个,一元回归 自变量多个:多元回归
from sklearn.linear_model import LinearRegression #引进线性回归模型
X = data1.time
Y =data1.cjdanjia
model = LinearRegression() #调用数据建模函数 建立模型 Y=AX+B
model.fit(pd.DataFrame(X),Y) #用实验数据训练模型求模型参数 A,B
x = [[0],[1800]]
y =model.predict(pd.DataFrame(x)) #利用模型进行预测 一下红色直线
plt.scatter(data1.time,data.cjdanjia)
plt.plot(x,y,c='r')
#多项式回归 非线性 用多项式无限逼近
model2=LinearRegression()
model2.fit(pd.DataFrame({'x2':X*X,'x1':X}),Y) #一元二次回归
x=np.linspace(0,1800)
y=model2.predict(pd.DataFrame({'x2':x*x,'x1':x}))
plt.scatter(data1.time,data.cjdanjia)
plt.plot(x,y,c='r')
from sklearn.preprocessing import PolynomialFeatures
q3=PolynomialFeatures(degree=3)
X3=q3.fit_transform(pd.DataFrame(X))
model3=LinearRegression()
model3.fit(X3,Y)
x=np.linspace(0,1800)
x_=q3.fit_transform(pd.DataFrame(x))
y=model3.predict(x_)
plt.scatter(data1.time,data.cjdanjia)
plt.plot(x,y,c='r')
模型评价
X_train,X_test = X[:'2016'],X['2016':]
Y_train,Y_test = Y[:'2016'],Y['2016':]
q3=PolynomialFeatures(degree=3)
X3=q3.fit_transform(pd.DataFrame(X_train))
model3=LinearRegression()
model3.fit(X3,Y_train)
X3_ =q3.fit_transform(pd.DataFrame(X_test))
Y_pre=model3.predict(X3_)
np.sum((Y_pre-Y_test)**2)
q4=PolynomialFeatures(degree=4)
X4=q4.fit_transform(pd.DataFrame(X_train))
model4=LinearRegression()
model4.fit(X4,Y_train)
X4_ =q4.fit_transform(pd.DataFrame(X_test))
Y_pre=model4.predict(X4_)
np.sum((Y_pre-Y_test)**2)