modelx v0.13.0 (2021年2月23日)#

本次发布引入了以下改进。

功能增强#

new_module方法介绍#

modelx允许在模型中通过将模块赋值给引用来引用模块。 例如,要从一个Space中引用numpy模块, 用户只需将该模块赋值给一个引用:

>>> import numpy as np

>>> space.np = np

这适用于Python标准库和第三方包中的模块,例如mathnumpy。当引用这些模块的Models被保存时,这些模块本身不会被保存在Models中,而是保存模块的名称。当Models被重新读取时,Python解释器能够借助Python的导入系统找到这些模块,并再次正确引用它们。

然而,用户可能还需要引用自己编写的模块(用户模块)。用户模块通常不会作为包安装在Python的导入系统中,而是位于用户的当前目录。在Models中通过相同的赋值操作引用这些模块会存在问题,因为当这些Models被保存并重新读取时,当前目录可能已更改,或者引用的模块可能已被用户移动或删除。

为了使用户模块可移植, 引入了Model.new_moduleUserSpace.new_module 方法。这些方法允许用户 定义一个引用(Reference),将用户模块分配给该引用,并 将该用户模块与模型目录中模块的源文件关联, 从而可以将模块的源代码保存在包含的模型中。

示例

假设以下代码保存在当前目录下的“sample.py”文件中。

def triple(x)
    return 3 * x

以下代码在 space 中创建了一个名为 "foo" 的引用:

>>> space.new_module("foo", "modules/sample.py", "sample.py")

该模块在space中可通过foo访问:

>>> space.foo
<module 'sample' from 'C:\\path\\to\\samplemodule.py'>

>>> @mx.defcells(space)
... def bar(y):
        return foo.triple(y)

>>> space.foo.bar(3)
9

model作为space的顶级父模型。接下来的代码会在当前目录下创建一个名为"model"的文件夹,并在"model"目录内,根据该方法path参数的指定,将模块保存为"modules"子目录中的"sample.py"文件。

>>> model.write("model")

通过new_pandas直接分配DataFrame/Series#

UserSpace.new_pandas ,之前介绍的方法, 以及Model.new_pandas现在具有 一个新的默认行为:将作为data参数传递的 pandas DataFrame/Series对象分配给Reference, 而不是分配与pandas对象关联的PandasData对象。 通过向新引入的expose_data参数传递False, 可以将默认行为更改为与之前一致的行为, 即分配PandasData对象给Reference而不是pandas对象本身。

向后不兼容的变更#

  • 由前一版本 modelx (v0.12.1) 保存的模型在当前版本中可完美运行。不过,UserSpace.new_pandasModel.new_pandas 的默认行为已发生变化,它们现在会直接将 pandas 对象(DataFrameSeries)分配给引用,而非分配 PandasData 对象。若向 exposed_data 参数传入 False,这些方法的行为将与前一版本保持一致,即分配 PandasData 对象而非 pandas 对象(DataFrameSeries)本身。