Engee 文档

在工程中使用WorkspaceArray

工作架;工作架 —这是Engee建模环境中的一种特殊数据类型,专为存储和处理时间序列而设计。 它实现了接口 抽象阵列 语言 Julia,但与标准数组不同,它会延迟加载数据。

工作架;工作架 它不会将数据完全存储在RAM中,而是根据需要加载它:例如,在迭代,访问索引或转换为表时。 这使您能够有效地处理不适合内存或来自外部源(例如,来自数据库或文件)的非常大的数据集。

工作架;工作架 *Engee*用于以下情况:

  • 作为模拟的结果,它用于存储记录的信号。 例如,在变量 模拟,模拟 (有关详细信息,请参阅 Engee中仿真结果的软件处理);

  • 通过块在模型之间传输数据 至工作区来自工作区;

  • 要从CSV文件或表导入自定义时间序列(数据帧),然后可以在*Engee*模型中使用。

所以, 工作架;工作架 它提供了一个单一的和用户友好的界面,用于访问整个模拟的时间数据,从输入数据准备到结果分析。

创建WorkspaceArray

通常情况下 工作架;工作架 它是在仿真过程中自动生成的,例如,当通过块记录信号时 至工作区 或者将结果保存到变量时 simout

但是,它也可以手动创建,例如,加载外部数据或在预先准备的输入上测试模型。 在这种情况下 工作架;工作架 它是使用以下方法之一创建的:

  • 来自CSV文件。 要从CSV文件下载数据,只需指定文件的路径即可。:

    my_wa = WorkspaceArray("my_wa", "/user/path_to_csv.csv")

    这里 "my_wa" -这是保存数组的名称 变量的窗口 variables article 2 1 Engee。 它用于模型、脚本和其他应用程序中的后续数组引用。

    CSV文件必须包含两列:一列*必需*名称 时间 第二个是信号值。 CSV文件结构示例:

    time,value
    0.1,1
    0.2,2
    0.3,3
  • 从表 数据帧. 如果您已经在Julia中使用表格数据,则可以创建 工作线/工作线 直接从对象 数据帧. 这在以编程方式生成输入信号时,在数据分析或转换期间尤其有用。

    数据帧 —这是从包的表格结构 数据帧。jl,类似于Excel中的表格或Python中的DataFrame(pandas)。 每列都有一个名称和类型,数据存储在行中。 创造的例子:

    using DataFrames
    
    df = DataFrame(time = [0.1, 0.2, 0.3], value = [1, 2, 3])
    wa = WorkspaceArray("my_wa", df)

    该表应包含两列: 时间 (类型 漂浮64)和 价值 (它可以是标量,矢量或数字数组)。

使用WorkspaceArray

工作架;工作架 实现接口 抽象阵列,这允许它在Julia—indexed,iterated,sliced等中作为常规数组访问。 但是,除了数组的基本行为, 工作架;工作架 它包含一个内部结构和其他字段,这些字段将其链接到数据源,支持延迟加载,并方便使用时间序列。

每个 工作架;工作架 —这不仅仅是一组数字,而是一个具有"元数据"的对象:它知道它的数据位于何处,它与时间的关系如何,从哪里下载,以及它是如何接收的。 这些附加属性可以通过简单地通过点访问对象的字段来直接请求。:

wa = WorkspaceArray("my_wa")
wa.time    # 访问时间戳
wa.value   # 对值的访问
wa.type    # 让我们找出哪种类型的数组是:pair,:time或:value

以下字段可用:

  • 时间 -附属公司 工作架;工作架,只包含时间戳。 有一个类型 :时间;

  • 价值 -附属公司 工作架;工作架,包含信号的值。 有一个类型 :价值;

  • 类型 -当前数组的类型: :时间, :价值:对 (时间戳+值);

  • 家长/家长 -链接到父帐户 工作架;工作架 如果当前是切片的结果;

  • 范围 -创建切片所依据的索引范围。 用于懒惰切片;

  • 尺寸 -字段中数据的维度 价值 (例如,标量,矢量,矩阵);

  • 信号_id -*Engee*中数据源的唯一标识符。

最常见的工作时 工作架;工作架 字段直接使用 时间价值 特别是如果您需要单独获取数据或将其转换为表格。

重用

创建包含以下内容的变量后 工作架;工作架 (例如,与名称 ),自动链接到 信号_id (唯一标识符)在*Engee*。 这允许您按名称引用它,并在项目的其他部分中重用它,例如,在基于Genie框架的web应用程序中(有关更多信息,请参阅 在Engee与Genie合作),在其他模型中或在具有嵌套的块中,例如 子系统:

wa = WorkspaceArray("my_wa")

这样的条目创建一个新的 工作架;工作架,指名称下已注册的数据 "my_wa".

与模型一起使用

街区 至工作区来自工作区 设计用于与 工作线/工作线 在模型中:

至工作区 将数据从模型写入类型变量 工作架;工作架 在*Engee*工作区中。 变量名由*变量名*参数设置。 仅支持数值数据(标量和数组)。

来自工作区 从工作区读取数据并将其馈送到模型输入。 只使用类型变量 工作架;工作架.

街区 到工作区从工作区 工作*只*与类型 工作架;工作架.

使用示例: 从/到工作区演示

使用CSV

将WorkspaceArray导出为CSV

出口用 工作架;工作架 在CSV中,使用 CSV。写 与所需的参数 delim="\t":

using CSV
CSV.write("/user/workspacearray_csv.csv", delim="\t", data_frame)
缺少参数 delim="\t" 会导致错误 BoundsError 导入时,它将创建一个空文件。

从CSV导入WorkspaceArray

wa = WorkspaceArray("my_wa", "/user/my_data.csv")

该文件应包含两列:

  • 时间 -必填列名;

  • 价值 -价值。

上传数据

完全上传到DataFrame

要从以下位置完全下载数据 工作架;工作架 在DataFrame中,使用 收集资料:

df = collect(wa) # 我们得到一个包含时间和值列的DataFrame

您还可以从以下位置获取单个列 工作架;工作架:

collect(wa.time)   # 只有时间
collect(wa.value)  # 仅值
不建议使用 收集资料 对于非常大的数据,内存过载是可能的。

懒人片

关键优势之一 工作架;工作架 -支持懒惰切片。

与常规Julia数组不同,其中切片(wa[1:10])创建一个包含数据副本的新数组, 工作线/工作线 它的工作方式不同。 切片时,将创建一个仅存储一系列索引的视图(范围)和对源对象的引用(家长/家长)-没有实际将值加载到内存中。 数据是从存储*只*加载与显式请求,例如,通过 收集资料,在迭代或索引访问期间。

这对于…​…​特别有用:

  • 保存内存-切片不会复制数据,而只指向必要的元素。;

  • 高性能—您只能使用正确的数据。;

  • 灵活性-懒惰切片可以用作模型输入,在可视化中或导出时。

例子::

wa_slice = wa[1:2:end] # 惰性表示:每个第二个元素
collect(wa_slice)      # 将数据加载到内存中(作为DataFrame)

结果:

Row │ time     value
    │ Float64  Int64
────┼───────────────
  1 │ 0.1      1
  2 │ 0.3      3
  3 │ 0.5      5

除了切片之外,您还可以按索引访问单个元素。:

wa[1] # 将获得对第一条记录的访问(0.1,1)

按字段划分的横截面 时间价值

工作架;工作架 单独的字段可用 .时间.价值,也可以应用懒惰切片:

wa_values = wa.value[2:end] # 仅基于值的横截面
wa_times  = wa.time[2:end]  # 仅限时间尺度切片

横截面 wa[1:2:完] 返回类型的对象 工作架;工作架信号_id,但随着一个新的领域 范围,表示切片。 这可以让你知道你正在看一个懒惰的表示,而不是数据的副本。

如果需要,可以将数据加载到存储器中。:

wa = WorkspaceArray("my_wa")

wa_slice = wa[1:2:end]     # 创建一个懒惰的切片
df = collect(wa_slice)     # 上传数据
println(df)                # 我们得到一个截断值的表

WorkspaceArray方法和接口

工作线/工作线 实现标准的Julia接口,并用它自己的方法来补充它们。 下面是使用时间序列时可以使用的最有用函数的简要概述。:

  • w[i] -按索引访问元素,返回元组 (时间、价值):

    wa[1] # 将收到(0.1,42.0)
  • wa[开始:停止] -按范围切片,返回惰性表示。 数据不会被复制,而是根据需要上传。:

    wa_slice = wa[1:10]
    collect(wa_slice) # 仅加载所选范围
  • wa[1:2:完] -懒切片与一个步骤。

  • 哇。时间, 哇。价值 -接触儿童 工作线/工作线,分别包含时间和值。 切片也可以应用于它们。:

    wa_times = wa.time[5:end]
    wa_values = wa.value[5:end]
  • 收集(wa) -皈依者 工作架;工作架数据帧. 这是显式获取数据的主要方法:

    df = collect(wa)
  • 副本(wa) / 类似(wa) -创建对象的表面副本。 在当前的实现中,它们的工作方式相同。

  • wa1==wa2 -两者的比较 工作线/工作线信号_id 和范围(范围).

如果你在*Engee*中使用时间序列,那么很可能你会有足够的 收集资料,节(wa[1:10])和 迭代,迭代 用于日常任务。 其余方法对于优化和微调行为很有用。

使用示例

让我们来看一个使用的基本示例 工作架;工作架 —从创建到接收切片和上传数据。 此方案涵盖最典型的使用方案。 工作架;工作架.

  1. 首先,创建一个表(数据帧),包含两列: 时间价值. 这是将数据导入到 工作架;工作架:

    using DataFrames
    
    df = DataFrame(time = [0.1, 0.2, 0.3, 0.4, 0.5],
                   value = [1, 2, 3, 4, 5])
    • 时间 -时间点(以秒为单位);

    • 价值 -此时信号的值。

  2. 将表转换为 工作架;工作架 通过指定数组在*Engee中可用的名称*:

    wa = WorkspaceArray("myarr", df)

    这里 "我的朋友" -可在模型和脚本中使用的变量的名称。

  3. 工作架;工作架 支持索引访问。 例如,获取第一条记录:

    println(wa[1])

    结果:

    (0.1, 1)

    这是一个元组:第一个元素是时间,第二个是信号值。

    数据只有在被访问时才被加载。 也就是说,即使 瓦[1] 只加载一个项目。
  4. 制作数组的切片,获取每个第二个元素 (1, 3, 5). 这将创建一个*惰性视图*,而不是副本。:

    wa_slice = wa[1:2:end]

    要将数据作为表获取,请使用 收集资料:

    println(collect(wa_slice))

    结果:

    3×2 DataFrame
     Row │ time     value
         │ Float64  Int64
    ─────┼────────────────
       1 │     0.1      1
       2 │     0.3      3
       3 │     0.5      5

    横截面 wa[1:2:完] 它不会自行下载数据。 只有当 收集资料 在迭代或索引访问期间,数据实际上是从存储中加载的。