#journal #multiplayer-game #game #command-line-utilities #data-management #text-processing

bin+lib kda-tools

用于在比赛日志上进行数据管理的工具,特别适用于《猎杀:对决》,但也可用于任何运动/游戏

3 个版本 (1 个稳定版)

1.3.1 2023 年 6 月 12 日
0.9.0 2021 年 5 月 13 日
0.1.1 2021 年 3 月 27 日

#154游戏

每月 30 次下载

自定义许可证

8MB
847

包含 (debian 软件包,1MB) releases/kda-tools_1.1.0_amd64.deb,(debian 软件包,575KB) releases/kda-tools_0.1.1_amd64.deb,(debian 软件包,650KB) releases/kda-tools_0.2.0_amd64.deb,(debian 软件包,780KB) releases/kda-tools_0.8.0-ALPHA_amd64.deb,(debian 软件包,795KB) releases/kda-tools_0.8.1_amd64.deb,(debian 软件包,1MB) releases/kda-tools_0.9.0_amd64.deb 以及更多

这些工具帮助您在多玩家竞技游戏中的装备选择上进行 Alpha/Beta 测试。特别是,它非常适合检查 KDA,包括时间上的和检查特定配置的 KDA。

什么?

我经常玩 猎杀:对决。它非常有趣。有时也会非常沮丧。这款游戏时长很长,非常紧张,战斗快,角色特化和装备选项非常丰富。可能需要打几十场比赛才能确定某个配置是否值得,而且配置很多,一场比赛要花一个小时 ... 简而言之,很难得到关于哪些装备配置、战术或朋友有用的反馈。

为此,我记录了比赛日志,并编写了这个工具来输出收集到的数据的一些见解。

使用它,您必须记录比赛信息。但比赛要花一个小时,所以这并不增加多少开销。

然后,您需要使用该软件包提供的工具

  • kda-summary 将总结整个日志中的 K、D、A 值(以及通常的 KDA 指标)。
  • kda-compare 将运行整个数据集,并告诉您是否在不同的配置下有显著的不同。
  • kda-explore 允许您查看带和不带有任何其他东西的条件分布 的任何东西

适用于 Debian / WSL

目前,只需从releases/目录中获取一个测试deb包即可。例如 1.3.0

然后,在 wsl 中,

sudo dpkg -i kda-tools_1.3.0_amd64.deb

您可以直接使用上面的示例。

基础知识

保持如下匹配日志(请注意,这是一个 键值计数格式 )。

<date> [<items or friends initials>] [K|D|A|B]

例如,我的狩猎日记看起来像这样

2021-03-12 BAR+Scope pistol K K B alone
2021-03-12 BAR+Scope pistol K D D jb
2021-03-12 Short-Rifle Short-Shotgun K D jb
2021-03-12 BAR+Scope pistol D jp+jb
2021-03-13 BAR+Scope pistol jp D
2021-03-13 BAR+Scope pistol jp B D D A A
2021-03-13 Shotgun pistol jp D
2021-03-13 BAR+Scope pistol jp K
2021-03-14 Short-Rifle akimbo  alone
2021-03-17 LAR Sil pistol  alone
2021-03-17 pistol-stock akimbo  alone
2021-03-17 Short-Shotgun pistol-stock  alone

而我的常用副驾驶JP有一个像这样的

2021-04-19 Martini-Henri_IC1 Caldwell_Conversion_Chain JV B B K
2021-04-19 Martini-Henri_IC1_Deadeye Caldwell_Conversion_Chain JV JB
2021-04-19 Martini-Henri_IC1_Deadeye Caldwell_Conversion_Chain JV JB B B
2021-04-19 Vetterli_71_Karabiner Bornheim_No_3 JV JB B B
2021-04-19 Vetterli_71_Karabiner Caldwell_Conversion JV JB D
2021-05-02 Martini-Henri_IC1 Caldwell_Conversion_Chain JV JB A
2021-05-02 Lebel_1886_Marksman Caldwell_Conversion_Chain JV JB K K
2021-05-02 Lebel_1886_Marksman Caldwell_Conversion_Chain JV JB K K
2021-05-02 Martini-Henri_IC1_Deadeye Caldwell_Conversion_Chain JV JB B B B B K K K

他比我好得多。您可以使用任何您想要用来表示装备或朋友的内容 ... 它将只对所有这些内容运行多元假设测试,其中重要的部分是:K D A 或 B,例如...

examples/journal.txt的内容

2021-01-03 K K Sniper
2021-01-03 K D Shotgun
2021-01-04 K K JP Sniper
2021-01-04 K D B Shotgun JB
2021-01-04 K D B Sniper JB

是5场比赛

  1. 两次使用狙击步枪装备的击杀
  2. 一次击杀和一次死亡,使用霰弹枪装备
  3. 两次击杀,使用狙击步枪装备和队友"JP"
  4. 一次击杀、一次死亡和一次赏金,使用霰弹枪和队友"JB"
  5. 相同,但使用狙击步枪装备

自动:KDA摘要

让我们看看随着时间的推移摘要情况如何

$ <journal.txt kda-summary
    n       Date   K   D   A   B   KDA    sK    sD    sA    sB  mKDA    mK    mD    mA    mB
    1 2021-01-03   2   0   0   0  2.00     2     0     0     0  2.00  2.00  0.00  0.00  0.00
    2 2021-01-03   1   1   0   0  1.00     3     1     0     0  3.00  1.50  0.50  0.00  0.00
    3 2021-01-04   2   0   0   0  2.00     5     1     0     0  5.00  1.67  0.33  0.00  0.00
    4 2021-01-04   1   1   0   1  1.00     6     2     0     1  3.00  1.50  0.50  0.00  0.25
    5 2021-01-04   1   1   0   1  1.00     7     3     0     2  2.33  1.40  0.60  0.00  0.40

还不错。注意,kda-summary 需要 使用标签 K 表示击杀、D 表示死亡、B 表示赏金、A 表示助攻。它输出您每场比赛的统计数据(K、D、A、B列),该场比赛的KDA值 (K+A)/D,K、D、A和B的运行总和(接下来的4列)以及KDA、K、D、A和B随时间变化(最后5列)的平均值(平均/比赛)。如果您想在这里停止并拉取这些数据到另一个程序,也可以。

注意日期字段 Date。如果您在日志的每行中放置日期格式为 YYYY-MM-DD 的日期,它将填充该字段。请参见上面的示例或 kvc。如果您不喜欢日期的格式要求,可以在那里提交错误报告。

半自动:KDA比较

那么,哪个装备或合作伙伴更好?KDA比较为您做了一些测试。

$ <journal.txt kda-compare
Processed. Read: 5 rows and 8 variables

[====================================================] 100.00 % 2696.14/s 
met    grp      n/d      val   N     n/d      ~val  M     p
kda    Sniper   5/1      5.00   3    2/2      1.00   2    0.06
kda    JP       2/0      inf    1    5/3      1.67   4    0.49
kda    Shotgun  2/2      1.00   2    5/1      5.00   3    0.77
kda    JB       2/2      1.00   2    5/1      5.00   3    0.78
b/d    Sniper   1/1      1.00   3    1/2      0.50   2    0.24
b/d    Shotgun  1/2      0.50   2    1/1      1.00   3    0.69
b/d    JB       2/2      1.00   2    0/1      0.00   3    NaN
b/d    JP       0/0      NaN    1    2/3      0.67   4    NaN

让我们看看。第一行是 met grp ... 这些是

  • 指标名称(例如,kda或赏金/死亡b/d)
  • 项目组(grp)
  • 值计数(n)
  • 死亡(d)
  • 带有grp的指标的'val'值
  • 使用grp的匹配数量(N)
  • 没有grp的值计数(n)
  • 没有grp的死亡计数(d)
  • 没有grp的指标的'val'值
  • 没有grp的匹配数量(M)
  • 以及在没有grp的情况下观察到该'val'的概率。

您可以看到每个项目的pvp指标(kda或(击杀+助攻)/死亡),以及pve指标(赏金/死亡)。

最后一个,p,通常被称为p值,如果它很低,那么您使用grp的回合比没有grp的回合要好得多。

在上面的数据中,使用 Sniper 武器的回合似乎比不使用它的回合要好得多,给定 p 值很小。

注意,有些 NaN,因为当我与JP一起玩时,我没有得到赏金或死亡(0/0),这并不是一个有意义的比较结果。不那么明显的是,当我与JB一起玩时,我也无法得到p值,因为在我不与JB一起玩的回合中,我 从未 得到赏金。这意味着对于 基线(没有JB)的情况,没有有意义的表示。

好吧,那么呢?自己得出结论,并尝试混合你的装备。如果你只和你的朋友JP玩狙击手,只和你的朋友JB玩霰弹枪,它们将高度相关,可能很难看出JB或霰弹枪哪个更有影响。

有一个选项-i可以忽略某些物品。如果你只想看武器,这很有用。

让我们忽略我的僚机JP和JB,只检查武器。

$ <journal.txt kda-compare -i JP JB
Processed. Read: 5 rows and 8 variables

[====================================================] 100.00 % 3450.51/s 
met    grp      n/d      val   N     n/d      ~val  M     p
kda    Sniper   5/1      5.00   3    2/2      1.00   2    0.08
kda    Shotgun  2/2      1.00   2    5/1      5.00   3    0.77
b/d    Sniper   1/1      1.00   3    1/2      0.50   2    0.24
b/d    Shotgun  1/2      0.50   2    1/1      1.00   3    0.69

现在我们看到狙击手在KDA上略有下降,但b/d没有变化。

你也可以测试配对(组大小=2)

$ <journal.txt kda-compare --group-size 2
Processed. Read: 5 rows and 8 variables

[==================================================] 100.00 % 8175.42/s 
met    grp         n/d      val   N     n/d      ~val  M     p
kda    JP+Sniper   2/0      inf    1    5/3      1.67   4    0.47
kda    JB+Sniper   1/1      1.00   1    6/2      3.00   4    0.78
kda    JB+Shotgun  1/1      1.00   1    6/2      3.00   4    0.79
b/d    JB+Shotgun  1/1      1.00   1    1/2      0.50   4    0.62
b/d    JB+Sniper   1/1      1.00   1    1/2      0.50   4    0.64
b/d    JP+Sniper   0/0      NaN    1    2/3      0.67   4    NaN

现在我们看到朋友/武器配对之间没有真正差异。注意inf结果。你可能认为无穷大是无法分析的。但是,因为我们使用的是bootstrap方法(见poisson-rate-test),你实际上可以得到有意义的概率,因此可以得到有意义的p值。

为了确认朋友是一个干扰变量(没有统计上显著差异),尝试忽略武器

$ <journal.txt kda-compare -i Sniper Shotgun
Processed. Read: 5 rows and 8 variables

[====================================================] 100.00 % 3948.08/s 
met    grp n/d      val   N     n/d      ~val  M     p
kda    JP  2/0      inf    1    5/3      1.67   4    0.49
kda    JB  2/2      1.00   2    5/1      5.00   3    0.77
b/d    JB  2/2      1.00   2    0/1      0.00   3    NaN
b/d    JP  0/0      NaN    1    2/3      0.67   4    NaN

这里我们确实看到,僚机的选择对武器选择的影响要小得多(比较之前的两个例子中的值)

使用

$ kda-compare -h
It *expects* input in kvc format (one match per line), and processs the variables K, D, and A, as a function of *all
other* variables present. It ignores kvc keywords / fields (like dates), but you'll have to specify other things to
ignore manually.


USAGE:
    kda-compare [FLAGS] [OPTIONS]

FLAGS:
    -f               Speed up computation by doing a fewer number of iterations. Helpful for quick looks but the
                     ordering of some sets may change across multiple invocations
    -h, --help       Prints help information
    -n               Display notes about particular test cases in the output
    -V, --version    Prints version information

OPTIONS:
    -g, --group-size <group_size>    Instead of individual items (group_size==1), rank by enumerated groupings that
                                     appear in data of a given size. [default: 1]  [possible values: 1, 2, 3, 4]
    -i <ignore>...                   List of fields to ignore (if they appear in data). You can ignoring fields A B and
                                     C as '-i A,B,C' or '-i A -i B -i C' but not '-i A B C' or '-i A, B, C'. That's
                                     because of shell magic, not becuase of the way it was implemented
    -o <out_format>                  Output format which can be one of Vnlog or Whitespace-,  Tab-, or Comma-seperated.
                                     [default: wsv]  [possible values: wsv, tsv, csv, vnl]

手册:KDA-Explore

要真正深入,你可以评估任何变量的条件分布,条件是任何其他变量的发生。这就是kda-explore的作用。

我的意思是,kda-explore中'K'与'k'与"杀"的语义无关。我们通过要求它按名称分析变量来探索数据。例如,在上面的数据中,要查看使用狙击手和不使用狙击手的比赛中的“K”个“杀”,你形成表示为“K:Sniper”的“实验”,并要求kda-explore通过kda-explore "K : Sniper"运行该实验。

$ < journal.txt kda-explore K:Sniper
Processed. Read: 5 rows and 8 variables
Varibables found: Date Sniper K D Shotgun JP B JB 
Debug: processing: K:Sniper
met    grp     n     M     rate  ~n    ~M    ~rate p     notes
K      Sniper  5     3     1.67  2     2     1.00  0.37

这意味着当你有狙击手时,杀的概率更高,但不是那么高,以至于它可能不会随着时间的推移而有很大差异(p .37)。我们这里只检查杀。死亡呢?

$ < journal.txt kda-explore D:Sniper
Processed. Read: 5 rows and 8 variables
Varibables found:
Date Sniper K Shotgun D JP B JB 
Debug: processing: D:Sniper
met    grp     n     M     rate  ~n    ~M    ~rate p     notes
D      Sniper  1     3     0.33  2     2     1.00  0.19

你可以运行许多用'vs'分隔的实验,针对许多输出变量...所有这些都是有效的

  • kda-explore "K D : Sniper vs Shotgun"来查看与狙击手和霰弹枪相比的杀和死亡
  • kda-explore "D : K"来查看你是否在杀人时死亡更多
  • kda-explore "Sniper: JB"来查看你是否在JB在场时玩狙击手更多或更少
  • kda-explore K:all来查看所有变量的杀散布和排序率比较

等等...每个“标签”(日志中的行上的物品)都是根据你的实验决定的有效输入或输出。

使用

$ kda-explore -h
USAGE:
    kda-explore [OPTIONS] <command>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -o <out_format>        Output format which can be one of Vnlog or Whitespace-,  Tab-, or Comma-seperated. [default:
                           wsv]  [possible values: wsv, tsv, csv, vnl]

ARGS:
    <command>    The A/B comparison to run, of the form '<some variables : <other variables>'. e.g., 'K: pistol'
                 will check kills with and wtihout pitols [default: K D A : all]

一种解释方法是“这没有意义”。这是真的,它仍然很原始,主要是我自己使用的玩具。

待办事项

  • 更好地记录比赛日志格式。见:github.com/jodavaho/kvc.git
  • 改进比赛日志以允许:计数。(再次见kvc)
  • 提供比赛日志的linter
  • 创建/分解矩阵的工具,格式适合第三方分析(例如R)
  • 执行功率测试/实验设计
  • 移除'-c'作为必选开关...当移除了基线'_'时已过时
  • 提供C库版本
    • C++,
    • Rust

已知问题

  • 如果您有一个在每一局游戏中都会使用的物品,那么您数据不足。对于形式为 k:A 的每个测试,必须有至少一个不出现 A 的匹配。如果没有击杀 (k) 也可以。

依赖项

~12MB
~190K SLoC