Анализ и визуализация данных
Работа с Workspace Array
WorkspaceArray — это специальный тип данных в среде моделирования Engee, предназначенный для хранения и обработки временных рядов. Он реализует интерфейс AbstractArray языка Julia.
WorkspaceArray не хранит данные целиком в оперативной памяти, а подгружает их по мере необходимости: например, при итерировании, обращении по индексу или преобразовании в таблицу. Это позволяет эффективно работать с очень большими наборами данных, которые не умещаются в память или поступают из внешних источников (например из базы данных или файла).
WorkspaceArray в Engee используется в следующих сценариях:
- как результат симуляции — для хранения записываемых сигналов, например, в переменной
simout; - для передачи данных между моделями через блоки To workspace (В рабочую область) и From Workspace (Из рабочей области);
- для импорта пользовательских временных рядов из
CSV-файлов или таблиц (DataFrame), которые затем можно использовать в моделях Engee.
WorkspaceArray обеспечивает единый и удобный интерфейс доступа к временным данным на протяжении всего моделирования — от подготовки входных данных до анализа результатов.
Создание Workspace Array
Обычно WorkspaceArray формируется автоматически в процессе симуляции, например при записи сигналов через блок To Workspace (В рабочую область) или при сохранении результатов в переменную simout.
Однако его также можно создать вручную, например чтобы загрузить внешние данные или протестировать модель на заранее подготовленных входах. В этом случае WorkspaceArray создается одним из следующих способов:
- Из
CSV-файла. Чтобы загрузить данные изCSV-файла, достаточно указать путь к файлу:
my_wa = WorkspaceArray("my_wa", "/user/path_to_csv.csv")
CSV-файл должен содержать два столбца: один обязательно с именем time, второй — со значениями сигнала. Пример структуры CSV-файла:
time,value
0.1, 1
0.2, 2
0.3, 3
- Из таблицы
DataFrame. Если вы уже работаете с табличными данными в Julia, можно создатьWorkspaceArrayнапрямую из объектаDataFrame. Это особенно удобно при программной генерации входных сигналов.
Примечание
DataFrame — это табличная структура из пакета DataFrames.jl, аналогичная таблицам в Excel. Каждый столбец имеет имя и тип, а данные хранятся по строкам. Подробнее с DataFrame мы познакомимся в Главе 02 этого курса.
Таблица должна содержать два столбца: time (тип Float64) и value (может быть скаляром, вектором или массивом чисел).
Особенности работы с Workspace Array
WorkspaceArray позволяет обращаться к нему как к обычному массиву в Julia — индексировать, итерировать и т.д. Однако помимо базового поведения массивов, WorkspaceArray содержит внутреннюю структуру и дополнительные поля, которые обеспечивают его связь с источниками данных и позволяют удобно работать с временными рядами.
Каждый WorkspaceArray — это не просто набор чисел, а объект с «метаданными»: он знает, где лежат его данные, как они связаны со временем, откуда загружаются и как были получены. Эти дополнительные свойства можно запросить напрямую, просто обращаясь к полям объекта через точку:
wa = WorkspaceArray("my_wa")
wa.time # доступ к временным меткам
wa.value # доступ к значениям
wa.type # узнаем, какой тип у массива — :pair, :time или :value
Доступны следующие поля:
time— дочернийWorkspaceArray, содержащий только временные метки. Имеет тип:time;value— дочернийWorkspaceArray, содержащий значения сигнала. Имеет тип:value;type— тип текущего массива::time,:valueили:pair(временные метки + значения);parent— ссылка на родительскийWorkspaceArray, если текущий является результатом среза;range— диапазон индексов, на основе которого был создан срез. Используется при ленивом срезе;dimension— размерность данных в полеvalue(например, скаляр, вектор, матрица);signal_id— уникальный идентификатор источника данных в Engee.
Примечание
Чаще всего при работе с WorkspaceArray напрямую используются поля time и value, особенно при необходимости получить данные по отдельности или преобразовать их в таблицу.
Использование с моделями
Блоки To workspace (В рабочую область) и From workspace (Из рабочей области) предназначены для взаимодействия с WorkspaceArray в модели:
- Блок To workspace (В рабочую область) записывает данные из модели в переменную типа
WorkspaceArrayв рабочей области Engee. Имя переменной задается параметром Variable name. Поддерживаются только числовые данные (скалярные и массивы). - Блок From workspace (Из рабочей области) считывает данные из рабочей области и подает их на вход модели. Используются только переменные типа
WorkspaceArray.
Работа с CSV
Экспорт WorkspaceArray в CSV
Для экспорта WorkspaceArray в CSV используйте функцию CSV.write с обязательным параметром delim="\t":
using CSV
CSV.write("/user/workspacearray_csv.csv", delim="\t", data_frame)
Отсутствие параметра delim="\t" вызовет ошибку BoundsError при импорте и создаст пустой файл.
Импорт WorkspaceArray из CSV
wa = WorkspaceArray("my_wa", "/user/my_data.csv")
Файл должен содержать два столбца:
time— обязательное имя столбца;value— значение.
Выгрузка данных
Полная выгрузка в DataFrame
Для полной выгрузки данных из WorkspaceArray в DataFrame используйте функцию collect:
df = collect(wa) # получаем DataFrame со столбцами time и value
Вы также можете получить отдельные столбцы из WorkspaceArray:
collect(wa.time) # только время
collect(wa.value) # только значения
Не рекомендуется использовать collect для очень больших данных — возможна перегрузка памяти.
Ленивые срезы
Одно из ключевых преимуществ WorkspaceArray — поддержка ленивых срезов (Lazy Slices).
В отличие от обычных массивов Julia, где срез (wa[1:10]) создает новый массив с копией данных, WorkspaceArray работает иначе. При срезе создается представление, которое хранит только диапазон индексов и ссылку на исходный объект — без фактической загрузки значений в память. Данные подгружаются из хранилища только при явном запросе, например, через функцию collect, при итерации или доступе по индексу.
Это особенно полезно для:
- экономии памяти — срезы не копируют данные, а лишь указывают на нужные элементы;
- быстродействия — можно работать только с нужными фрагментами данных;
- гибкости — ленивые срезы можно использовать в качестве входных данных моделей, в визуализациях или при экспорте.
Пример:
wa_slice = wa[1:2:end] # ленивое представление: каждый второй элемент
collect(wa_slice) # загружаем данные в память (в виде DataFrame)
Кроме срезов, можно получить доступ к отдельному элементу по индексу:
wa[1] # доступ к первой записи
Срезы по полям time и value
В WorkspaceArray доступны отдельные поля time и value, к которым также можно применять ленивые срезы:
wa_values = wa.value[2:end] # срез только по значениям
wa_times = wa.time[2:end] # срез только по временной шкале
При необходимости данные можно загрузить в память:
wa = WorkspaceArray("my_wa")
wa_slice = wa[1:2:end] # создаем ленивый срез
df = collect(wa_slice) # загрузка данных
println(df) # получаем таблицу со срезанными значениями
Методы и интерфейс Workspace Array
WorkspaceArray реализует стандартные интерфейсы Julia и дополняет их собственными методами. Ниже — краткий обзор наиболее полезных функций:
wa[i]— доступ к элементу по индексу, возвращает кортеж(time, value);wa[start:stop]— срез по диапазону, возвращает ленивое представление. Данные не копируются, а подгружаются по мере необходимости;wa[1:2:end]— ленивый срез с шагом;wa.time,wa.value— доступ к дочернимWorkspaceArray, содержащим отдельно время и значения;collect(wa)— преобразуетWorkspaceArrayвDataFrame. Это основной способ получить данные в явном виде;copy(wa)иsimilar(wa)— создают поверхностную копию объекта. В текущей реализации работают одинаково;wa1 == wa2— сравнение двухWorkspaceArrayпоsignal_idи диапазону.
Практическая часть
Пример
Рассмотрим базовый пример работы с WorkspaceArray — от создания до получения среза и выгрузки данных. Этот сценарий охватывает самые типовые сценарии использования WorkspaceArray.
- Для начала создадим таблицу (
DataFrame), содержащую два столбца:timeиvalue. Это обязательный формат для импорта данных вWorkspaceArray:
using DataFrames
df = DataFrame(time = [0.1, 0.2, 0.3, 0.4, 0.5],
value = [1, 2, 3, 4, 5])
Здесь time — момент времени, value — значение сигнала в этот момент.
- Преобразуем таблицу в
WorkspaceArray, указав имя, под которым массив будет доступен в Engee:
wa = WorkspaceArray("myarr", df)
Здесь myarr — имя переменной, с которой можно будет работать в моделях и скриптах.
WorkspaceArrayподдерживает доступ по индексу. Например, получим первую запись:
println(wa[1])
В результате получается кортеж: первый элемент — время, второй — значение сигнала.
- Сделаем срез массива, получим каждый второй элемент
(1, 3, 5). Это создаст ленивое представление, а не копию:
wa_slice = wa[1:2:end]
- Чтобы получить данные в виде таблицы, используем функцию
collect:
println(collect(wa_slice))
Примечание
Срез wa[1:2:end] не загружает данные сам по себе. Только при использовании функции collect, итерации или обращении по индексу данные реально подгружаются из хранилища.
✏️Задание 1
С помощью функции DataFrame создайте таблицу, содержащую два столбца: time и value со следующими числами:
|
|
|
|
2.0 |
34.7 |
|
4.0 |
28.1 |
|
6.0 |
62.5 |
|
8.0 |
43.9 |
|
10.0 |
71.6 |
|
12.0 |
54.8 |
Затм преобразуйте таблицу в WorkspaceArray.
Решение
using DataFrames
df = DataFrame(time = [2.0, 4.0, 6.0, 8.0, 10.0, 12.0],
value = [34.7, 28.1, 62.5, 43.9, 71.6, 54.8])
wa = WorkspaceArray("myarr", df)
✏️Задание 2
Выведите на экран пятую строку массива WorkspaceArray.
Решение
println(wa[5])
✏️Задание 3
Сделайте срез массива WorkspaceArray, включив в него со второй по четвертую строки. Представьте данные в виде таблицы, используя функцию collect.
Решение
wa_slice = wa[2:4]
println(collect(wa_slice))
✏️Задание 4
Представьте в виде таблицы столбец value массива Workspace Array.
Решение
println(collect(wa.value))
Тест для получения сертификата
Если вы впервые проходите тестирование на платформе Этюд по ссылке из Engee, то, нажав на ссылку ниже, вы увидите следующее диалоговое окно:
Нажмите на кнопку «Предоставить», чтобы авторизоваться на платформе Этюд с данными вашего профиля Engee ID.
Если вы раньше уже проходили тестирование по ссылке из Engee, то ваша авторизация выполнится автоматически и тестирование начнется сразу же после нажатия на ссылку.