用于操作开放旅行数据的 Python 库
项目描述
极简GeoBases 实施:
没有依赖关系
兼容 Python 3.6+、CPython 和 PyPy
一个数据源: opentraveldata
一个 Python 模块,用于更轻松地在集群上分发(如 Hadoop)
更快的加载时间 (5x)
用 pytest 和 tox 测试
>>> from neobase import NeoBase
>>> b = NeoBase()
>>> b.get('ORY', 'city_code_list')
['PAR']
>>> b.get('ORY', 'city_name_list')
['Paris']
>>> b.get('ORY', 'country_code')
'FR'
>>> b.distance('ORY', 'CDG')
34.87...
>>> b.get_location('ORY')
LatLng(lat=48.72..., lng=2.35...)
安装
使用 Python 包:
pip install neobase
文档
查看API 的readthedocs。
初始化时可以自定义源数据:
with open("file.csv") as f:
N = NeoBase(f)
否则加载的文件将是嵌入文件,除非设置了OPTD_POR_FILE环境变量。在这种情况下,它将从该变量中定义的路径加载。
您也可以自己手动检索最新的数据源,但如果数据中发生了一些重大更改,您将面临一些重大更改。
from io import StringIO
from urllib.request import urlopen
from neobase import NeoBase, OPTD_POR_URL
data = urlopen(OPTD_POR_URL).read().decode('utf8')
N = NeoBase(StringIO(data))
N.get("PAR")
有效期的参考日期也可以更改:
N = NeoBase(date="2000-01-01")
N.get("AIY") # was decommissioned in 2015
默认情况下,参考日期将设置为今天,除非设置了OPTD_POR_DATE环境变量。在这种情况下,它将使用该值。
您可以自定义关于重复的行为:共享相同 IATA 代码的点,例如 NCE 作为机场,NCE 作为城市。默认情况下会保留所有内容,但您可以对其进行设置,以便仅保留带有 IATA 代码的第一个点:
N = NeoBase(duplicates=False)
len(N) # about 10,000 "only"
请注意,您也可以使用OPTD_POR_DUPLICATES环境变量来控制它:将其设置为0以删除重复项。
最后,您可以自定义通过子类化加载的字段。
class SubNeoBase(NeoBase):
KEY = 0 # iata_code
# Those loaded fields are the default ones
FIELDS = (
("name", 6, None),
("lat", 8, None),
("lng", 9, None),
("page_rank", 12, lambda s: float(s) if s else None),
("country_code", 16, None),
("country_name", 18, None),
('continent_name', 19, None),
("timezone", 31, None),
("city_code_list", 36, lambda s: s.split(",")),
('city_name_list', 37, lambda s: s.split('=')),
('location_type', 41, None),
("currency", 46, None),
)
N = SubNeoBase()
命令行界面
您可以使用以下方式查询数据:
python -m neobase PAR NCE
测试
tox