载入数据:
import pandas as pd
lj_data = pd.read_csv('../data/excel_data/LJdata.csv')
lj_data
把列名替换成英文:
#原始列名
print(lj_data.columns)
#Index(['区域', '地址', '标题', '户型', '面积', '价格', '楼层', '建造时间', '朝向', '更新时间', '看房人数','备注', '链接地址'],dtype='object')
lj_data.columns = ['district', 'address', 'title', 'house_type', 'area', 'price', 'floor', 'build_time', 'direction', 'update_time', 'view_num', 'extra_info', 'link']
lj_data.columns
查看数据基本情况:
最贵和最便宜的房子:
lj_data.loc[lj_data['price']==210000]
lj_data.loc[lj_data['price']==1300]
lj_data[lj_data['price']==lj_data['price'].min()]
lj_data[lj_data['price']==lj_data['price'].max()]
lj_data.sort_values(by='price').head(1)
lj_data.sort_values(by='price').tail(1)
找到最近新上的10套房子:
lj_data.sort_values(by='update_time', ascending=False).head(10)
#查看所有更新时间
lj_data['update_time'].unique()
看房人数:
lj_data['view_num'].mean() #平均值
lj_data['view_num'].median() #中位数
# 不同看房人数的房源数量
tmp_df =lj_data['view_num'].value_counts().to_frame().reset_index()
tmp_df.columns = ['view_num', 'count']
tmp_df.sort_values(by='view_num', inplace=True)
tmp_df.head()
#画图
%matplotlib inline
tmp_df['count'].plot(kind='bar',figsize=(20,10))
房龄最小的10套房子的平均看房人数、平均面积 :
def get_front_4_num(x):
try:
return int(x[:4])
except:
return -1
lj_data.loc[:,'house_age'] = 2019-lj_data['build_time'].apply(get_front_4_num)
#面积空值判断
lj_data = lj_data[lj_data['area'].notnull()]
#截取面积数值部分
lj_data.loc[:,'area'] = lj_data['area'].apply(lambda x: x[:-2]).apply(lambda x:float(x))
#计算平均值
房子价格的分布:
import numpy as np
print(lj_data['price'].mean()) #平均值
print(lj_data['price'].std()) #方差
print(lj_data['price'].median()) #中位数
看房人数最多的朝向:
popular_direction = lj_data.groupby('direction')[['view_num']].sum()
popular_direction = popular_direction.reset_index()
popular_direction[popular_direction['view_num']==popular_direction['view_num'].max()]
房型分布情况:
house_type_dis = lj_data.groupby(['house_type']).count()
%matplotlib inline
house_type_dis['district'].plot(kind='pie') #饼图
house_type_dis['district'].plot(kind='bar') #柱状图
最受欢迎的房型:
tmp = lj_data.groupby('house_type').agg({'view_num':'sum'})
tmp = tmp.reset_index()
tmp[tmp['view_num']==tmp['view_num'].max()]
房子的平均租房价格 (元/平米):
lj_data.loc[:,'price_per_m2'] = lj_data['price']/lj_data['area']
lj_data['price_per_m2'].mean()
热门小区:
address_df = lj_data[['address','view_num']].groupby(['address']).sum()
address_df = address_df.reset_index()
address_df.sort_values(by='view_num', ascending=False)
出租房源最多的小区:
tmp_df2 = lj_data[['address','view_num']].groupby(['address']).count()
tmp_df2 = tmp_df2.reset_index()
tmp_df2.columns = ['address','count']
tmp_df2.nlargest(columns='count', n=1)
集中供暖 平均价格:
不同房型的平均/最大/最小面积:
house_type_info = lj_data[['house_type','area']].groupby("house_type")\
.agg({"area":{'mean','max', 'min'}})
哪个地铁口附近房源最多:
import re
#距离14号线(东段)东湖渠站731米 随时看房 精装修 集中供暖
def find_sub_station(x):
try:
return re.search(pattern="(.+号线)(.+站)([0-9]+)米", string=x).group(2)
except:
return None
lj_data.loc[:,'sub_station'] = lj_data['extra_info'].apply(find_sub_station)
#统计
lj_data[['sub_station','link']].groupby('sub_station').count()
是否有地铁 价格比较:
def has_sub_station(x):
return 1 if "距离" in x else 0
lj_data.loc[:,'has_sub_station'] = lj_data['extra_info'].apply(has_sub_station)
lj_data[['has_sub_station','price']].groupby('has_sub_station').agg('mean')
地铁附近房源距离地铁平均距离:
#距离14号线(东段)东湖渠站731米 随时看房 精装修 集中供暖
def cal_sub_station_distance(x):
try:
return int(re.search(pattern="(.+号线)(.+站)([0-9]+)米", string=x).group(3))
except:
return None
lj_data.loc[:,'distance'] = lj_data['extra_info'].apply(cal_sub_station_distance)
lj_data['distance'].mean()
在租房源楼层情况:
def get_floor(x):
if '低楼层' in x:
return '低楼层'
elif '中楼层' in x:
return '中楼层'
else:
return '高楼层'
lj_data.loc[:,'floor'] = lj_data['floor'].apply(get_floor)