选举计票脚本#

此目录中的脚本可将 Jupyter 执行委员会选举产生的逗号分隔值(CSV)文件转换为 .ini 文件和 .txt 文件,以供 Apache STeVe 脚本 stv_tool.py 使用。运行后一个脚本(该脚本存储在 apache/steve 项目中)后,您将确定哪些候选人获胜。

此脚本需要 Python 3;已知它可在 Python 3.10.8 上运行。

输入文件#

当前目录下应有一个名为 votes.csv 的文件。这是一个从 Google Forms 的投票输出中导出的逗号分隔值文件。

votes.csv 的第一行应包含列标题,其中候选人姓名用方括号括起。(开括号前的任何文本和闭括号后的任何文本都将被忽略。)

votes.csv 的第二行及所有后续行应为每位候选人的优先顺序编号列表。未被排名的候选人其排名应为空字符串。两位候选人不能有相同的排名。排名可以跳过;这不影响转换。请参见下文示例。

输入文件与输出示例#

文件 votes.csv 包含九名候选人,他们的姓名在第一行用方括号列出,以及三张选票,记录在后续行中。这些选票中的每一张都为至少一名候选人指定了排名。排名 1 是投票者的第一(最高)偏好。数字越大表示偏好越后(越低)。

第一张选票为所有九名候选人进行了不同排名。该行的输出将包含所有九名候选人,按排名升序(即偏好降序)排列。

第二张选票使用排名 1、2、3 和 4 为四名候选人排名。这四名候选人将按排名升序(即偏好降序)输出。其他五名候选人则不会出现在输出中。

第三张选票使用排名 2、4、6 和 8 为四名候选人排名。这四名候选人将按排名升序输出,未使用的排名不会有任何输出。此输出中的候选人偏好顺序与第二张选票的相同。

当您运行 python process-votes.py 时,会输出两个文件。

board_nominations.ini 为每位候选人分配一个单独的字母。(最多可以有 26 位候选人。)

[nominees]
a: John Appleton
b: Nancy Bass
c: Carla Chang
d: Greg Donaldson
e: Paula Edwards
f: Kimiko Fukui
g: Kanu Gandhi
h: Eric Harris
i: Susan Irving

votedata.txt 每一行代表一张选票。日期和投票者哈希值由 process-votes.py 生成,并不代表投票的实际日期或投票者的任何身份识别信息。包含它们仅是为了满足 Apache STeVe 计票脚本验证器的要求。最右侧的一列显示了投票者的偏好,按偏好降序排列,以候选人字母字符串的形式表示。例如,对于上述候选人名单,一个偏好顺序为 Appleton、Bass、然后是 Chang 的投票者的选票将表示为 abc

[2022/11/30 14:28:14] d232776997574c0db2de32dbb0223d31 cadbfgeih
[2022/11/30 14:28:14] bbe953105dfe4db2881bdd9242ad7d9d acfi
[2022/11/30 14:28:14] d84679cb55784d378bcf48b1beae36c7 acfi

运行计票#

在存放 votes.csv 的目录中,运行 process-votes.py

此脚本会生成 board_nominations.inivotedata.txt,供 Apache STeVe 计票脚本(stv_tool.py 使用。运行此脚本时,使用 -s 参数传递要选举的席位数。在下面的示例中,计票脚本将选出两名获胜者。您可以使用 -v 参数获取更详细的输出。

/path/to/steve/monitoring/stv_tool.py -s 2 votedata.txt

使用上述 votedata.txt 文件运行时,Appleton 和 Chang 当选。

John Appleton                            elected
Nancy Bass                               not elected
Carla Chang                              elected
Greg Donaldson                           not elected
Paula Edwards                            not elected
Kimiko Fukui                             not elected
Kanu Gandhi                              not elected
Eric Harris                              not elected
Susan Irving                             not elected

脚本由 Jason Weill (@jweill-aws) 编写