跳转到主要内容

Partridge是一个使用pandas DataFrames处理GTFS数据流的Python库。

项目描述

Partridge

https://img.shields.io/pypi/v/partridge.svg https://img.shields.io/travis/remix/partridge.svg

Partridge是一个用于使用pandas DataFrames处理GTFS数据流的Python 3.6+库。

Partridge的设计深受我们在Remix分析调试所有可找到的GTFS数据流的经验的影响。

Partridge的核心是一个以trips.txt为根的依赖图。在读取数据流的内时,根据此图剪枝断开的数据。

还可以过滤数据流以创建特定于您的视图。最常见的做法是将数据流过滤到特定日期(service_id)或路线(route_id),但任何字段都可以被过滤。

dependency graph

哲学

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)

代码更改

其他更改

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 包执行,而不是 chardetcchardet 更快,但可能不会总是返回与 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_datedates_by_service_idstrip_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。

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

partridge-1.1.2.tar.gz (27.6 kB 查看哈希值)

上传时间

构建分布

partridge-1.1.2-py2.py3-none-any.whl (16.2 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者