导包
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
os.chdir(r'D:\CodeProject\03data_processing_analysis\teacher_project') # 改变当前的工作目录. change current work directory
加载数据
# 1. 加载数据
df = pd.read_csv('data/LJdata.csv')
df.head()
# 2. 我们发现列名是中文的, 为了操作方便, 我们将其改成 英文列名.
df.columns = ['district', 'address', 'title', 'house_type', 'area', 'price', 'floor', 'build_time', 'direction', 'update_time', 'view_num', 'extra_info', 'link']
# 3. 查看修改后的列名
df.columns
# 4. 查看处理后的数据
df.head()
# 5. 简单了解下数据集.
df.shape # 维度 => 行列数, (2760, 13)
df.info() # 基本信息
df.describe() # 统计信息
统计分析
找出最近最低, 最高的
# 方式1: 比较运算符 实现.
# 1. 找到最低, 最高租金.
df.price.min() # 1300
df.price.max() # 210000
# 2. 根据上述的租金, 找到对应的 行(就是我们要的数据)
df[df.price == 1300]
df[df.price == 210000]
# 3. 用函数, 来替换上述的固定值, 使得代码更加灵活.
df[df.price == df.price.min()]
df[df.price == df.price.max()]
# 方式2: 通过 sort_values()排序 结合 head(), tail()实现.
# 根据价格升序排列, 然后获取对应数据即可.
df.sort_values('price').head(1) # 租金最低
df.sort_values('price').tail(1) # 租金最高
# 方式3: nlargest() 和 nsmallest()实现.
df.nsmallest(1, 'price') # 租金最低
df.nlargest(1, 'price') # 租金最高
最近新上的10套房源
# 方式1: sort_values()排序 + head(), tail()
df.sort_values('update_time', ascending=False).head(10)
df.sort_values('update_time').tail(10)
# 方式2: nlargest() 和 nsmallest()
df.nlargest(10, 'update_time') # 报错, update_time列是字符串, 不是数值列, 不能使用该函数.
查看所有的更新时间
# 方式1: unique()函数, 去重实现.
df.update_time.unique()
# 方式2: Series对象的 drop_duplicates()函数
df.update_time.drop_duplicates()
# 方式3: 分组统计, 去重
df.groupby('update_time', as_index=False).district.count().update_time
# 方式4: DataFrame对象的 drop_duplicates()函数
df.drop_duplicates('update_time').update_time
统计看房人数
# 1. 看房人数的最小值.
df.view_num.min() # 0
# 2. 看房人数的最大值.
df.view_num.max() # 122
# 3. 看房人数的中位数.
df.view_num.median() # 10
# 4. 验真
df.describe()
# 进阶需求: 不同看房人数的房源数量. 例如: 1个人看过的, 有几套房子. 10个人看过的, 有几套房子.
# as_index=False => 不把分组字段 作为 索引列
tmp_df = df.groupby('view_num', as_index=False).district.count()
# 改列名
# tmp_df.columns = ['看房人数', '房源数量']
tmp_df.columns = ['view_num', 'house_num']
tmp_df
图表展示上述内容
tmp_df.house_num.plot(kind='bar', figsize=(20, 10)) # 柱状图, 宽高
查看房租的价格分布
# 1. 房租的 平均值.
df.price.mean()
# 2. 最大值, 最小值, 中位数, 标准差, 方差
df.price.max()
df.price.min()
df.price.median()
df.price.std()
df.price.var()
看房人数最多的朝向
# 1. 统计每个朝向 有多少人看过.
tmp_df = df.groupby('direction', as_index=False).view_num.sum()
# 2. 找到看房人数最多的朝向.
tmp_df[tmp_df.view_num == tmp_df.view_num.max()]
tmp_df.sort_values('view_num', ascending=False).head(1)
tmp_df.sort_values('view_num').tail(1)
tmp_df.nlargest(1, 'view_num')
# 3. 合并版. 链式编程 = 如果一个函数的返回结果是1个对象, 那么我们可以在其后继续通过 .函数名() 的方式调用函数, 这种写法就叫: 链式编程.
df.groupby('direction', as_index=False).view_num.sum().nlargest(1, 'view_num')
房型分布情况
# 1. 统计各种房型, 分别有多少套.
tmp_df = df.groupby('house_type').district.count()
# 2. 修改列名
# tmp_df.columns = ['house_type', 'house_num']
# 把 Series对象 => DataFrame对象, 然后修改列名, 这个动作选做, 不做也不影响结果.
# tmp_df = tmp_df.to_frame()
# tmp_df.columns = ['house_num']
# 3. 查看结果
tmp_df
# 4. 绘制柱状图
tmp_df.plot(kind='bar', figsize=(20, 10)) # 柱状图, 宽高
最受欢迎的房型
# 思路: 找到 各房型看房总人数, 从中找到 看房人数最多的房型.
# 细节1: 分组统计时, 传入不同的参数, 获取对象也不同.
# df.groupby('house_type')['view_num'].sum() # Series对象
df.groupby('house_type')[['view_num']].sum() # df对象
df.groupby('house_type')[['view_num']].sum().nlargest(1, 'view_num')
# 方式2: 设置分组列 不作为索引列.
df.groupby('house_type', as_index=False)['view_num'].sum().nlargest(1, 'view_num')
房子的平均租房价格
# 思路1: 总的价格 / 总的面积, 不考虑权重.
df.price.sum() # 20895410
df.area.sum() # 241938
df.price.sum() / df.area.sum() # 86.36679645198356
# 思路2: 计算每套房子的 每平米的租金, 然后计算所有所有房子 租金/平米 的平均值.
# 新增一列
df['price_m2'] = df.price / df.area
# 最终计算 所有房子的 每平米租金 的平均值.
df.price_m2.mean() # 87.72268429900454
热门小区
# 大白话翻译: 看房人数多的小区 = 热门小区
# 1. 计算每个小区的看房人数.
tmp_df = df.groupby('address', as_index=False)['view_num'].sum()
# 2. 改列名
tmp_df.columns = ['address', 'count']
# 3. 根据count排序, 找到前10个.
tmp_df.nlargest(10, 'count')
tmp_df.sort_values('count', ascending=False).head(10)
房源最多的小区
# 大白话解释: 数据集中 哪个小区 房子最多
# 方式1: 传统的分组统计.
# 1. 找到每个小区的房源数量.
tmp_df = df.groupby('address', as_index=False).district.count()
# 2. 修改列名
tmp_df.columns = ['address', 'count']
# 3. 按照房源数量排序, 取第1个.
tmp_df.sort_values('count', ascending=False).head(1)
tmp_df.nlargest(1, 'count')
# 方式2: 直接使用 value_counts()函数
df.address.value_counts()
df.address.value_counts().head(1)