在(1)的基础上,继续。
在本次练习中,由于数据特征主要存在文本中,表现为:数值型和类别型特征都存于字符串中。一边要进行数据清洗也要进行特征抽取。
对于字符串中提取数值或类别型特征,由(1)的尝试,主要是使用正则表达式(也尝试过进行切片,但该数据噪点较多,字符串也很不规范,不能建立统一的切片形式),通过循环语句不断去倒腾这些数据。因此,我们的目的就是从字符串中提取数值或类别型特征,写的程序主要实现此功能。
本次主要从变量特征为direction_house、 decoration_house、 elevator_house 、type_house、 years_house、 area_house进行提取。
首先是type_house,原始特征为 :底层(共2层), 2层, 中楼层(共6层),底层(共2层)···,房子类型主要为底,中,高,但有些行中如为2层,明显的缺失,此处抽取低中高顶的特征。主要思路:首先将带有低中高顶的特征抽取出来,如果没有,假设用1进行填充,得到列表type_house1,接下来需要的是从该列表中提取相应的低中高顶特征,则根据索引位提取,得到列表type_house2,并查看各特征所占的比例,发现1占的还比较多,用其他替代,并且将 高 和顶进行特征合并(可能不妥,房子的高层和顶层还是有区别),再加入原数据中,代码如下。
type_house1 = []
for tp1 in bj_data['type_house']:
if re.match(r"[底中高顶]", tp1):
type_house1.append(tp1)
else:
type_house1.append(1)
结果·········
['底层(共2层)', 1, '中楼层(共6层)', '底层(共2层)', '底层(共2层)'····]
type_house2 = []
for tp2 in type_house1:
if tp2 == 1:
type_house2.append(tp2)
else:
type_house2.append(tp2[0])
结果·········
['底', 1, '中', '底', '底', '高', '高', '高', '底', 1, 1, '顶'···]
中 15199
1 11482
高 9456
顶 7307
底 4880
type_house3 = [ '其他'if x==1 else x for x in type_house2]
type_house4 = ['高' if x=='顶' else x for x in type_house3]
bj_data.insert(2,'type_house4',type_house4)
bj_data.drop('type_house',axis=1, inplace=True)
接下来是years_house,原始数据信息主要体现了房子时间和楼类型(板楼、塔楼、板塔结合),因此需要从中提取两个特征,并对房子时间转为类型特征,定义2000年前的为老楼,2000-2010之间为中年楼,2010年后为年轻楼