清洗数据来源
数据是来自于python爬虫专项(28)和(29)里面采集的分页信息和深度信息,如下
1) data_1表格下面获取的分页信息
2) data_2表格下面获取的深度信息
清洗逻辑:【函数式编程】–> 【分开清洗保留原数据】
函数构建
函数1:data_cleaning1(table,table_new) → 【分页数据清洗】函数
table:源数据mongo里data_1集合对象
table_new:清洗后数据mongo里data_1_new集合对象
函数2:data_cleaning2(table,table_new) → 【详细信息数据清洗】函数
table:源数据mongo里data_2集合对象
table_new:清洗后数据mongo里data_2_new集合对象
前期准备与数据库配置
import re
import pymongo
if __name__ == '__main__':
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
db = myclient['链家二手房_1']
datatable_1 = db['data_1']
datatable_2 = db['data_2']
datatable_1_new = db['data_1_new']
datatable_1_new.delete_many({})
datatable_2_new = db['data_2_new']
datatable_2_new.delete_many({})
该部分实现的功能是:相关库的导入,代码分区和数据库的配置(分布信息和深度信息数据的加载以及创建新的数据储存表格)
封装第一个函数
在数据清洗过程中,要以简单便捷为主,不要强行使用一种方式,当一种方式不行的时候,记得及时转换思路
def data_cleaning1(table,table_new):
'''【列表数据清洗】函数
table:源数据mongo集合对象
table_new:清洗后数据mongo集合对象
'''
dlst = table.find()
#加载数据对象,可迭代
n = 1
for i in dlst[:499]:
i['关注量'] = int(re.search(r'(\d+)',i['关注量']).group(1))
i['面积'] = float(re.search(r'([\d.]+)',i['面积']).group(1))
i['年份'] = int(re.search(r'(\d+)年',i['建筑完工时间']).group(1))
#del i['建筑完工时间']
i['总价_万'] = int(re.search(r'(\d+)万',i['价钱']).group(1))
#del i['价钱']
i['单价_元'] = int(re.search(r'单价(\d+)',i['每平米价钱']).group(1))
#del i['每平米价钱']
i['楼层高度'] = int(re.search(r'(\d+)',i['楼层']).group(1))
i['所属楼层'] = i['楼层'].split('(')[0]
del i['_id']
del i['价钱']
del i['每平米价钱']
del i['建筑完工时间']
del i['楼层']
table_new.insert_one(i)
n += 1
return n
print(data_cleaning1(datatable_1,datatable_1_new))
输出结果为:500(下面就是修改过后的数据库中的内容)
封装第二个函数
第二个函数是对深度信息数据进行清洗
def data_cleaning2(table,table_new):
'''【详细信息数据清洗】函数
table:源数据mongo集合对象
table_new:清洗后数据mongo集合对象
'''
dlst = table.find()
n = 0
for i in dlst[:500]:
i['lng'] = float(i['lng'])
i['lat'] = float(i['lat'])
i['建筑面积'] = float(re.search(r'([\d.]+)',i['建筑面积']).group(1))
i['总价_万'] = float(i['总价_万'])
i['单价_元'] = float(i['单价_元'])
i['产权年限'] = int(re.search(r'(\d+)',i['产权年限']).group(1))
mod_area = re.search(r'([\d.]+)',i['套内面积'])
if mod_area:
i['套内面积'] = float(mod_area.group(1))
else:
del i['套内面积']
#不是所有的数据都有套内面积的
i['楼层高度'] = int(re.search(r'(\d+)',i['所在楼层']).group(1))
i['所属楼层'] = i['所在楼层'].split('(')[0]
del i['_id']
del i['所在楼层']
table_new.insert_one(i)
n += 1
return n
全部代码
import re
import pymongo
def data_cleaning1(table,table_new):
'''【列表数据清洗】函数
table:源数据mongo集合对象
table_new:清洗后数据mongo集合对象
'''
dlst = table.find()
n = 0
for i in dlst[:500]:
i['关注量'] = int(re.search(r'(\d+)',i['关注量']).group(1))
i['面积'] = float(re.search(r'([\d.]+)',i['面积']).group(1))
i['年份'] = int(re.search(r'(\d+)年',i['建筑完工时间']).group(1))
#del i['建筑完工时间']
i['总价_万'] = int(re.search(r'(\d+)万',i['价钱']).group(1))
#del i['价钱']
i['单价_元'] = int(re.search(r'单价(\d+)',i['每平米价钱']).group(1))
#del i['每平米价钱']
i['楼层高度'] = int(re.search(r'(\d+)',i['楼层']).group(1))
i['所属楼层'] = i['楼层'].split('(')[0]
del i['_id']
del i['价钱']
del i['每平米价钱']
del i['建筑完工时间']
del i['楼层']
table_new.insert_one(i)
n += 1
return n
def data_cleaning2(table,table_new):
'''【详细信息数据清洗】函数
table:源数据mongo集合对象
table_new:清洗后数据mongo集合对象
'''
dlst = table.find()
n = 0
for i in dlst[:500]:
i['lng'] = float(i['lng'])
i['lat'] = float(i['lat'])
i['建筑面积'] = float(re.search(r'([\d.]+)',i['建筑面积']).group(1))
i['总价_万'] = float(i['总价_万'])
i['单价_元'] = float(i['单价_元'])
i['产权年限'] = int(re.search(r'(\d+)',i['产权年限']).group(1))
mod_area = re.search(r'([\d.]+)',i['套内面积'])
if mod_area:
i['套内面积'] = float(mod_area.group(1))
else:
del i['套内面积']
i['楼层高度'] = int(re.search(r'(\d+)',i['所在楼层']).group(1))
i['所属楼层'] = i['所在楼层'].split('(')[0]
del i['_id']
del i['所在楼层']
table_new.insert_one(i)
n += 1
return n
if __name__ == '__main__':
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
db = myclient['链家二手房_1']
datatable_1 = db['data_1']
datatable_2 = db['data_2']
datatable_1_new = db['data_1_new']
datatable_1_new.delete_many({})
data_cleaning1(datatable_1,datatable_1_new)
datatable_2_new = db['data_2_new']
datatable_2_new.delete_many({})
data_cleaning2(datatable_2,datatable_2_new)
输出的结果如下: