表与误差范围匹配

Table Matching With Margin of Error

本文关键字:范围 误差      更新时间:2023-10-16

我有两个表。每张表格的形式为

x   y   m   me
5   6   7   .01
12  14  6   INDEF

两者都是.txt文件。表2具有相似的值,但偏移了一个较小的差值(小于0.01),该差值在值之间不是恒定的,可以是正的,也可以是负的。构成表1中的行2的不一定是表2中的行2。我的输出应该是格式

x1  x2 xdiff  y1   y2    ydiff
5    6   1     5   5.1   .1

其中,x1是来自表1的适当片段的x值,x2是来自表2的值,xdiff是两者之间的差,对于所有列以类似的方式继续。在任一值为INDEF的情况下(它们将始终是数字或那个),差值也应读取INDEF。两个表的行数相同,但可以是4行到2000行以上。它们的列总是按相同的顺序排列。

我知道如何在topcat中做类似的事情,但现在我需要用C++、Python3.x或其他语言来做(尽管这两种语言是我的第一选择)。我没有任何类型的编程经验我应该查看哪些命令?我想使用X或Y列来找到合适的匹配数据集,因为m列的值范围非常有限。

您真的应该考虑将数据移动到SQL,这样您就不必不断地重新发明轮子了。

以下代码主要执行您想要的操作。

浮点稳定性问题可以通过使用decimal.Decimal来隐藏,但在执行此操作之前,您应该仔细考虑这些问题。

#!/usr/bin/env python3
def parse(val):
    if val == 'INDEF':
        return float('nan')
    return float(val)
def unparse(val):
    if val != val:
        return 'INDEF'
    return str(val)
def main():
    import sys
    if len(sys.argv) != 3:
        sys.exit('Usage: ./join.py table1.txt table2.txt')
    with open(sys.argv[1]) as af, open(sys.argv[2]) as bf:
        a_keys = next(af).split()
        b_keys = next(bf).split()
        common_keys = sorted(set(a_keys) & set(b_keys))
        print('t'.join('%s1t%s2t%sdiff' % (k, k, k) for k in common_keys))
        for a_line, b_line in zip(af, bf):
            a_bits = {k: parse(v) for (k, v) in zip(a_keys, a_line.split())}
            b_bits = {k: parse(v) for (k, v) in zip(b_keys, b_line.split())}
            print('t'.join('%st%st%s' % (unparse(a_bits[k]), unparse(b_bits[k]), unparse(abs(a_bits[k] - b_bits[k]))) for k in common_keys))
if __name__ == '__main__':
    main()