租房的一般步骤
- 选房
1.1 距离筛选
2.2 价格筛选 - 看房
2.1 现场实际环境
2.2 周边环境 - 签合同
优化目标
选房是最为关键的一步,选择好合适的房子可以让我们事半功倍,不用来回跑。而且选房过程中需要通过阅读大量的房源信息,然后综合交通,上班时间,周边商场,以及价格范围等信息,从而选择出较为心仪的房子。这个步骤可以通过python来优化实现。
总的来说,选房最关键的就2个,一是上班时间短,二是价格相对便宜。
那么问题来了,租房地点的上班时间如何确定?
以本人为例,本人主要交通工具为地铁,那么就想着如果靠地铁,然后总的上班时间也比较短,那么我就会认为距离是合适的。下面将以本人为例讲解如何选择合适的租房地点
准备工作
-
获取高德api key。
高德api开放平台提供了免费的接口,可以将任意地点转为相对精准的经纬度信息,通过高德地图的路线规划api,我们可以得到从起点到终点的公交或者地铁出行时间。
高德地图开放平台官网:https://lbs.amap.com/
高德地图开发文档:https://lbs.amap.com/api/webservice/gettingstarted
本人用python编写好的模块包:https://github.com/Tlntin/amap_api
推荐使用Python编写好的包,这样调用比较方便。 -
获取广州地铁信息。
广州地铁线详细信息:http://gz.bendibao.com/ditie/linemap.shtml
通过xpath即可筛选出所有地铁站站名称:/html/body/div[4]/div/div[1]/div/div/div/div/a
-
将广州地铁信息转成经纬度坐标。
直接利用上面的高德api开放工具,然后通过其中的location_encode方法可以获取到该站名所有详细信息。
from amap_api import AMap
class MyClass(AMap):
def __init__(self, keys, sig=None, output="JSON"):
"""
初始化构造函数,继承于高德API
:param keys: 密钥,需要去高德开放平台申请
:param sig: 数字签名,详见:https://lbs.amap.com/faq/quota-key/key/41169
:param output: 输出,JSON or XML;设置 JSON 返回结果数据将会以JSON结构构成;如果设置 XML 返回结果数据将以 XML 结构构成。
"""
super().__init__(keys, sig, output)
def subway_encode(self, subway_name: str, city: str):
"""
地铁站名转经纬度地址
:param subway_name: 地铁站名称,Str类型,如珠江新城地铁站
:param city: 城市名称,Str类型,如:广州
:return: 返回经纬度地址与地铁站全称
"""
# 如果地铁站名称缺少地铁站结尾,如珠江新城,未指明珠江新城地铁站
if not subway_name.endswith('地铁站'):
subway_name = subway_name + '地铁站'
if not subway_name.startswith(city):
subway_name = city + subway_name
data1 = self.location_encode(subway_name, city=city)
if bool(data1):
formatted_address = data1['geocodes'][0]['formatted_address']
location = data1['geocodes'][0]['location']
return formatted_address, location
else:
return False
测试一下广州珠江新城,输出结果为('广东省广州市天河区珠江新城地铁站', '113.320988,23.119410')
之后,我们需要将地铁站所有站名的详细信息和经纬度定位都计算出来,并且保存到csv文件中。
@staticmethod
def translate_all_subway(path='广州地铁线路图.csv', out_path='广州地铁2.csv'):
df = pd.read_csv(path, encoding='utf-8-sig')
address_list = [] # 用来储存地址列表
location_list = [] # 用来储存经纬度列表
for i in tqdm(range(len(df))):
name = df.loc[i, '地铁站名']
data_temp = my.subway_encode(name, '广州')
if bool(data_temp):
address_list.append(data_temp[0])
location_list.append(data_temp[1])
time.sleep(0.1)
df['详细地址'] = address_list
df['经纬度'] = location_list
df.to_csv(out_path, encoding='utf-8-sig', index=None)
image-20200820181224664
- 编写函数计算地铁站点之间的距离
这个其实高德api以及提供了,我们直接使用python的api模块获取公交出行,按最短出现时间计算总的出现距离。
def calculate_during_time(self, origin, destination, city, city_destination=None):
"""
计算出现最短出现时间
:param origin: 出发点,Str类型,经纬度
:param destination: 目标地点,,Str类型,经纬度
:param city: 城市/跨城规划时的起点城市,Str类型。目前支持市内公交换乘/跨城公交的起点城市,可选值:城市名称/citycode
:param city_destination: 跨城公交规划时的终点城市,Str类型,跨域则必填。可选值:城市名称/citycode
:return:
"""
data1 = self.bus_path_plan(origin, destination, city, city_destination)
if bool(data1):
# 只要最快的那个
try:
temp_data = data1['route']['transits']
if len(temp_data) > 0:
distance = round(int(temp_data[0]['distance']) / 1000, 2) # 计算距离, km
duration = round(int(temp_data[0]['duration']) / 60) # 计算步行时间,单位分钟
return distance, duration
else:
return False
except:
pprint(data1)
else:
return False
测试一下广州东站
到珠江新城地铁站
,返回结果为:3.569 10
,也就是步行距离3.6公里,实际最快公交出行10分钟。基本与手机app一致。
- 根据你的工作地点,循环遍历所有地铁站,找出位置比较合适租房地铁口。
在正式运行时,建议筛选一下,广佛线和APM线可以不要,部分地铁口识别为"广东省广州市"也需要去除。最后大概留下上班时间30分钟以内的地铁站就好了,以目标地点“珠江新城”附近的某栋大厦为例,遍历循环其它地铁口,找出上班时间在30分钟以内的地铁站。
def calculate_all_subway_time(self, working_destination, city, input_path='广州地铁2.csv', output_path='广州地铁3.csv'):
"""
计算所有地铁口的
:param working_destination: 工作地点,Str类型.经纬度坐标
:param city: 工作城市
:param input_path: 输入文件地址,Str类型
:param output_path: 输出文件地址,Str类型
:return:
"""
df = pd.read_csv(input_path, encoding='utf-8-sig')
df = df.drop(df[df['详细地址'] == '广东省广州市'].index)
df.drop_duplicates(subset=['地铁站名'], inplace=True) # 去重
df = df.reset_index()
df = df.loc[:170].copy() # 从广佛线后面都不要了
distance_list = [] # 距离列表
time_list = [] # 时间列表
for i in tqdm(range(len(df))):
location = df.loc[i, '经纬度']
# 计算上班距离和时间
data1 = self.calculate_during_time(location, working_destination, city=city)
if bool(data1):
distance_list.append(data1[0])
time_list.append(data1[1])
time.sleep(0.1)
# 添加新列进去
df['上班距离(km)'] = distance_list
df['上班时间(分钟)'] = time_list
df.to_csv(output_path, encoding='utf-8-sig', index=None)
image-20200820181249061
可以看出符合条件的大概有53个。加上地铁口到租房地点的距离,上下班也就差不多40分钟了。下一步就是获取租房信息,比如价格,大小,周边环境,是否靠近上面的地铁口,最好能获取到它的经纬度信息,这样就可以筛选出我们满意的房子了。这里不再阐述,有需要的请自行获取相关租房信息。
网友评论