Учебное пособие: автоматический анализ лабораторных данных для создания карты производительности

Автоматический анализ данных лабораторных испытаний

Как писать программы на Python, которые будут выполнять анализ данных за вас

Ученые очень часто сталкиваются с большими наборами данных. Иногда это происходит в виде гигабайт данных в одном файле. В других случаях это сотни файлов, каждый из которых содержит небольшой объем данных. В любом случае, это сложно. Трудно понять. Трудно вашему компьютеру обрабатывать. Вам нужен способ упростить процесс, сделать набор данных более управляемым и помочь вам отслеживать все.

Вот о чем этот урок. Мы находимся в процессе написания скриптов Python, которые будут автоматически анализировать все данные для вас и хранить данные с понятными, интуитивно понятными именами файлов. При этом вы используете пример, взятый из реальных исследований, чтобы вы знали, что навыки, которые вы развиваете, практичны и полезны.

Первый пост в этом уроке познакомил с концепциями учебника. Если термины водонагреватель с тепловым насосом, коэффициент полезного действия (COP) и карта производительности для вас ничего не значат, возможно, вам стоит их прочитать.

Во втором посте был представлен сопутствующий набор данных и разделение набора данных на несколько файлов с понятными для пользователя именами.

Набор сопутствующих данных - ценная часть учебного процесса, так как он позволяет вам следовать. Вы можете написать тот же самый код, который я представлю, запустить код, увидеть результаты и сравнить их с результатами, которые я представляю. Таким образом вы можете быть уверены, что делаете все правильно.

В конце второй части руководства у нас есть три файла данных, каждый из которых содержит результаты испытаний при заданной температуре окружающей среды. В каждом из этих файлов мы видим потребление электроэнергии тепловым насосом, температуру воды в накопительном баке и температуру воздуха вокруг водонагревателя.

Следующий шаг - обработать эти результаты. Нам нужно написать код, который автоматически анализирует данные, вычисляет COP теплового насоса и отображает данные на графике, чтобы мы могли их визуально понять.

Без лишних слов, приступим. Как и во всем программировании на Python, нам нужно сначала импортировать пакеты.

Какие пакеты мне нужно импортировать?

Есть несколько пакетов, которые будут очень важны на этом этапе. Они есть:

  • glob: glob - это пакет для создания списка. Он читает файлы, хранящиеся в папке, и создает список, содержащий их все. Поскольку Python отлично выполняет итерацию по спискам, мы можем использовать glob для создания списка всех наших файлов данных и позволить Python анализировать их по одному.
  • pandas: нужно ли мне указывать на важность этого пакета? pandas - это золотой стандарт инструментов анализа данных в Python.
  • os: os дает нам доступ к командам операционной системы. Это звучит пугающе, потому что вы потенциально можете испортить свой компьютер, используя его. Не волнуйтесь; мы будем использовать его только для проверки и добавления папок.
  • numpy: numpy - отличный числовой пакет, который включает мощные инструменты анализа данных. В этом конкретном случае мы будем использовать numpy для создания регрессии наших данных.
  • боке: боке - это интерактивный инструмент для построения графиков в Python. Он позволяет вам писать код, который автоматически генерирует графики при анализе ваших данных, и дает пользователю возможность взаимодействовать с ними. Отличным источником для дальнейшего понимания боке является Практическая визуализация данных с боке.

Боке не будет использоваться в сценарии, написанном во время этой части руководства; однако этот же сценарий будет основой для будущих частей. Боке стоит импортировать сейчас, чтобы не беспокоиться об этом, когда позже перейдете к следующей части.

Для этого проекта нам нужно будет полностью импортировать glob, pandas, os и numpy, при этом импортируя только определенные функции из боке. Все они могут быть вызваны с помощью следующего кода:

import glob
import pandas as pd
import os
import numpy as np
from bokeh.plotting import figure, save, gridplot, output_file

Обратите внимание, что pandas был импортирован и назначен pd, а numpy был назначен np. Это означает, что теперь мы можем ссылаться на эти пакеты, написав «pd» и «np» вместо pandas и numpy.

Теперь, когда все наши пакеты импортированы, следующим шагом будет создание нашего списка глобусов и цикла for для последовательного перебора всех ваших файлов. Когда это будет подготовлено, вы можете написать код, анализирующий каждый из наших файлов данных.

Как мне перебрать все мои файлы?

Первым делом нужно настроить glob. Для этого вам необходимо указать glob путь и тип файла (тип файла не является обязательным, но все наши данные находятся в формате .csv, поэтому мы хотим указать это, чтобы избежать включения посторонних файлов). Затем, когда вы вызываете glob, он создает список всех файлов этого типа в указанной папке. Это можно сделать с помощью следующих строк кода:

Path = r'C:\Users\YourName\Documents\AutomatingDataAnalysis\Files_IndividualTests'
Filenames = glob.glob(Path + '/*.csv')

Переменная Path указывает glob искать в указанной папке соответствующие файлы. Обратите внимание, что указанная выше папка - это та же папка, в которую вы сохраняли файлы в первой части этого руководства.

Вторая строка вызывает функцию glob из пакета glob для создания списка всех указанных файлов. Обратите внимание, что код ссылается на указанную вами переменную Path, чтобы указать, какой глобус папки должен искать файлы. Затем следует код, в котором говорится, что glob должен включать все файлы .csv и ничего больше.

После завершения этого кода glob создаст список всех файлов .csv в папке. Он будет иметь вид [1.csv, 2. csv, 3.csv,…, n.csv]. Для тех, кто загрузил набор сопутствующих данных и следит за руководством, это будет полный путь для PerformanceMap_HPWH_55.csv, PerformanceMap_HPWH_70.csv и PerformanceMap_HPWH_95.csv.

Теперь, когда у вас есть список файлов, следующим шагом будет создание цикла for, который выполняет итерацию по каждому из этих файлов. Затем вам нужно открыть файлы, чтобы вы могли выполнить анализ данных для каждого из них. Для этого вам понадобится следующий код:

for Filename in Filenames:
 Data = pd.read_csv(Filename)

Этот код автоматически перебирает каждую запись в списке имен файлов. Обратите внимание, что способ записи приводит к тому, что имя файла содержит фактическое имя файла каждой записи в списке. Например, при первом прохождении цикла for имя файла будет содержать полный путь к PerformanceMap_HPWH_55.csv.

Вторая строка использует pandas для чтения файла в память и сохраняет его в Data для последующего анализа.

Теперь, когда файлы расположены и последовательно открываются, следующим шагом будет добавление кода, анализирующего каждый файл. И это будет нашим следующим шагом.

Как написать код для автоматического анализа каждого файла?

Это требует достаточного количества знаний об изучаемом оборудовании, помимо знания программирования на Python. Поскольку я предполагаю, что вы не читаете HPWH, я обязательно напишу соответствующую информацию.

Фильтрация данных, чтобы они содержали только важную часть

Для этого процесса нас интересуют данные только тогда, когда тепловой насос в HPWH активен. Тепловые насосы в этих устройствах обычно потребляют 400–600 Вт в зависимости от температуры окружающей среды и воды. Между тем, у них есть бортовая электроника, потребляющая немного электроэнергии. Чтобы отфильтровать данные в сегмент, который нас интересует, нам необходимо удалить все данные с потреблением электроэнергии менее 300 Вт, которое выбрано так, чтобы оно было значительно выше, чем потребляемая мощность бортовой электроники, но ниже минимального потребления теплового насоса. Мы можем сделать это с помощью следующей строки:

Data = Data[Data['P_Elec (W)'] > 300]

Эта строка сбрасывает наш фрейм данных, чтобы он содержал только данные, потребляемые устройством более 300 Вт. Но это повлияло на индекс фрейма данных, поэтому нам нужно сбросить его, чтобы сохранить наш фрейм данных в чистоте. . Для этого мы можем использовать следующий код:

Data = Data.reset_index()
    del Data['index']

Определение изменения времени между измерениями

Теперь с данными временных меток в этом наборе данных нелегко работать. К счастью, из сотрудничества с нашим партнером по лабораторным испытаниям мы знаем, что измерения проводились каждые 10 секунд. Таким образом, мы можем создать новый столбец в нашем фрейме данных, в котором будет указано, как долго тест был активен, используя следующий код:

Data[‘Time Since Test Start (min)’] = Data.index * 10./60.

Расчет изменения энергии, запасенной в воде

Одним из ключевых параметров, влияющих на коэффициент полезного действия HPWH, является температура воды в накопительном баке. Вода не будет достаточно хорошо перемешана, чтобы поддерживать постоянную температуру. Обычно на дне резервуара будет холодная вода, а наверху - горячая. Для этого упражнения достаточно вычислить среднюю температуру в резервуаре. Поскольку наш лабораторный испытатель любезно сообщил нам, что он использовал 8 измерений температуры, равномерно распределенных по всему резервуару, мы можем рассчитать среднюю температуру воды, используя:

Data['Average Tank Temperature (deg F)'] = (1./8.) * (Data['T1 (deg F)'] + Data['T2 (deg F)'] + Data['T3 (deg F)'] + Data['T4 (deg F)'] + Data['T5 (deg F)'] + Data['T6 (deg F)'] + Data['T7 (deg F)'] + Data['T8 (deg F)'])

Что нас действительно волнует, так это то, насколько средняя температура резервуара меняется от одного времени измерения к другому. Таким образом мы можем идентифицировать изменение энергии, хранящейся в резервуаре, и, следовательно, энергии, добавляемой к воде тепловым насосом. Мы можем сделать это с помощью следующих двух строк кода:

Data['Previous Average Tank Temperature (deg F)'] = Data['Average Tank Temperature (deg F)'].shift(periods = 1)
Data.loc[0, 'Previous Average Tank Temperature (deg F)'] = 72.0

В первой строке используется команда .shift фрейма данных pandas для создания нового столбца в фрейме данных, содержащего данные «Средняя температура резервуара (град. F)», но со смещением на одну строку вниз во фрейме данных. Это создает пустую ячейку в первой строке (индекс 0), что вызывает ошибки при выполнении вычислений. Вторая строка кода исправляет это, используя .loc для заполнения этой ячейки значением 72.0. Мы можем это сделать, потому что наш дружелюбный лабораторный тестировщик сказал нам, что тесты каждый раз начинались точно при 72,0 ° F.

Теперь мы можем рассчитать изменение энергии, запасенной в воде, между каждыми двумя отметками времени. Для этого нам нужно знать несколько констант и уравнений:

  • Во-первых, уравнение для определения изменения энергии в воде в виде Energy = Mass * Specific_Heat * (Temperature_Final - Temperature_Initial)
  • Во-вторых, мы знаем, что резервуар HPWH вмещает 80 галлонов (опять же, благодаря сообщению нашего дружелюбного лабораторного тестера),
  • В-третьих, плотность воды составляет 8,3176 фунтов / галлон, и
  • В-четвертых, удельная теплоемкость воды составляет 0,998 БТЕ / фунт-фут.

Мы можем собрать все это вместе и рассчитать изменение накопленной энергии, используя следующую строку:

Data['Change in Stored Energy (Btu)'] =  (80 * 8.3176) * (0.998) * (Data['Average Tank Temperature (deg F)'] - Data['Previous Average Tank Temperature (deg F)'])

Расчет КС

Следующим шагом в анализе каждого набора данных является вычисление COP как функции температуры воды в резервуаре. Цель этого руководства - определить COP как функцию как температуры воды, так и температуры окружающей среды, и это обеспечит понимание COP как функции температуры воды при каждой заданной температуре окружающей среды. Это ведет в правильном направлении.

Чтобы рассчитать КПД теплового насоса, нам необходимо выполнить некоторые преобразования единиц измерения. В настоящее время потребление электроэнергии выражается в Вт, в то время как энергия, добавляемая к воде, выражается в британских тепловых единицах на временной шаг. Для преобразования единиц измерения мы используем соотношение 1 Вт = 3,412142 британских тепловых единиц / час, затем конвертируем британские тепловые единицы / час в британские тепловые единицы / с и умножаем на 10 секунд для каждой временной метки. Это дает код:

Data['P_Elec (Btu/10s)'] = Data['P_Elec (W)'] * (3.412142/60/60) * 10

COP - это по определению количество тепла, добавляемого к воде, деленное на количество потребляемой электроэнергии. Таким образом, его можно рассчитать с помощью:

Data['COP (-)'] = Data['Change in Stored Energy (Btu)'] / Data['P_Elec (Btu/10s)']

Создание регрессий

Теперь у нас есть таблица, показывающая COP как функцию температуры воды для каждого из трех указанных COP. Но мы можем добиться большего. Разве не было бы неплохо иметь функцию, которую мы можем использовать для расчета COP? Просто введите температуру воды и соответственно определите КС?

Numpy предоставляет инструменты, чтобы упростить эту задачу. Мы можем использовать numpy-функцию «polyfit» для определения коэффициентов рефрессии, описывающей COP как функцию температуры воды. Это гибкая функция, позволяющая управлять формой кривой, задавая порядок функции в конце. Поскольку КПД теплового насоса как функция температуры представляет собой параболическую кривую, для этого примера нам нужна регрессия второго порядка. Таким образом, коэффициенты можно обозначить линией:

Coefficients = np.polyfit(Data[‘Average Tank Temperature (deg F)’], Data[‘COP (-)’], 2)

Функцию numpy «poly1d» можно использовать для создания регрессии с использованием этих коэффициентов. Это делается с помощью:

Regression = np.poly1d(Coefficients)

Теперь вы можете определить COP теплового насоса при заданной температуре воды с помощью этой регрессии. Помните, что регрессия создается только для определенной температуры воздуха, поэтому оценивайте COP только с помощью регрессии для правильной температуры воздуха. Конечная цель этого руководства - создание двухмерной карты производительности, но мы еще не достигли ее.

COP при заданной температуре воды можно определить, вызвав функцию и используя температуру воды в качестве входных данных. Например, если вы хотите найти COP при температуре воды 72 ° F, вы можете ввести:

COP_72 = Regression(72.0)

Как мне сохранить эти результаты?

Данные могут быть сохранены с использованием тех же методов, которые мы всегда используем, как описано в разделе Автоматическое сохранение результатов из проанализированных наборов данных. Нам нужно 1) убедиться, что папка для проанализированных результатов доступна, 2) создать новое имя файла, в котором четко указано, что файл содержит, и 3) сохранить данные.

В этом случае мы хотим сохранить данные в новый файл под названием «Анализируемый». Он должен находиться в той же папке данных и использоваться для отображения результатов анализа. Мы можем сделать это с помощью следующего кода:

Folder = Path + '\Analyzed' 
if not os.path.exists(Folder):
    os.makedirs(Folder)

Первая строка создает путь к новой папке. Он добавляет «\ Analyzed» к существующему в настоящее время пути, указывая на то, что он ищет папку с именем «Analyzed» в текущей папке. Вторая строка определяет, существует ли эта папка уже. Если этого не происходит, его создает третья строка.

После этого нам нужно установить имена файлов как для набора данных, так и для коэффициентов. Это можно сделать, объединив то, что у нас уже есть, с частью строк. Мы можем использовать строковые индексы, чтобы идентифицировать часть имени файла, которую мы хотим сохранить. Например, в разделе имени первого файла с надписью «PerformanceMap_HPWH_50» довольно четко указано, что файл содержит. Поскольку мы знаем, что последние четыре символа имен файлов - это «.csv», мы можем изолировать этот раздел строки с помощью индексов [-26: -4]. Другими словами, нам нужны символы строки от «26-го до последнего» до «с четвертого до последнего», исключая четвертое и последнее.

После этого мы можем немного изменить имена файлов. А именно, мы можем заявить, что мы хотим, чтобы имя файла данных указывало, что оно содержит проанализированные данные, и мы хотим, чтобы имя файла коэффициентов указывало, что оно содержит коэффициенты. Мы можем записать имя файла для обоих файлов, используя следующие строки:

Filename_Test = Folder + '\\' + Filename[-26:-4] + '_Analyzed.csv'
Filename_Coefficients = Folder + '\Coefficients_' +  Filename[-6:]

Затем мы просто сохраняем файлы. Проанализированные данные могут быть сохранены с помощью функции pandas .to_csv, а коэффициенты могут быть сохранены с помощью функции numpy .tofile следующим образом:

Data.to_csv(Filename_Test, index = False)
Coefficients.tofile(Filename_Coefficients, sep = ‘,’)

Обратите внимание, что строка с сохранением наборов данных index = False. Это означает, что индекс фрейма данных не будет сохранен при сохранении таблицы. Также обратите внимание, что функция numpy .tofile требует, чтобы вы указали разделитель. В этом случае мы используем запятую, как указано в коде sep = ‘,’ .

Как я узнаю, что это сработало правильно?

Есть огромное количество вещей, которые могли пойти не так на этом этапе процесса. Возможно, лабораторный испытатель допустил ошибки при проведении экспериментов. Может, сломался инструмент. Возможно, в коде есть опечатка или некорректное преобразование единиц измерения.

Совершенно необходимо убедиться, что ни одна из этих или каких-либо других проблем не возникла во время процесса. Поэтому следующим шагом в этом процессе является проверка набора данных на наличие ошибок. Мы рассмотрим это на следующем этапе обучения. Сначала я расскажу, как проверять данные на наличие ошибок вручную. Таким образом вы получите четкое представление о потенциальных ошибках, которые мы проверяем, и о том, как их идентифицировать. Затем я расскажу, как добавить в этот скрипт код, который автоматически проверяет эти ошибки и предупреждает вас, когда что-то пойдет не так.

Содержание учебного пособия

Это часть серии статей, которые обучают вас всем навыкам, необходимым для автоматического анализа лабораторных данных и разработки карты производительности водонагревателей с тепловым насосом. Остальные статьи этой серии можно найти по следующим ссылкам:

"Введение"

Разделение наборов данных

Проверка анализируемых лабораторных данных на наличие ошибок

Как писать скрипты, проверяющие качество данных для вас

Как автоматически генерировать регрессии в Python