Python函数和有状态对象

功能

提供的函数在标准Python数据分析堆栈中没有直接模拟,或者需要有关系统内部状态的信息,超出了函数调用中存在的信息。它们以一种使模型元素易于调用的结构提供。这些函数可能与Vensim或Stella给出的原始函数类似,但有时参数的数量或顺序可能会发生变化。

pysd.py_backend.functions.ramp(time, slope, start, finish=None)[源代码]

实现vensim和xmile的RAMP功能。

参数:
  • time (pysd.py_backend.components.Time) -- 模型时间对象。

  • slope (float or xarray.DataArray) -- 坡道的斜坡在时间开始时从零开始。

  • start (float or xarray.DataArray) -- 坡道开始的时间。

  • finish (float or xarray.DataArray or None (oprional)) -- 渐变结束的时间。如果为“无”,则渐变将永远不会结束。默认为无。

返回:

如果在斜坡启动之前,则返回零。如果在渐变结束之后,返回渐变的顶部。

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.step(time, value, tstep)[源代码]

“实现vensim的Step功能。

参数:
返回:

  • 在范围[-inf,tStep)中:

    返回0

  • 范围内 [tstep, +inf] :

    返回 value

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.pulse(time, start, repeat_time=0, width=None, magnitude=None, end=None)[源代码]

实现Vensim的PulSE和PulSE TRAIN功能以及Xmile的PulSE功能。

参数:
  • time (pysd.py_backend.components.Time) -- 模型时间对象。

  • start (float) -- 脉冲的开始时间。

  • repeat_time (float (optional)) -- 脉冲重复的时间间隔。如果为0,它将返回单个脉冲。默认为0。

  • width (float or None (optional)) -- 脉冲的持续时间。如果无,将仅生成一次性_步脉冲。默认为无。

  • magnitude (float or None (optional)) -- 脉冲的幅度。如果无,当脉冲发生时它将返回1,类似于幅度=time_Step()。默认为无。

  • end (float or None (optional)) -- 脉搏的最终时间。如果没有,就没有最后时间。默认为无。

返回:

  • 在范围[-inf,start]中:

    返回0

  • 在范围内[开始+ n repeat_time, start + n 重复时间+宽度):

    返回幅度/时间步或1

  • 在范围内[开始+ n repeat_time + width, start + (n+1) repeat_time):

    返回0

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.if_then_else(condition, val_if_true, val_if_false)[源代码]

实现Vensim的IF THEN ELSE功能。https://www.vensim.com/documentation/20475.htm

参数:
  • condition (bool or xarray.DataArray of bools)

  • val_if_true (callable) -- 条件为真时要评估并返回的值。

  • val_if_false (callable) -- 条件为假时要评估并返回的值。

返回:

该值取决于条件。

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.xidz(numerator, denominator, x)[源代码]

实现Vensim的XIDZ功能。https://www.vensim.com/documentation/fn_xidz.htm

该函数执行一个除,对于分母为零是稳健的。在分母为零的情况下,返回最终参数。

参数:
返回:

  • 分子/分母(如果分母> small_vensim)

  • 否则,值_if_denom_is_零

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.zidz(numerator, denominator)[源代码]

该函数绕过除零错误,实现Vensim的ZIDZ函数。https://www.vensim.com/documentation/fn_zidz.htm

参数:
返回:

  • 分子/分母(如果分母> small_vensim)

  • 否则为0或0 s数组

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.active_initial(stage, expr, init_val)[源代码]

实现vensim的Active INITIAL功能

参数:
  • stage (str) -- 模型的阶段。

  • expr (callable) -- 运行阶段价值

  • init_val (float or xarray.DataArray) -- 预设阶段价值。

返回:

  • inti_val if stage =''

  • expr()否则

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.incomplete(*args)[源代码]

实现不完整的功能。通知RuntimeWarning。

参数:

*args (arguments)

返回类型:

numpy.nan

pysd.py_backend.functions.not_implemented_function(*args)[源代码]

实现未实现的功能。如果被调用,将引发NotImplemented错误。

参数:

*args (arguments) -- 第一个参数必须是函数的名称,作为字符串,才能正确打印错误消息。

pysd.py_backend.functions.integer(x)[源代码]

实现Vensim的INTEGER函数。

参数:

x (float or xarray.DataArray) -- 输入值。

返回:

integer --返回x的整部分。

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.quantum(a, b)[源代码]

实现Vensim的QUANTUM函数。

参数:
返回:

quantum --如果b > 0,返回b * integer(a/b)。否则,返回a。

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.modulo(x, m)[源代码]

实现Vensim的MODULO功能。

参数:
返回:

modulo --返回以m为模的x,如果x小于0,则结果在范围(-m,0]内给出,就像Vensim所做的那样。x -量子(x,m)

返回类型:

float or xarray.DataArray

pysd.py_backend.functions.sum(x, dim=None)[源代码]

实现Vensim的SUM功能。

参数:
  • x (xarray.DataArray) -- 输入值。

  • dim (list of strs (optional)) -- 要应用该功能的维度。如果没有给出,该功能将应用于所有维度。

返回:

sum --给定维度上的和运算结果。

返回类型:

xarray.DataArray or float

pysd.py_backend.functions.prod(x, dim=None)[源代码]

实现Vensim的PROD功能。

参数:
  • x (xarray.DataArray) -- 输入值。

  • dim (list of strs (optional)) -- 要应用该功能的维度。如果没有给出,该功能将应用于所有维度。

返回:

prod --产品在给定维度上运营的结果。

返回类型:

xarray.DataArray or float

pysd.py_backend.functions.vmin(x, dim=None)[源代码]

实现Vensim的Vmin函数。

参数:
  • x (xarray.DataArray) -- 输入值。

  • dim (list of strs (optional)) -- 要应用该功能的维度。如果没有给出,该功能将应用于所有维度。

返回:

vmin --给定尺寸的最小值的结果。

返回类型:

xarray.DataArray or float

pysd.py_backend.functions.vmax(x, dim=None)[源代码]

实施Vensim的VMAX功能。

参数:
  • x (xarray.DataArray) -- 输入值。

  • dim (list of strs (optional)) -- 要应用该功能的维度。如果没有给出,该功能将应用于所有维度。

返回:

vmax --维度上最大值的结果。

返回类型:

xarray.DataArray or float

pysd.py_backend.functions.invert_matrix(mat)[源代码]

实现Vensim的INVERT MATRIX功能。

反转xarray.DataArray的最后两个维度定义的矩阵。

参数:

mat (xarray.DataArray) -- 要反转的矩阵。

返回:

mat1 -- Inverted matrix.

返回类型:

xarray.DataArray

pysd.py_backend.functions.vector_select(selection_array, expression_array, dim, missing_vals, numerical_action, error_action)[源代码]

实现Vensim的VECTOR SELECT函数。http://vensim.com/documentation/fn_vector_select.html

参数:
  • selection_array (xr.DataArray) -- 这指定了一个混合有零和非零值的选择数组。

  • expression_array (xarray.DataArray) -- 这是根据选择数组选择元素的表达。

  • dim (list of strs) -- 要应用该功能的维度。

  • missing_vals (float) -- 在选择数组中只有零的情况下使用的值。

  • numerical_action (int) -- 要采取的行动: - 0它将计算加权和。 - 1当选择数组中的值非零时,这 将计算出 选择数组 * expression_array. - 2 The weighted minimum, for non zero values of the selection array, this is minimum of selection_array * express_数组。 - 3加权最大值,对于非零值 选择数组,这是最大 选择数组 * expression_array. - 4 For non zero values of the selection array, this is the average of selection_array * express_数组。 - 5当选择数组中的值为非零时, 这将计算产品的 array_array. - 6当选择数组中的值非零时, 这将计算expression_Array的和。 与中非零值的SUM函数相同 选择数组。 - 7当选择数组中的值非零时, 这将计算express_Array的积。 与中非零值的PROD函数相同 选择数组。 - 8未加权最小值,对于非零值 选择数组,这是expression_数组的最小值。 与中非零值的VMIN函数相同 选择数组。 - 9未加权的最大值,对于 选择数组,这是表达式数组的最大值。 与VMAX中的非零值函数相同 选择数组。 - 10对于选择数组的非零值, 这是express_Array的平均值。

  • error_action (int) -- 指示如何处理选择中过多或过少的条目: - 0未出现错误。 - 1仅在选择数组中引发浮点错误 包含零。 - 2如果选择数组包含更多内容,则引发错误 多于一个非零值。 - 3如果选择数组中的所有元素都是,则引发错误 零,或多个元素非零 (this是error_action = 1和error_action = 2的组合)。

返回:

result --数字动作的输出。

返回类型:

xarray.DataArray or float

pysd.py_backend.functions.vector_sort_order(vector, direction)[源代码]

实现Vensim的VECTOR SORT Order函数。排序是在相对于最后一个脚注的完整载体上完成的。https://www.vensim.com/documentation/fn_vector_sort_order.html

参数:
  • vector (xarray.DataArray) -- 要排序的向量。

  • direction (float) -- 对载体进行排序的方向。如果方向> 0,它将从最小到最大对载体条目进行排序,否则从最大到最小。

返回:

vector_sorted --排序的向量。

返回类型:

xarray.DataArray

pysd.py_backend.functions.vector_reorder(vector, svector)[源代码]

实现Vensim的VECTOR REOrder函数。重新排序是在相对于最后一个脚注的完整载体上完成的。https://www.vensim.com/documentation/fn_vector_reorder.html

参数:
返回:

vector_sorted --排序的向量。

返回类型:

xarray.DataArray

pysd.py_backend.functions.vector_rank(vector, direction)[源代码]

实现Vensim的VECTOR RANK功能。排名是在相对于最后一个脚注的完整载体上完成的。https://www.vensim.com/documentation/fn_vector_rank.html

参数:
  • vector (xarray.DataArray) -- 要排序的向量。

  • direction (float) -- 对载体进行排序的方向。如果方向> 1,它将从最小到最大,否则从最大到最小,对向最小进行排名。

返回:

vector_rank --载体的等级。

返回类型:

xarray.DataArray

pysd.py_backend.functions.get_time_value(time, relativeto, offset, measure)[源代码]

实现Vensim的Get TIME Value功能。警告,并非所有案件都得到实施。https://www.vensim.com/documentation/fn_get_time_value.html

参数:
  • time (pysd.py_backend.components.Time) -- 模型时间对象。

  • relativeto (int) -- 参考时间: - 0表示当前模拟时间。 - 1表示初始模拟时间。 - 2表示当前计算机时钟时间。

  • offset (float or xarray.DataArray) -- 计算值之前移动的时间差,以模型的时间单位衡量。当relativetto为2时,忽略偏差。

  • measure (int) -- 时间单位或衡量标准: - 模型中的0单位时间(仅适用于相对于0和1) - 公元前1年以来的1年(一个数字,与正常日历年相同) - 一年2个季度(1-4) - 一年中的3个月(1-12) - 每月4天(1-31) - 一周中的5天(0-6,其中0是星期日) - 1月1日起6天,公元前1年(公元前1年视为第0年) - 一天7小时(0-23) - 每小时8分钟(0-59) - 9分钟秒(0-59.999999 -不是整数) - 10秒以500,000为模(0- 499,999)

返回:

time_value --产生的时间值。

返回类型:

float or int

分配函数

The provided allocation functions have no direct analog in the standard Python data analytics stack. They are provided in a structure that makes it easy for the model elements to call. The functions may be similar to the original functions given by Vensim, but sometimes the number or order of arguments may change. The allocation functions may call a protected function or class method thatintegrates the algorithm to compute the allocation. The algorithms are briefly explained in these functions docstring.

备注

Vensim文档中解释了分配功能的基础。https://www.vensim.com/documentation/allocation_overview.html

警告

某些分配函数的结果可能与Vensim给出的结果不同,因为优化函数用于解决分配问题。这些算法的工作方式可能不同,或者在数字误差传播方面可能存在差异。

pysd.py_backend.allocation.allocate_available(request, pp, avail)[源代码]

实现Vensim的ALLOCATE AVAILAPLE功能。https://www.vensim.com/documentation/fn_allocate_available.html

参数:
  • request (xarray.DataArray) -- 每个目标的请求。它的形状应该是函数的预期输出之一,分配维度位于最后位置。

  • pp (xarray.DataArray) -- 每个目标的优先级。其形状应与要求相同,并在最后一个位置为优先级配置文件提供额外尺寸。有关更多信息,请参阅Vensim的文档https://www.vensim.com/documentation/24335.html

  • avail (float or xarray.DataArray) -- 可满足所有要求的总供应量。如果供应超过请求总数,则所有请求都会被填补,但没有一个请求会超额填满。如果您希望节省材料,则必须显式计算供应量减去总分配量。它的形状,应该与要求相同,没有最后一个维度。

返回:

out --供应的分配。

返回类型:

xarray.DataArray

警告

该函数使用优化方法来解决问题,给出的解决方案可能与Vensim中的解决方案不同。特别是,当接近定义的优先级配置文件的边界时。

pysd.py_backend.allocation.allocate_by_priority(request, priority, width, supply)[源代码]

实现Vensim的“按优先级分配”功能。https://www.vensim.com/documentation/fn_allocate_by_priority.html

参数:
  • request (xarray.DataArray) -- 每个目标的请求。其形状应该与优先级相同。除最后一个维度外,宽度和供应必须具有相同的形状。

  • priority (xarray.DataArray) -- 每个目标的优先级。它的形状应该和要求的一样。除最后一个维度外,宽度和供应必须具有相同的形状。

  • width (float or xarray.DataArray) -- 指定需要多大的优先级差距才能让分配首先进入更高的优先级,而只剩下剩余的优先级。当任何两个优先级之间的距离超过宽度并且较高优先级没有收到其完整请求时,较低优先级将不会收到任何内容。其形状应该与供应相同。

  • supply (float or xarray.DataArray) -- 可满足所有要求的总供应量。如果供应超过请求总数,则所有请求都会被填补,但没有一个请求会超额填满。 如果您希望节省材料,则必须显式计算供应量减去总分配量。其形状应与宽度相同。

返回:

out --供应的分配。

返回类型:

xarray.DataArray

国家元首

每个时间步都会使用和更新方法更新Stateful对象。其中包括整合、延迟、预测、平滑和趋势等。宏类和模型类也是有状态类型。然而,它们被定义为分开的,因为它们更复杂。

class pysd.py_backend.statefuls.Integ(ddt, initial_value, py_name)[源代码]

实现INTEK功能。

参数:
  • ddt (callable) -- 衍生整合。

  • initial_value (callable) -- 初始值。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。股票的价值。

类型:

float或xArray.DataArray

class pysd.py_backend.statefuls.NonNegativeInteg(ddt, initial_value, py_name)[源代码]

实现非负INTEK功能。

参数:
  • ddt (callable) -- 衍生整合。

  • initial_value (callable) -- 初始值。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。股票的价值。

类型:

float或xArray.DataArray

class pysd.py_backend.statefuls.Delay(delay_input, delay_time, initial_value, order, tstep, py_name)[源代码]

实现DELAY功能。

参数:
  • delay_input (callable) -- 延迟的输入。

  • delay_time (callable) -- 延迟时间

  • initial_value (callable) -- 初始值。

  • order (callable) -- 延迟命令。

  • tsetp (callable) -- 模型的时间步。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。延迟值乘以相应平均时间的数组。

类型:

numpy.Array或xray.DataArray

class pysd.py_backend.statefuls.DelayN(delay_input, delay_time, initial_value, order, tstep, py_name)[源代码]

实现DELAY N功能。

参数:
  • delay_input (callable) -- 延迟的输入。

  • delay_time (callable) -- 延迟时间

  • initial_value (callable) -- 初始值。

  • order (callable) -- 延迟命令。

  • tsetp (callable) -- 模型的时间步。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。延迟值乘以相应平均时间的数组。

类型:

numpy.Array或xray.DataArray

times

用于计算延迟输出的延迟时间数组。如果delay_time为常数,则此数组将为常数,DelayN将表现为Delay。

类型:

numpy.Array或xray.DataArray

class pysd.py_backend.statefuls.DelayFixed(delay_input, delay_time, initial_value, tstep, py_name)[源代码]

实现DELAY FixED功能。

参数:
  • delay_input (callable) -- 延迟的输入。

  • delay_time (callable) -- 延迟时间

  • initial_value (callable) -- 初始值。

  • tsetp (callable) -- 模型的时间步。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态,等于管道 [pointer] .

类型:

float或xArray.DataArray

pipe

延迟值列表。

类型:

列表

pointer

指向管道中最后一个值的指针

类型:

int

class pysd.py_backend.statefuls.Forecast(forecast_input, average_time, horizon, initial_trend, py_name)[源代码]

实现FORECAST功能。

参数:
  • forecast_input (callable) -- 预测的输入。

  • average_time (callable) -- 平均时间。

  • horizon (callable) -- 预测范围。

  • initial_trend (callable) -- 预测的初步趋势。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。Vensim文档的AV值。

类型:

float或xArray.DataArray

class pysd.py_backend.statefuls.Smooth(smooth_input, smooth_time, initial_value, order, py_name)[源代码]

实现SMOOTH功能。

参数:
  • smooth_input (callable) -- 输入的流畅。

  • smooth_time (callable) -- 平稳的时间。

  • initial_value (callable) -- 初始值。

  • order (callable) -- 延迟命令。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。具有在最后一个位置返回的值的输入数组。

类型:

numpy.Array或xray.DataArray

class pysd.py_backend.statefuls.Trend(trend_input, average_time, initial_trend, py_name)[源代码]

实现趋势功能。

参数:
  • trend_input (callable) -- Input of the trend.

  • average_time (callable) -- 平均时间。

  • initial_trend (callable) -- 初步趋势。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。Vensim文档的AV值。

类型:

float或xArray.DataArray

class pysd.py_backend.statefuls.SampleIfTrue(condition, actual_value, initial_value, py_name)[源代码]

实现SAMPLE IF True功能。

参数:
  • condition (callable) -- 样品条件。

  • actual_value (callable) -- 条件为true时更新的值。

  • initial_value (callable) -- 初始值。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态。当条件为真时,最后一个实际值,或者当条件从未为真时,最后一个实际值。

类型:

float或xArray.DataArray

class pysd.py_backend.statefuls.Initial(initial_value, py_name)[源代码]

实现初始功能。

参数:
  • initial_value (callable) -- 初始值。

  • py_name (str) -- 用于标识对象的Python名称。

state

对象的当前状态,始终是initial_val值。

类型:

float或xArray.DataArray