最新可视化小项目-全国房价分析_全国房价分析pandas(1),【架构师必备】

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

def get_local_time_string():
“”"
返回形如"2021-04-09"这样的时间字符串
“”"
current = time.localtime()
return time.strftime(“%Y-%m-%d”, current)


价格等维度



def get_price_info(self, city_name):
    self.city_name = city_name
    self.price_info_list = list()

    target_web = 'http://{0}.fang.ke.com/loupan/'.format(city_name)
    print('request target web:', target_web)

    # 获得请求头部
    headers = create_request_headers()

    # 发起网页请求(获取总页数)
    response = requests.get(target_web, timeout=10, headers=headers)
    html = response.content
    soup = BeautifulSoup(html, 'lxml')

    # 获得response总页数
    try:
        page_box = soup.find_all('div', class_='page-box')[0]
        matches = re.search(r'.*data-total-count="(\d+)".*', str(page_box))
        total_page = int(math.ceil(int(matches.group(1)) / 10))
        # total_page = 2 测试
    except Exception as e:
        print("warning: only find one page for {0}".format(city_name))
        print(e)

    print('total pages:', total_page)
    headers = create_request_headers()
    # 遍历房价网页
    # for i in range(1, total_page + 1) :
    for i in range(1, total_page + 1):
        target_sub_web = target_web + "pg{0}".format(i)
        print('request target web:', target_sub_web)

        if True == RANDOM_DELAY:
            # 随机延时(0-15)秒
            random_delay = random.randint(0, DELAY_MAX + 1)
            print('random delay: %s S...' % (random_delay))
            time.sleep(random_delay)

        # 发起网页请求
        response = requests.get(target_sub_web, timeout=10, headers=headers)
        html = response.content
        soup = BeautifulSoup(html, 'lxml')

        # 获取房价相关内容
        house_contents = soup.find_all("li", class_="resblock-list")
        for house_content in house_contents:
            # 获取单价
            house_price = house_content.find("span", class_="number")
            # 获取总价
            house_total = house_content.find("div", class_="second")
            # 获取小区名称
            house_name = house_content.find("a", class_="name")

 部分价格可能会出现无的情况,采用try捕获异常



try:
price = house_price.text.strip()
except Exception as e:
price = “0”

            # 整理小区名称数据
            name = house_name.text.replace("\n", " ")

            # 整理总价数据
            try:
                total = house_total.text.strip().replace(u"总价", " ")
                total = total.replace(u"/套起", " ")
            except Exception as e:
                total = "0"

 格式化存储数据信息



def store_price_info(self):
# 创建数据存储目录
root_path = get_root_path()
store_dir_path = root_path + “/data/original_data/{0}”.format(self.city_name)
is_dir_exit = os.path.exists(store_dir_path)
if not is_dir_exit:
os.makedirs(store_dir_path)

    # 存储格式化的房价数据到相应日期的文件中
    store_path = store_dir_path + "/{0}.csv".format(get_local_time_string())
    with open(store_path, "w", encoding='utf-8') as fd:
        fd.write("data,name,price,total,address,address1,adress2\n")
        for price in self.price_info_list:
            fd.write(price)

### 2.3 爬取数据



if name == ‘main’:
# ‘cd’,‘cq’,‘cs’, ‘wh’, ‘hz’, ‘xa’, ‘tj’, ‘su’, ‘nj’
# , ‘zz’, ‘dg’, ‘sy’, 爬取完毕
city_list = [‘qd’, ‘fs’]
for city in city_list:
try:
# 创建贝壳网爬虫实例
spider = beike_spider()
# 获取网页房价数据
spider.get_price_info(city) # # http://xa.fang.ke.com/,各地区的贝壳房价,自行查看拼音简写
# 存储房价数据bj
spider.store_price_info()
print(“数据写入完毕”)
except:
print(“---------------------------”)
with open(city + “_log.txt”, ‘w’) as fl:
fl.write(city + “爬取过程中出现问题”)
print(“%s爬取过程中出现问题!” % city)
print(“---------------------------”)


##  3.数据清洗


 数据清洗主要包括数据去重,空值填充,异常值处理三部分:


### 3.1 数据去重


在爬虫爬取数据过程中,由于网站数据本身会重复或爬虫本身的原因,往往会出现重复数据,针对重复数据,直接采用drop\_duplicates()方法即可。



df.drop_duplicates(subset=[‘A’,‘B’],keep=‘first’,inplace=True)


**主要参数:**


**subset:** 输入要进行去重的列名,默认为None


**keep:**可选参数有三个:‘**first’、 ‘last’、 False**, 默认值 ‘first’。其中,


1. **first表示: 保留第一次出现的重复行,删除后面的重复行。**
2. **last表示: 删除重复项,保留最后一次出现。**
3. **False表示: 删除所有重复项。**


**inplace:**布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。


在实际使用过程中,一般不考虑参数情况,有需要,进行合适参数书写即可。



cd_data = cd_data.drop_duplicates()


### 3.2 空值填充


pandas中fillna()方法,能够使用指定的方法填充NA/NaN值。



df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)


**主要参数:**


**value:**用于填充的空值的值。


**method:**{'backfill', 'bfill', 'pad', 'ffill', None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值。


**axis:**轴。只可以为0或者1。0或'index',即按行删除;1或'columns',即按列删除。


**inplace:**是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。


**limit:**int,默认为空。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)


**downcast:**dict,默认为空,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。


针对本次数据的空值填充,在爬虫阶段已经将空值填充为“价格未定”,需要对此做出处理:


在此将“价格未定”修改为1,为了方便将其转化为数值型数据处理。



county_price = cd_data[cd_data[‘address’] == county][‘price’].str.strip().replace(‘价格待定’, ‘1’)


### 3.3 异常值处理


参见:<https://www.cnblogs.com/tinglele527/p/11955103.html>


常用的方法为盒图以及拉依达准则,盒图可以参考:<https://blog.csdn.net/qq_37272891/article/details/115625658?spm=1001.2014.3001.5501>


针对异常值常常采用


**1.直接去除:**可能会造成数据缺失。


**2.平均值或模型填充:**根据异常数据的情况,采用平均值或者拉格朗日插值法,异或数据符合的模型进行填充。


**3.实际值填充:**如果异常值多的情况下,会非常浪费时间与经理


针对本次数据的数据过程中,不需要进行过多复杂操作,因为本次数据分析需求简单,而且本次数据的异常值极大值比较奇怪,但是符合实际情况。极小值与实际不符


首先做一个简单筛选:



print(county_price[county_price<1000])


发现存在着数据即price<2000的情况,对于新一线城市而言,十分不符合常理。


![](https://img-blog.csdnimg.cn/20210425004829186.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MjcyODkx,size_16,color_FFFFFF,t_70)


因此在数据处理过程中需要将其去除,筛掉不符合的小数据即可。


## 4.数据分析


以成都数据为例,结合数据清洗情况,进行合适的分析(本次将数据清洗涵盖在了一下代码中)。



#!/usr/bin/python3.9

-- coding: utf-8 --

Copyright © 2021

@Time : 2021/4/15 8:51

@Author : # @Email : # @File : fangke_data_analysis_g1.py

@Software: PyCharm

“”"
成都各区域新开楼盘平均房价
数据源:房客网4.13号数据新开楼盘前100页
分析人 xxx
结论
建议
“”"
import os

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

import os

[外链图片转存中…(img-BlTcYnPj-1715877426361)]
[外链图片转存中…(img-7hdRT3vL-1715877426361)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值