modelx v0.13.0 (2021年2月23日)#
本次发布引入了以下改进。
功能增强#
new_module方法介绍#
modelx允许在模型中通过将模块赋值给引用来引用模块。 例如,要从一个Space中引用numpy模块, 用户只需将该模块赋值给一个引用:
>>> import numpy as np
>>> space.np = np
这适用于Python标准库和第三方包中的模块,例如math和numpy。当引用这些模块的Models被保存时,这些模块本身不会被保存在Models中,而是保存模块的名称。当Models被重新读取时,Python解释器能够借助Python的导入系统找到这些模块,并再次正确引用它们。
然而,用户可能还需要引用自己编写的模块(用户模块)。用户模块通常不会作为包安装在Python的导入系统中,而是位于用户的当前目录。在Models中通过相同的赋值操作引用这些模块会存在问题,因为当这些Models被保存并重新读取时,当前目录可能已更改,或者引用的模块可能已被用户移动或删除。
为了使用户模块可移植,
引入了Model.new_module和
UserSpace.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_pandas和Model.new_pandas的默认行为已发生变化,它们现在会直接将 pandas 对象(DataFrame 或 Series)分配给引用,而非分配PandasData对象。若向exposed_data参数传入False,这些方法的行为将与前一版本保持一致,即分配PandasData对象而非 pandas 对象(DataFrame 或 Series)本身。