首页 存档 技术 查看内容

【技术干货】国外大神 手把手教你通过Python机器学习租到低价的公寓

2018-3-30 13:00 |来自: 互联网 297 0

摘要: 如果你曾经找过公寓,你就会明白这个过程可能是多么令人沮丧。它不仅耗费时间,而且即使当你发现一个自己喜欢的公寓,你怎么知道它就是合适的公寓? 你可能在心里设定了目标预算和区域。但是,如果你和我是同一类人 ...

如果你曾经找过公寓,你就会明白这个过程可能是多么令人沮丧。它不仅耗费时间,而且即使当你发现一个自己喜欢的公寓,你怎么知道它就是合适的公寓?


你可能在心里设定了目标预算和区域。但是,如果你和我是同一类人,那么你也许愿意做一些权衡。例如,我住在纽约市,那么靠近地铁站这样的便利设施毫无疑问是一个很大的加分项。但是,这点到底值多少钱?我是否应该拿有电梯的住所和靠近火车站的住所进行交换?步行到火车站多少分钟?抵得过走上楼梯吗?租房的时候,有几十个这样的问题需要考虑。那么,如何使用机器学习来帮助我们进行决策呢?



获取公寓房源数据



在 20 世纪 70 年代初,如果你想购买股票,就需要聘请经纪人,他们会收取你将近 1% 的固定佣金;如果你想购买一张机票,你需要联系旅行社代理,他们将赚取大约 7% 的佣金;如果你想出售一间房子,你会联系一个房地产代理,他们赚取 6% 的佣金。在 2016 年,你基本上可以免费地做前两者。而对于最后一项,情况仍然和 20 世纪 70 年代的一样,保持不变。


为什么是这种情况?更重要的是,这些与机器学习有什么关系?现实是,这一切都归结于数据,以及谁能够访问它。


你可能想象着通过API或爬取房地产网站,就能够很容易地访问珍贵的地产房源数据。你错了,如果你打算遵守这些网站的条款和条件的话。房地产数据受到房地产经纪人国家协会(NAR)的严格控制,由他们运行多项房源服务(MLS)。这是一种聚合房源数据的服务,只有经纪人和代理商可以使用它,而且还需要花费巨资。所以,可以想象,他们不太希望任何人都能大量地下载这些数据。


这是不幸的,因为开放这些数据无疑会催生许多有价值的消费者应用程序。对于占家庭预算最大比重的购买决策而言,这点看上去尤其重要。


话虽如此,也不是完全没有希望。虽然依据条款所言,直接从MLS提供商获取数据是被禁止的,但是我们可以利用第三方工具来拉取数据。


现在,我们来看一个有用的工具,它可以帮助我们获取所需的数据。


使用import.io抓取房源数据


有许多优秀的、基于Python的库用于抓取网页,包括requests、Beautiful Soup和Scrapy。为了达到此处的目的,我们将使用免费的替代方案:


Import.io(http://www.import.io)是一个免费的、基于Web的服务,它会自动抓取网页。这是一个很好的选择,让我们可以避免从头开始创建一个网络爬虫。好在,它为房地产的房源数据提供了一个示例API接口,数据来自Zillow.com。


图 1 的图片来自http://www.import.io/examples。在import.io的搜索框中输入Zillow.com,检索Zillow数据的样例。


图1


他们所提供的数据是有关旧金山的,不过在我们的例子中将使用纽约。为了更换城市,需要使用我们感兴趣的数据所在的网址,来替换演示所提供的网址。


为了实现这点,我们可以打开一个单独的浏览器选项卡,并导航到Zillow.com。在那里执行一个公寓搜索。让我们将公寓搜索限制在曼哈顿地区,价格在 $1500 到 $3000 之间,如图 2 所示。


图2 


一旦有结果返回,我们需要从浏览器地址栏中复制Zillow.com站点的URL,并将其粘贴到之前选项卡中import.io的提取框中。


复制图 2 中Zillow.com地址栏中的URL,并将其粘贴到import.io的提取框中,如图 3 所示。


图3


单击左上角的提取数据(Extract Data)按钮,你将看到一个结果表,只显示你想要的数据。


现在,我们可以通过单击“下载CSV”(Download CSV)按钮,轻松地下载这些数据。弹出的对话框会问我们需要下载多少页,从结果页可以看出在Zillow的搜索返回了 2640 条结果,我们需要下载 106 页来获得整个数据集。而Import.io仅仅允许我们下载 20 页,现在也只能如此了。



检查和准备数据



我们现在有一个包含 500 套公寓的数据集。来看看其中有什么。首先在Jupyter记事本中,使用pandas导入数据。


importpandasaspd
importre
importnumpyasnp
importmatplotlib.pyplotasplt

plt.style.use('ggplot')
%matplotlibinline

pd.set_option("display.max_columns",30)
pd.set_option("display.max_colwidth",100)
pd.set_option("display.precision",3)

#UsethefilelocationofyourImport.iocsv
CSV_PATH=r"/Users/alexcombs/Downloads/magic.csv"

df=pd.read_csv(CSV_PATH)
df.columns


上述代码生成图 4 中的输出。


图4


最后一行df.columns为数据提供了列标题的输出。此外,让我们使用df.head().T查看数据的某些样本。在行结束处的.T语法将转置我们的数据框并垂直地显示它,如图 5 所示。


图5


我们已经可以看出数据有一些缺失值(NaN)。需要多个操作来标准化此数据。数据集中的列(或者说是图 5 中转置后的行)表示了每个Zillow房源的单项数据。看起来似乎有两种类型的房源 一种类型是单个单元,而另一种类型是多个单元。


这两种类型可以在图 6 中看到。


图6


这两个房源对应于在Zillow.com上所看到的图像,如图 7 所示。


图7


拆分这些的关键是listingtype_value这个列头。我们将数据拆分为单一的单元,Apartment for Rent,以及多个单元,Apartments for Rent:


# multiple units
mu = df[df['listingtype_value'].str.contains ('Apartments For')]

# single units
su = df[df['listingtype_value'].str.contains('Apartment For')]


现在来看看每种房源类型的数量。


len(mu)


上述代码生成以下输出。


161len(su)


上述代码生成以下输出。


339


由于大多数房源属于单一单元的类型,我们现在将从此开始。


接下来,我们需要将数据格式化为标准结构。例如,至少需要为卧室数、浴室数、平方英尺和地址各准备一列。


从之前的观察中可以发现,我们已经有一个清晰的价格列,那就是pricelarge_value_prices。幸运的是,该列中没有缺失值,因此我们不会因为缺少数据而丢失任何的房源。


卧室和浴室的数量以及平方英尺将需要一些解析,因为它们全都挤在单一的列中。让我们解决这个问题。


先来看一下该列。


su['propertyinfo_value']


上述代码生成如图 8 所示的输出。


图8


看上去,数据似乎总是包括卧室和浴室的数量,偶尔也会包含例如年份这样的额外信息。在我们继续解析之前,先来检验一下这个假设。


# 检查没有包含'bd''Studio'的行数 

len(su[~(su['propertyinfo_value'].str
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部