Initial commit
This commit is contained in:
commit
f060324bae
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
build
|
||||||
|
*.json
|
||||||
|
config.py
|
1
data/ratp.json
Normal file
1
data/ratp.json
Normal file
File diff suppressed because one or more lines are too long
130
flat.py
Executable file
130
flat.py
Executable file
@ -0,0 +1,130 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from fuzzywuzzy import process as fuzzyprocess
|
||||||
|
|
||||||
|
import config
|
||||||
|
|
||||||
|
|
||||||
|
def pretty_json(json_str):
|
||||||
|
return json.dumps(json_str, indent=4, separators=(',', ': '),
|
||||||
|
sort_keys=True)
|
||||||
|
|
||||||
|
|
||||||
|
def preprocess_data():
|
||||||
|
if not os.path.isdir("build"):
|
||||||
|
os.mkdir("build")
|
||||||
|
|
||||||
|
if not os.path.isfile("build/ratp.json"):
|
||||||
|
ratp_data = []
|
||||||
|
with open("data/ratp.json", "r") as fh:
|
||||||
|
ratp_data = json.load(fh)
|
||||||
|
ratp_data = sorted(
|
||||||
|
list(set(
|
||||||
|
x["fields"]["stop_name"].lower() for x in ratp_data
|
||||||
|
))
|
||||||
|
)
|
||||||
|
with open("build/ratp.json", "w") as fh:
|
||||||
|
fh.write(pretty_json(ratp_data))
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_flats_list():
|
||||||
|
flats_list = []
|
||||||
|
for query in config.QUERIES:
|
||||||
|
flatboob_output = subprocess.check_output(
|
||||||
|
["flatboob", "-n", "0", "-f", "json", "load", query]
|
||||||
|
)
|
||||||
|
flats_list.extend(json.loads(flatboob_output))
|
||||||
|
return flats_list
|
||||||
|
|
||||||
|
|
||||||
|
def remove_duplicates(flats_list):
|
||||||
|
unique_flats_list = []
|
||||||
|
ids = []
|
||||||
|
for flat in flats_list:
|
||||||
|
if flat["id"] in ids:
|
||||||
|
continue
|
||||||
|
ids.append(id)
|
||||||
|
unique_flats_list.append(flat)
|
||||||
|
return unique_flats_list
|
||||||
|
|
||||||
|
|
||||||
|
def sort_by(flats_list, key="cost"):
|
||||||
|
return sorted(flats_list, key=lambda x: x["cost"])
|
||||||
|
|
||||||
|
|
||||||
|
def refine_params(flats_list):
|
||||||
|
def filter_conditions(x):
|
||||||
|
is_ok = True
|
||||||
|
if "cost" in x:
|
||||||
|
cost = x["cost"]
|
||||||
|
is_ok = (
|
||||||
|
is_ok and
|
||||||
|
(cost < config.PARAMS["max_cost"] and
|
||||||
|
cost > config.PARAMS["min_cost"])
|
||||||
|
)
|
||||||
|
if "area" in x:
|
||||||
|
area = x["area"]
|
||||||
|
is_ok = (
|
||||||
|
is_ok and
|
||||||
|
(area < config.PARAMS["max_area"] and
|
||||||
|
area > config.PARAMS["min_area"])
|
||||||
|
)
|
||||||
|
return is_ok
|
||||||
|
|
||||||
|
return filter(filter_conditions, flats_list)
|
||||||
|
|
||||||
|
|
||||||
|
def match_ratp(flats_list):
|
||||||
|
ratp_stations = []
|
||||||
|
with open("build/ratp.json", "r") as fh:
|
||||||
|
ratp_stations = json.load(fh)
|
||||||
|
|
||||||
|
for flat in flats_list:
|
||||||
|
if "station" in flat and flat["station"]:
|
||||||
|
# There is some station fetched by flatboob, try to match it
|
||||||
|
flat["ratp_station"] = fuzzyprocess.extractOne(
|
||||||
|
flat["station"], ratp_stations
|
||||||
|
)
|
||||||
|
# TODO: Cross-check station location to choose the best fit
|
||||||
|
|
||||||
|
return flats_list
|
||||||
|
|
||||||
|
|
||||||
|
def main(dumpfile=None):
|
||||||
|
if dumpfile is None:
|
||||||
|
flats_list = fetch_flats_list()
|
||||||
|
else:
|
||||||
|
with open(dumpfile, "r") as fh:
|
||||||
|
flats_list = json.load(fh)
|
||||||
|
|
||||||
|
# First pass
|
||||||
|
flats_list = remove_duplicates(flats_list)
|
||||||
|
flats_list = sort_by(flats_list, "cost")
|
||||||
|
flats_list = refine_params(flats_list)
|
||||||
|
|
||||||
|
# TODO: flats_list = match_ratp(flats_list)
|
||||||
|
|
||||||
|
# TODO: Second pass, loading additional infos for each entry
|
||||||
|
|
||||||
|
return flats_list
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
dumpfile = sys.argv[1]
|
||||||
|
else:
|
||||||
|
dumpfile = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
preprocess_data()
|
||||||
|
flats_list = main(dumpfile)
|
||||||
|
print(
|
||||||
|
pretty_json(flats_list)
|
||||||
|
)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
Loading…
Reference in New Issue
Block a user