生成表格输出#
几乎所有的 SUMO 工具和应用程序都消费和/或生成 XML 文件,这些文件可以使用一些 XML 工具 转换为其他格式。 从 SUMO 1.24.0 开始,实验性地支持直接从 SUMO 应用程序生成 CSV 或 Parquet 格式的表格输出。
最简单的方法是给输出文件一个不同的名称:
sumo -c my.sumocfg --fcd-output fcd.csv
这将生成一个 CSV 文件而不是 XML 文件,而
sumo -c my.sumocfg --fcd-output fcd.parquet
将生成 Parquet 输出。
大多数情况下,XML 到表格格式的映射是直接的。例如,对于 FCD 输出,FCD 文件:
<fcd-export xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/fcd_file.xsd">
<timestep time="0.00"/>
<timestep time="1.00"/>
<timestep time="2.00"/>
...
<timestep time="97.00"/>
<timestep time="98.00"/>
<timestep time="99.00"/>
<timestep time="100.00">
<vehicle id="always_left.0" x="5.10" y="498.35" angle="90.00" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="1fi_0" slope="0.00"/>
<vehicle id="always_right.0" x="501.65" y="5.10" angle="0.00" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="3fi_0" slope="0.00"/>
<vehicle id="horizontal.0" x="994.90" y="501.65" angle="270.00" type="DEFAULT_VEHTYPE" speed="0.00" pos="5.10" lane="2fi_0" slope="0.00"/>
</timestep>
<timestep time="101.00">
<vehicle id="always_left.0" x="7.02" y="498.35" angle="90.00" type="DEFAULT_VEHTYPE" speed="1.92" pos="7.02" lane="1fi_0" slope="0.00"/>
<vehicle id="always_right.0" x="501.65" y="7.46" angle="0.00" type="DEFAULT_VEHTYPE" speed="2.36" pos="7.46" lane="3fi_0" slope="0.00"/>
<vehicle id="horizontal.0" x="993.58" y="501.65" angle="270.00" type="DEFAULT_VEHTYPE" speed="1.32" pos="6.42" lane="2fi_0" slope="0.00"/>
</timestep>
<timestep time="102.00">
<vehicle id="always_left.0" x="10.66" y="498.35" angle="90.00" type="DEFAULT_VEHTYPE" speed="3.64" pos="10.66" lane="1fi_0" slope="0.00"/>
<vehicle id="always_right.0" x="501.65" y="11.19" angle="0.00" type="DEFAULT_VEHTYPE" speed="3.72" pos="11.19" lane="3fi_0" slope="0.00"/>
<vehicle id="horizontal.0" x="990.38" y="501.65" angle="270.00" type="DEFAULT_VEHTYPE" speed="3.20" pos="9.62" lane="2fi_0" slope="0.00"/>
</timestep>
...
将被映射到 CSV
timestep_time;vehicle_id;vehicle_x;vehicle_y;vehicle_angle;vehicle_type;vehicle_speed;vehicle_pos;vehicle_lane;vehicle_edge;vehicle_slope
100.00;always_left.0;5.10;498.35;90.00;DEFAULT_VEHTYPE;0.00;5.10;1fi_0;;0.00
100.00;always_right.0;501.65;5.10;0.00;DEFAULT_VEHTYPE;0.00;5.10;3fi_0;;0.00
100.00;horizontal.0;994.90;501.65;270.00;DEFAULT_VEHTYPE;0.00;5.10;2fi_0;;0.00
101.00;always_left.0;7.02;498.35;90.00;DEFAULT_VEHTYPE;1.92;7.02;1fi_0;;0.00
101.00;always_right.0;501.65;7.46;0.00;DEFAULT_VEHTYPE;2.36;7.46;3fi_0;;0.00
101.00;horizontal.0;993.58;501.65;270.00;DEFAULT_VEHTYPE;1.32;6.42;2fi_0;;0.00
102.00;always_left.0;10.66;498.35;90.00;DEFAULT_VEHTYPE;3.64;10.66;1fi_0;;0.00
102.00;always_right.0;501.65;11.19;0.00;DEFAULT_VEHTYPE;3.72;11.19;3fi_0;;0.00
102.00;horizontal.0;990.38;501.65;270.00;DEFAULT_VEHTYPE;3.20;9.62;2fi_0;;0.00
...
这意味着结构被完全展平,并且所有不包含最内层元素数据的行(开头的空 "timestep")都被省略了。外部元素的所有属性(示例中的 "timestep_time")都在内部元素中重复。 列名由 XML 元素名和属性名组合派生(与 python 工具 xml2csv.py 使用的格式相同),但这可以进行配置(见下文)。请注意,表格格式可能包含比 XML 更多的列(例如上面示例中的 "vehicle_edge"),以支持不同模拟配置使用相同的格式(例如中观和微观模拟)。
Caution
表格输出仍是一项实验性功能。请准备好可能会丢失数据,尤其是在收到关于不支持格式的警告时。
使用 CSV 或 Parquet 的动机是为了获得更小的文件和更好的读取时间,特别是对于像 SUMO 的 FCD 输出 这样的大型输出。使用 Python 的 pandas 库从 Parquet 而不是 XML 读取这些文件时,速度最多可提升 50 倍(参见性能)。
要进一步配置表格输出,可以使用以下选项: | 选项 | 描述 | |---|---| | --output.compression <STRING> | 定义标准压缩算法(目前仅适用于 parquet 输出:'uncompressed', 'gzip', 'bz2', 'zstd');默认值: uncompressed | | --output.format <STRING> | 如果无法从文件名推导,则定义标准输出格式('xml', 'csv', 'parquet');默认值: xml | | --output.column-header <STRING> | 如何从属性名派生列头('none', 'tag', 'auto', 'plain');默认值: tag | | --output.column-separator <STRING> | CSV 输出中的分隔符;默认值: ; |
--output.format 选项仅在无法从文件名推导格式时使用,因此在写入 stdout 或套接字时,或者如果由于任何原因需要给出不是 "xml"、"csv"、"parquet"、"xml.gz" 或 "csv.gz" 的文件结尾时,它最有用。
对于 --output.compression,请注意,目前这只应用于 parquet 文件,并且这是应用于每个列的内部压缩算法。因此,您将无法使用命令行上的 gzip 工具解压缩具有 gzip 压缩的 parquet 文件。此外,我们目前还不支持为不同的列指定不同的压缩方法。压缩支持也可能取决于 SUMO(或者更确切地说是它所依赖的 Arrow / Parquet 库)的编译方式。
默认情况下,列名是通过将元素名和属性名用 "_" 连接起来派生的。这可以通过将选项 --output.column-header 设置为以下值之一来更改: - 'none': 在 CSV 中不写入头(parquet 仍然使用默认头) - 'tag': 使用元素名和属性名的默认行为 - 'auto': 仅使用属性名,除非存在名称冲突。如果存在冲突,则对冲突的列名使用 'tag' 策略(第一个除外)。 - 'plain': 始终仅使用属性名
Parquet 数据类型#
对于 Parquet,每个列都需要有一个数据类型。当前的映射如下: - 如果给定的 --precision 为 2(默认)或更小,则所有浮点值都使用 32 位浮点数,更高精度的值会触发使用 64 位(双精度)值。 - 平面中的所有坐标("x" 和 "y")都使用 64 位浮点数(双精度)。 - 时间值使用 64 位浮点数,除非启用了 --human-readable-time,此时它使用字符串。 - 所有整数使用 32 位。 - 其他所有内容都使用 UTF8 字符串。
性能#
以下是使用 acosta 场景的 FCD 输出进行的一些初步基准测试:
| 格式 | 写入 | 大小 | pandas.read | parse_fast_nested |
|---|---|---|---|---|
| fcd.xml | 12s | 357MB | 11s | 8s |
| fcd.csv | 15s | 194MB | 2s | |
| fcd.parquet | 13s | 74MB | 0.2s | |
| fcd.xml.gz | 19s | 56MB | 7s | 9s |
| fcd.csv.gz | 17s | 47MB | 3s |
限制#
列目前由第一个完全闭合(最内层)的元素确定。这意味着以下结构不受支持:
- 具有可选属性的元素(即 edgeData 默认值)
- 同一级别的不同元素(即人员计划中的
<walk>和<ride>元素)
