首页 > 解决方案 > 验证影响评估方法数据时的错误和区域特征因素的问题

问题描述

这个问题与这个问题有些相关。

在编写方法之前,我正在尝试验证新影响评估方法的数据。方法数据包含全球和区域干预的特征因素。我在这里创建了一个小玩具示例。

我正在尝试按如下方式验证数据:

my_method = Method(('my method', 'a method', 'oh what a method'))

method_data = [
    (('biosphere', 'global intervention'),1, u'GLO'),
    (('biosphere', 'regional intervention'),1, u'REG')
]

my_method.validate(method_data)

出现以下错误:

MultipleInvalid: expected a list @ data[0]

尝试在未经验证的情况下编写方法时不会发生错误。可以通过将数据存储在列表而不是元组中来避免该错误。

这是包中的错误还是我做错了什么?

此外,我正在测试为每个特征因素指定区域标识符(如上面的数据所示)。这似乎不是必需的,但是当指定一个标识符时u'GLO',在随后的 lca 计算中不考虑影响。我在我的示例笔记本中对此进行了测试。

是否应该避免为特征因素指定区域标识符?

标签: brightway

解决方案


验证您的新方法

发生的情况是,您需要将 CFs “组织”为列表列表,而不是元组列表:

    my_method = Method(('my method', 'a method', 'oh what a method'))
    method_data = [
        [('biosphere', 'global intervention'),1, u'GLO'],    
        [('biosphere', 'regional intervention'),1, u'REG']
    ]
    my_method.validate(method_data)

验证现有方法

假设您要复制现有方法,并更新一些 CF(或添加位置或不确定性数据)。您会很想使用类load()函数中的方法数据Method,但该数据不是“有效”格式。

method_data = Method(('CML 2001 (obsolete)', 
    'acidification potential', 'generic')).load()

...
# modify the `method_data`

my_new_method = Method(('my method', 'a method', 'oh what a method'))
my_new_method.validate(method_data) 

这将产生以下错误:



MultipleInvalid                           Traceback (most recent call last)
<ipython-input-27-2fa012f6d12b> in <module>
      2 my_method = Method(('my method', 'a method', 'oh what a method'))
      3 my_method.validate([list(item) for item in method_data])
----> 4 my_method.validate(method_data)

/opt/conda/lib/python3.9/site-packages/bw2data/data_store.py in validate(self, data)
    277     def validate(self, data):
    278         """Validate data. Must be called manually."""
--> 279         self.validator(data)
    280         return True

/opt/conda/lib/python3.9/site-packages/voluptuous/schema_builder.py in __call__(self, data)
    270         """Validate data against this schema."""
    271         try:
--> 272             return self._compiled([], data)
    273         except er.MultipleInvalid:
    274             raise

/opt/conda/lib/python3.9/site-packages/voluptuous/schema_builder.py in validate_sequence(path, data)
    644                     errors.append(invalid)
    645             if errors:
--> 646                 raise er.MultipleInvalid(errors)
    647 
    648             if _isnamedtuple(data):


MultipleInvalid: expected a list @ data[0]

您必须先将其转换为列表列表:

my_method.validate([list(item) for item in method_data])

推荐阅读