实验三:数据预处理1

题目要求

1.对你爬取下来的北京二手房数据,进行数据的预处理,并计算:

(1)四个区的平均总价、最高总价、最低总价;

(2)四个区的平均单价、最高单价、最低单价;

(3)按照房屋建成的年份,计算2000年以前、2000-2009.12.31、2010-至今,这三个时间段的平均单价。

2. 处理北京空气质量数据 

对HUMI、PRES、TEMP三列,进行线性插值处理。修改cbwd列中值为“cv”的单元格,其值用后项数据填充。

实验环境

1.系统:11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz   2.42 GHz

2.python+ pycharm

实验步骤

1、对北京二手房数据进行预处理,计算相应数据

  • 分别求四个区(海淀,朝阳,西城,东城)的平均总(单)价、最高总(单)价、最低总(单)价
  • 注:因为步骤相似,本文以海淀区为例子进行阐述;
  • 通过spiders爬虫,爬取 https://bj.lianjia.com/ershoufang/haidian/ 中小区名称、总价、房屋面积、房屋单价、房屋构造年份相关数据,存为lianjia-hd.json文件 
  • e21740d08de44590ad4b49da35ae72ee.png

    图1 海淀区二手房节选前50条(共3000)

  •  对lianjia-hd.json进行处理转换为hd1.csv文件
  • import csv
    import json
    def json_to_csv():
        json_file = open("lianjia-hd.json", "r",encoding='utf-8')  #输入需要转换格式的json文件
        csv_file = open("hd1.csv", "w")   #转换后的文件名和文件类型
        item_list = []
        for line in json_file:
            item_list.append(json.loads(line))
    
        key_data = item_list[0].keys()
        value_data = [item.values() for item in item_list]
    
        # csv文件写入对象
        csv_writer = csv.writer(csv_file)
        # 先写入表头字段数据
        csv_writer.writerow(key_data)
        # 再写入表的值数据
        csv_writer.writerows(value_data)
    
        csv_file.close()
        json_file.close()
    
    if __name__ == "__main__":
        json_to_csv()
  • 读取hd1.csv文件,进行数据处理以及提取需要的值;
  • import pandas as pd
    import numpy as np
    #读取hd1.csv文件
    df = pd.read_csv('hd1.csv')
    # 分别提取总价列数据,
    # 单价列数据
    # 两个数组
    totprice_hd = np.array(df['totalprice'])
    Unit_hd = np.array(df['Unitprice'])
    tot1_hd = []  #总价
    uni_hd = []  #单价
    # print(_totprice)
    #
    #遍历总价数组,将数据有字符串型str变为浮点型float;删除出数字以外的字符;
    for i in range(len(totprice_hd)):
        str = totprice_hd[i]
        pos = str.find("'")
        pos1 = str.find("万", pos + 1)
        str1 = str[pos + 1:pos1]
        tot1_hd.append(float(str1))
    
    #遍历单价数组,将数据有字符串型str变为浮点型float;删除出数字以外的字符;
    for j in range(len(Unit_hd)):
        str2 = Unit_hd[j]
        pos2 = str2.find("'")
        pos3 = str2.find("元", pos2 + 1)
        str3 = str2[pos2 + 1:pos3]
        str4 = str3.replace(',','') #去数据之间的逗号
        uni_hd.append(float(str4))
    
    
    tot1_hd.sort() #对总价数组进行排序
    print("总价列表从小到大排序(单位:万):\n",tot1_hd)
    print("海淀区\n平均总价:",np.mean(tot1_hd),"万","\n最高总价:",tot1_hd[-1],"万","\n最低总价:",tot1_hd[0],"万")
    
    uni_hd.sort()  #对单价数组进行排序
    print("单价列表从小到大排序(单位:元/平):\n",uni_hd)
    print("海淀区\n平均单价:",np.mean(uni_hd),"元/平","\n最高单价:",uni_hd[-1],"元/平","\n最低单价:",uni_hd[0],"元/平")
    
  • 打印出结果为:
  • 19dd3129eb564ee4b6acfef1a8a1dea6.png

    图2 海淀区相关数据

  •  由图2可知:海淀区相关数据;
  • 同海淀区操作步骤可得朝阳区、西城区、东城区数据如下图:
  • 2d2d80a39755485095f72161990e2de8.png

    图3 西城区、朝阳区相关数据

  • 6cbc2fddfc59487d963c23489bba492b.png

    图4 东城区相关数据

  •  数据汇总如下图:
  •  
    ac87dc6ffba24436a905277681f038a7.png

    图5 汇总数据

 2、处理北京空气质量数据

  • 读取BeijingPM20100101_20151231.csv文件进行处理
  • import pandas as pd
    print("开始处理数据。")
    data = pd.read_csv('BeijingPM20100101_20151231.csv',encoding='utf-8')
  • 对HUMI、PRES、TEMP三列,进行线性插值处理
  • # 对HUMI、PRES、TEMP三列,进行线性插值处理
    data['HUMI'] = data['HUMI'].interpolate()
    data['PRES'] = data['PRES'].interpolate()
    data['TEMP'] = data['TEMP'].interpolate()
    
  • 修改cbwd列中值为“cv”的单元格,其值用后项数据填充
  • # 修改cbwd列中值为“cv”的单元格,其值用后项数据填充。
    print("before",len(data[data.cbwd =='cv' ].index.tolist()))
    for i in reversed(range(len(data))):
        if data["cbwd"][i] =='cv':
            data["cbwd"][i] = data["cbwd"][i+1]
    print("after",len(data[data.cbwd =='cv' ].index.tolist()))
    
  • 存为.csv新文件
  • print("处理数据完成")
    data.to_csv("PM_bj.csv",index=False)
  • 实验结果与没有处理前的对比(节选)如图6
  • 8857911ea15b4c14af058c11c4fe8930.png

    图6 结果对比

 

实验总结

1、遇到问题

在处理北京二手房数据时遇到问题,一开始不知道如何将列表中数据从str类型转换为float类型;后来通过上网搜索和查找,一步步解决了问题;主要步骤是:整理数据通过find函数将列表中每一项的数字提取,再通过float()强制转换,最后存储到列表中。

2、总结

通过整理数据、对数据进行操作,发现爬虫中将数据从网页上爬取下来是很简单的一个步骤了,对于爬取下来的数据进行清洗的到有用的数据并不是想象中那么简单的,需要对python基础知识有很强的应用能力,所以要学习的还有很多,继续加油吧。

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值