Partridge是一个使用pandas DataFrames处理GTFS数据流的Python库。
项目描述
Partridge
Partridge是一个用于使用pandas DataFrames处理GTFS数据流的Python 3.6+库。
Partridge的设计深受我们在Remix分析调试所有可找到的GTFS数据流的经验的影响。
Partridge的核心是一个以trips.txt为根的依赖图。在读取数据流的内时,根据此图剪枝断开的数据。
还可以过滤数据流以创建特定于您的视图。最常见的做法是将数据流过滤到特定日期(service_id)或路线(route_id),但任何字段都可以被过滤。
哲学
Partridge的设计受以下原则指导
尽可能多
优先考虑速度
允许扩展
在昂贵的路径上懒加载成功
在低成本路径上积极失败
尽可能少
除了高效地将GTFS文件读取到DataFrame中之外,做任何事情
对GTFS规范持有意见
安装
pip install partridge
GeoPandas支持
pip install partridge[full]
用法
设置
import partridge as ptg
inpath = 'path/to/caltrain-2017-07-24/'
示例
以下是一系列包含Jupyter笔记本的gists集合,其中包含对GTFS数据源进行转换的工具,这些工具可能对软件应用的输入很有用。
检查日历
行程最多的日期
date, service_ids = ptg.read_busiest_date(inpath)
# datetime.date(2017, 7, 17), frozenset({'CT-17JUL-Combo-Weekday-01'})
行程最多的星期
service_ids_by_date = ptg.read_busiest_week(inpath)
# {datetime.date(2017, 7, 17): frozenset({'CT-17JUL-Combo-Weekday-01'}),
# datetime.date(2017, 7, 18): frozenset({'CT-17JUL-Combo-Weekday-01'}),
# datetime.date(2017, 7, 19): frozenset({'CT-17JUL-Combo-Weekday-01'}),
# datetime.date(2017, 7, 20): frozenset({'CT-17JUL-Combo-Weekday-01'}),
# datetime.date(2017, 7, 21): frozenset({'CT-17JUL-Combo-Weekday-01'}),
# datetime.date(2017, 7, 22): frozenset({'CT-17JUL-Caltrain-Saturday-03'}),
# datetime.date(2017, 7, 23): frozenset({'CT-17JUL-Caltrain-Sunday-01'})}
提供服务活动的日期
service_ids_by_date = ptg.read_service_ids_by_date(path)
date, service_ids = min(service_ids_by_date.items())
# datetime.date(2017, 7, 15), frozenset({'CT-17JUL-Caltrain-Saturday-03'})
date, service_ids = max(service_ids_by_date.items())
# datetime.date(2019, 7, 20), frozenset({'CT-17JUL-Caltrain-Saturday-03'})
服务相同的日期
dates_by_service_ids = ptg.read_dates_by_service_ids(inpath)
busiest_date, busiest_service = ptg.read_busiest_date(inpath)
dates = dates_by_service_ids[busiest_service]
min(dates), max(dates)
# datetime.date(2017, 7, 17), datetime.date(2019, 7, 19)
读取数据源
_date, service_ids = ptg.read_busiest_date(inpath)
view = {
'trips.txt': {'service_id': service_ids},
'stops.txt': {'stop_name': 'Gilroy Caltrain'},
}
feed = ptg.load_feed(path, view)
以GeoDataFrames的形式读取形状和站点
service_ids = ptg.read_busiest_date(inpath)[1]
view = {'trips.txt': {'service_id': service_ids}}
feed = ptg.load_geo_feed(path, view)
feed.shapes.head()
# shape_id geometry
# 0 cal_gil_sf LINESTRING (-121.5661454200744 37.003512297983...
# 1 cal_sf_gil LINESTRING (-122.3944115638733 37.776439059278...
# 2 cal_sf_sj LINESTRING (-122.3944115638733 37.776439059278...
# 3 cal_sf_tam LINESTRING (-122.3944115638733 37.776439059278...
# 4 cal_sj_sf LINESTRING (-121.9031703472137 37.330157067882...
minlon, minlat, maxlon, maxlat = feed.stops.total_bounds
# -122.412076, 37.003485, -121.566088, 37.77639
提取新的数据源
outpath = 'gtfs-slim.zip'
service_ids = ptg.read_busiest_date(inpath)[1]
view = {'trips.txt': {'service_id': service_ids}}
ptg.extract_feed(inpath, outpath, view)
feed = ptg.load_feed(outpath)
assert service_ids == set(feed.trips.service_id)
功能
惊人的快 :)
只将所需内容加载到内存中
内置支持解析服务日期
易于扩展以支持官方规范之外的字段和文件(待文档化)
处理zip中的嵌套文件夹和坏数据
可预测的类型转换
谢谢
希望您觉得这个库很有用。如果您有改进Partridge的建议,请打开GitHub上的问题。
历史
1.1.2 (2022-11-23)
代码更改
删除对已弃用的NumPy类型的引用(https://github.com/remix/partridge/pull/69 - 感谢@BlackSpade741!)
从cChardet切换到charset-normalizer以支持Python 3.10(https://github.com/remix/partridge/pull/76 - 感谢@brockhaywood!)
其他更改
对测试、代码格式化和文档的杂项改进(https://github.com/remix/partridge/pull/61 - 感谢@invisiblefunnel!)
将用法示例从wiki迁移到README(https://github.com/remix/partridge/pull/70 - 感谢@landonreed!)
README调整(https://github.com/remix/partridge/pull/74 - 感谢@chelsey!)
使用GitHub Actions进行自动化测试(https://github.com/remix/partridge/pull/79 - 感谢@dget!)。 注意:我们现在针对Python版本3.8、3.9、3.10和3.11进行测试。
1.1.1 (2019-09-13)
改进文件编码嗅探器,该嗅探器错误地识别了一些芬兰/emoji Unicode。感谢@dyakovlev!
1.1.0 (2019-02-21)
添加partridge.load_geo_feed以将站点和形状读取到GeoPandas GeoDataFrames中。
1.0.0 (2018-12-18)
此版本是主要内部重构和一些小界面更改的组合。总体而言,您应该期望从预1.0版本升级相对痛苦。衷心感谢@genhernandez和@csb19815宝贵的反馈。如果您仍然需要Python 2支持,请继续使用版本0.11.0。
以下是一个界面更改列表
类partridge.gtfs.feed已重命名为partridge.gtfs.Feed。
实例化数据源的公共接口是partridge.load_feed。此函数替换了之前未记录的函数partridge.get_filtered_feed。
已添加一个新功能,用于识别源中最繁忙的一周:partridge.read_busiest_date
已移除公开函数 partridge.get_representative_feed,现在可以直接使用 partridge.read_busiest_date。
公开函数 partridge.writers.extract_feed 现在可通过顶级模块访问:partridge.extract_feed。
其他一些小的更改
字符编码检测现在由 cchardet 包执行,而不是 chardet。 cchardet 更快,但可能不会总是返回与 chardet 相同的结果。
将压缩文件解压缩到临时目录,而不是直接从压缩文件中读取。当垃圾回收或进程退出时,会清理这些临时目录。
代码库现在带有类型提示,构建过程运行 mypy 来验证类型。
数据框架现在存储在字典中,而不是使用 functools.lru_cache 装饰器。
partridge.extract_feed 函数现在并发写入文件以提高性能。
0.11.0 (2018-08-01)
修复了与编码检测相关的重大性能问题。感谢 @cjer 报告问题并提出解决方案。
0.10.0 (2018-04-30)
改进了对非标准合规文件编码的处理。
仅对 Python < 3 需要 functools32。
ptg.parsers.parse_date 现在接受字符串而不是日期。
0.9.0 (2018-03-24)
通过向 ptg.parsers.parse_time 添加 LRU 缓存来提高大型源读取时间。
0.8.0 (2018-03-14)
优雅地处理完全空的文件。此更改统一了从仅包含标题(没有数据行)的 CSV 文件和完全空(零字节)的 zip 文件中读取的行为。
0.7.0 (2018-03-09)
修复了嵌套文件夹和包含嵌套文件夹的 zip 文件的处理。
添加 ptg.get_filtered_feed 用于多文件过滤。
0.6.1 (2018-02-24)
修复了 ptg.read_service_ids_by_date 中的错误。由 @cjer 在 #27 中报告。
0.6.0 (2018-02-21)
发布的包不再包含不必要的 fixtures 以减少大小。
使用 ptg.write_feed_dangerously 原地写入 feed 对象到 zip 文件。
使用 ptg.read_busiest_date 从源中读取最早的、最繁忙的日期及其 service_id。
错误修复:处理没有适用行程的 calendar.txt/calendar_dates.txt 条目。
0.6.0.dev1 (2018-01-23)
添加从文件夹中读取文件的支持。再次感谢 @danielsclint!
0.5.0 (2017-12-22)
使用 ptg.get_representative_feed 轻松构建 zip 的代表性视图。受 peartree 的启发。
使用 ptg.extract_{agencies,routes} 提取按 agency_id/route_id 分组的 GTFS 压缩文件。
使用 feed.get('myfile.txt') 从 zip 中读取任意文件。
从 feed 类中删除 service_ids_by_date、dates_by_service_ids 和 trip_counts_by_date。相反,使用 ptg.{read_service_ids_by_date,read_dates_by_service_ids,read_trip_counts_by_date}。
0.4.0 (2017-12-10)
添加对 Python 2.7 的支持。感谢 @danielsclint!
0.3.0 (2017-10-12)
修复了 raw_feed 的服务日期解析问题。以前,raw_feed 考虑了从 calendar.txt 到每周的所有日期都是活跃的,无论 0/1 值如何。
0.2.0 (2017-09-30)
在默认依赖图中添加从 fare_rules.txt 到 routes.txt 的缺失边缘。
0.1.0 (2017-09-23)
首次发布在 PyPI。
项目详细信息
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。