在工程中使用WorkspaceArray
工作架;工作架 —这是Engee建模环境中的一种特殊数据类型,专为存储和处理时间序列而设计。 它实现了接口 抽象阵列 语言 Julia,但与标准数组不同,它会延迟加载数据。
工作架;工作架 它不会将数据完全存储在RAM中,而是根据需要加载它:例如,在迭代,访问索引或转换为表时。 这使您能够有效地处理不适合内存或来自外部源(例如,来自数据库或文件)的非常大的数据集。
工作架;工作架 *Engee*用于以下情况:
-
作为模拟的结果,它用于存储记录的信号。 例如,在变量
模拟,模拟(有关详细信息,请参阅 Engee中仿真结果的软件处理); -
要从CSV文件或表导入自定义时间序列(
数据帧),然后可以在*Engee*模型中使用。
所以, 工作架;工作架 它提供了一个单一的和用户友好的界面,用于访问整个模拟的时间数据,从输入数据准备到结果分析。
创建WorkspaceArray
通常情况下 工作架;工作架 它是在仿真过程中自动生成的,例如,当通过块记录信号时 至工作区 或者将结果保存到变量时 simout。
但是,它也可以手动创建,例如,加载外部数据或在预先准备的输入上测试模型。 在这种情况下 工作架;工作架 它是使用以下方法之一创建的:
-
来自CSV文件。 要从CSV文件下载数据,只需指定文件的路径即可。:
my_wa = WorkspaceArray("my_wa", "/user/path_to_csv.csv")这里
"my_wa"-这是保存数组的名称 变量的窗口
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*工作区中。 变量名由*变量名*参数设置。 仅支持数值数据(标量和数组)。
座 来自工作区 从工作区读取数据并将其馈送到模型输入。 只使用类型变量 工作架;工作架.
街区 到工作区 和 从工作区 工作*只*与类型 工作架;工作架.
|
使用示例: 从/到工作区演示。
上传数据
完全上传到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] # 仅限时间尺度切片
|
横截面 如果需要,可以将数据加载到存储器中。:
|
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])和 迭代,迭代 用于日常任务。 其余方法对于优化和微调行为很有用。
|
使用示例
让我们来看一个使用的基本示例 工作架;工作架 —从创建到接收切片和上传数据。 此方案涵盖最典型的使用方案。 工作架;工作架.
-
首先,创建一个表(
数据帧),包含两列:时间和价值. 这是将数据导入到工作架;工作架:using DataFrames df = DataFrame(time = [0.1, 0.2, 0.3, 0.4, 0.5], value = [1, 2, 3, 4, 5])-
时间-时间点(以秒为单位); -
价值-此时信号的值。
-
-
将表转换为
工作架;工作架通过指定数组在*Engee中可用的名称*:wa = WorkspaceArray("myarr", df)这里
"我的朋友"-可在模型和脚本中使用的变量的名称。 -
工作架;工作架支持索引访问。 例如,获取第一条记录:println(wa[1])结果:
(0.1, 1)这是一个元组:第一个元素是时间,第二个是信号值。
数据只有在被访问时才被加载。 也就是说,即使 瓦[1]只加载一个项目。 -
制作数组的切片,获取每个第二个元素
(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:完]它不会自行下载数据。 只有当收集资料在迭代或索引访问期间,数据实际上是从存储中加载的。