表与误差范围匹配
Table Matching With Margin of Error
我有两个表。每张表格的形式为
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()
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 为什么在浮点中从大到小会引入更多的误差
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 基于相邻元素 c++ 的分段误差范围的循环
- QImage::p ixel 和 QImage::setPixel 坐标超出范围误差
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 删除"超出矢量误差范围"的打印语句后输出不同的根本原因
- 定义范围,尽管C++舍入误差
- 表与误差范围匹配