链家网二手房数据分析(承接上篇爬虫)

时间:2023-02-21 07:50:44
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签

path='F:/python/从零开始学python网络爬虫/链家网/lianjia-3.xls'
lj=pd.read_excel(path)
''' 对整体数据预览,做个大概统计 '''
print(lj.head())#前5行
print(lj.tail())#后5行
print(lj.columns)#列序列
print(lj.index)#行索引
print(lj.values)#值
print(lj.describe())#汇总统计
print(lj[['面积(平方)','元每平方','价格(万)']])#提取某几列
print(lj[5:9])#切片提取某一段行
print(lj.duplicated())#是否是重复行
print(lj.drop_duplicates())#去重(其实没有重复的)
''' 单独对价格(万)分析,平均值,排序 散点图,价格区间-数量直方图 '''
print(lj['价格(万)'])#提取列,Series格式
print(lj['价格(万)'].mean())#平均房价536.01万
print(lj['价格(万)'].max())#最高房价6480万
print(lj['价格(万)'].idxmax())#在第644行(最先出现的)
print(lj.iloc[644])#调取第644行
print(lj['价格(万)'].min())#最低140万
print(lj['价格(万)'].idxmin())#在第579行(最先出现的)
print(lj.iloc[579])#调取第579行
print(lj['价格(万)'].count())#非nan值的数量
print(lj['价格(万)'].value_counts())#360万出现次数最多
print(lj['价格(万)'].sort_values())#按值排序
print(lj.sort_values(by='价格(万)'))#通过价格(万)排序
print(lj['价格(万)'].sort_values(ascending=False))#按值排序(降序)
print(lj['价格(万)'][lj['价格(万)']==1620])#提取所有价格为1620万
print(lj[lj['价格(万)']==1620])#提取所有价格为1620万
a=lj['价格(万)']
plt.scatter(np.arange(1197),a[a<3000].values,s=2,c='r',label='价格(万)')#小于3000万价格散点图
plt.axhline(200,color='k',alpha=0.4)#200万处画条线
plt.axhline(400,color='k',alpha=0.4)
plt.axhline(600,color='k',alpha=0.4)
plt.xlim([0,1200])
plt.yticks([0,200,400,600,800,1000,1500,2000,2500,3000])
plt.xlabel('索引')
plt.ylabel('价格(万)')
plt.title('价格(万)散点图')
plt.legend(loc='best')
fig=plt.figure()
ax=fig.add_subplot(111)
a[a<1500].hist(bins=20,color='g')#价格区间与区间内数量
ax.set_xticks([100,200,300,400,500,600,700,800,900,1000,1500])
plt.xlabel('价格(万)')
plt.ylabel('数量')
plt.title('不同区间价格(万)数量直方图')
plt.legend(loc='best')
''' 单独对面积每平方分析,均值,最大最小值,排序 元每平方散点图,元每平方价格区间-价格数量直方图 '''
print(lj['元每平方'])#提取列,Series格式
print(lj['元每平方'].mean())#平均价格65452.785元/平方
print(lj['元每平方'].max())#最高价格157828元/平方
print(lj['元每平方'].idxmax())#在第184行(最先出现的)
print(lj.iloc[184])#调取第15行
print(lj['元每平方'].min())#最低价格29032元/平方
print(lj['元每平方'].idxmin())#在第193行(最先出现的)
print(lj.iloc[193])#调取第193行
print(lj['元每平方'].count())#非nan值的数量
print(lj['元每平方'].value_counts())#83333出现次数最多
print(lj['元每平方'].sort_values())#按值排序
print(lj.sort_values(by='元每平方').head(10))
print(lj.sort_values(by='元每平方',ascending=False).head(10))
print(lj['元每平方'][lj['元每平方']==83333])#提取所有价格为36288元/平方
print(lj[lj['元每平方']==83333])#提取所有价格为36288元/平方
b=lj['元每平方']
fig=plt.figure()
ax=fig.add_subplot(111)
plt.scatter(np.arange(1200),b.values,s=4,c='r',label='元每平方')#部分价格散点图
plt.axhline(30000,color='k',alpha=0.5)#30000处画条线
plt.axhline(40000,color='k',alpha=0.5)
plt.axhline(60000,color='k',alpha=0.5)
plt.axhline(80000,color='k',alpha=0.5)
plt.xlim([0,1200])
plt.xlabel('索引')
plt.ylabel('元每平方')
plt.title('元每平方价格散点图')
plt.legend(loc='best')
fig=plt.figure()
ax=fig.add_subplot(111)
b.hist(bins=20,color='g')#元每平方价格区间-价格数量
ax.set_xticks([30000,40000,50000,60000,70000,80000,90000,100000,110000,120000,130000])
ax.set_xticklabels(['3万','4万','5万','6万','7万','8万','9万','10万','11万','12万','13万'],rotation=30)
plt.xlabel('元每平方')
plt.ylabel('数量')
plt.title('元每平方价格区间-价格数量直方图')
plt.legend(loc='best')
''' 对地区及不同地区出售二手房数量统计分析 '''
print(lj['地区'])#提取列
print(lj['地区'].value_counts())#按出现频次
c=lj['地区'].value_counts()
fig=plt.figure()
ax=fig.add_subplot(111)
rect=c.plot(kind='bar',color='y')#地区与房数量的柱状图
plt.xlabel('地区')
plt.ylabel('数量')
plt.title('不同地区出售二手房数量柱状图')
#上面不会在条形图上标数值,下面方法可以标数值
fig=plt.figure()
ax=fig.add_subplot(111)
x=np.arange(14)
y=c.values
rect=ax.bar(x,y)
for rec in rect:
    xx=rec.get_x()
    hh=rec.get_height()
    ax.text(xx+0.05,1.02*hh,str(int(hh)))
ax.set_xticks(x)
ax.set_xticklabels(c.index,rotation=30)
ax.set_xlabel('地区')
ax.set_ylabel('数量')
ax.set_title('不同地区出售二手房数量柱状图')
''' 单独对二手房面积统计分析,平均值,最大最小值,排序, 面积散点图,面积区间-二手房数量直方图 '''
print(lj['面积(平方)'])#提取列,Series格式
print(lj['面积(平方)'].mean())#平均面积79.49平方米
print(lj['面积(平方)'].max())#最大面积740.75平方米
print(lj['面积(平方)'].idxmax())#在第644行(最先出现的)
print(lj.iloc[644])#调取第644行
print(lj['面积(平方)'].min())#最小面积25.2平方米
print(lj['面积(平方)'].idxmin())#在第1026行(最先出现的)
print(lj.iloc[1026])#调取第1026行
print(lj['面积(平方)'].count())#非nan值的数量
print(lj['面积(平方)'].value_counts())#44出现次数最多
print(lj['面积(平方)'].sort_values())#按值排序
print(lj['面积(平方)'][lj['面积(平方)']==44])#提取所有面积为44平方米
print(lj[lj['面积(平方)']==44])#提取所有面积为44平方米
d=lj['面积(平方)']
fig=plt.figure()
ax=fig.add_subplot(111)
plt.scatter(np.arange(1200),d.values,s=4,c='r',label='面积(平方)')#部分面积散点图
plt.axhline(25,color='k',alpha=0.5)#50处画条线
plt.xlim([0,1200])
plt.ylim([0,400])
plt.xlabel('索引')
plt.ylabel('面积(平方)')
plt.title('二手房面积散点图')
plt.grid(True)
plt.legend(loc='best')
fig=plt.figure()
ax=fig.add_subplot(111)
d[d<350].hist(bins=30,color='g')#价格区间及出现频次
ax.set_xticks([25,50,75,100,125,150,175,200,250,300,350])
plt.axvline(40,color='k',alpha=0.4)
plt.axvline(70,color='k',alpha=0.4)
plt.xlabel('面积(平方)')
plt.ylabel('数量')
plt.title('二手房面积-数量直方图')
plt.legend(loc='best')
''' 面积与总价格多项式拟合曲线 '''
e=lj[lj['面积(平方)']<250]
x=e['面积(平方)']
y=e['价格(万)']
z1 = np.polyfit(x, y, 2)#多项式系数
p1 = np.poly1d(z1)#多项式方程
x1=np.linspace(x.min(),x.max(),1000)
pp1=p1(x1)#代入数值绘制曲线
fig=plt.figure()
ax=fig.add_subplot(111)
plt.scatter(x,y,color='b',label='散点图',s=1,alpha=0.5)#x,y散点图
#plt.plot(x,y,color='r',label='连线图')#x,y线形图
plt.plot(x1,pp1,color='k',label='拟合图')#100个x及对应y值绘制的曲线
plt.xlabel('面积(平方)')
plt.ylabel('价格(万)')
plt.title('面积与总价格多项式拟合曲线')
plt.legend(loc='best')
''' 各地区价格、数量统计 '''
f=lj[['价格(万)','地区']]
total=[]
diqus=['浦东','杨浦','徐汇','闵行','宝山','普陀','长宁','闸北','虹口','黄浦','松江','静安','嘉定','青浦']
for i in diqus:
    diqu=f[f['地区']==i]['价格(万)']
    shuliang=len(diqu)
    zuida=diqu.max()
    zuixiao=diqu.min()
    pingjun=int(diqu.mean())
    total.append({'地区':i,'数量(套)':shuliang,'最大(万)':zuida,'最小(万)':zuixiao,'平均(万)':pingjun})
print(total)
diqu_jiage=pd.DataFrame(total)
qudiqu=diqu_jiage.iloc[:,1:5].values
gediqu=pd.DataFrame(qudiqu,index=diqus,columns=['平均(万)','数量(套)','最大(万)','最小(万)'])
gediqu.plot()
fig=plt.figure()
ax=fig.add_subplot(111)
gediqu['平均(万)'].plot(xticks=range(14),style='go-',label='均价(万)')
ax.set_xticklabels(diqus,rotation=30)
ax.set_xlabel('地区')
ax.set_ylabel('价格(万)')
ax.set_title('不同地区-价格(万)')
ax.legend(loc='best')

g=lj[['元每平方','地区']]
total2=[]
diqus2=['浦东','杨浦','徐汇','闵行','宝山','普陀','长宁','闸北','虹口','黄浦','松江','静安','嘉定','青浦']
for ii in diqus2:
    diqu2=g[g['地区']==ii]['元每平方']
    pingjun2=int(diqu2.mean())
    total2.append({'地区':ii,'平均元每平方':pingjun2})
print(total2)
diqu_yuan=pd.DataFrame(total2)
fig=plt.figure()
ax=fig.add_subplot(111)
diqu_yuan['平均元每平方'].plot(xticks=range(14),style='bo-',label='元每平方')
ax.set_xticklabels(diqus2,rotation=30)
ax.set_xlabel('地区')
ax.set_ylabel('平均元每平方')
ax.set_title('不同地区-平均元每平方')
ax.legend(loc='best')