Просмотреть записную книжку
Типичным источником данных, найденным на большинстве промышленных рабочих мест, являются лабораторные измерения. Этот тип данных обычно имеет четко определенную структуру и представляет собой смесь категориальных и числовых типов данных. Диапазоны измерений и формат файлов могут сильно различаться между вариантами использования. В этой статье рассказывается, как генерировать простой набор данных, который можно настроить для моделирования широкого спектра вариантов использования.
Содержимое
- Структура данных
- Пакеты
- Фар
- xml.etree. ElementTree
- Панды
- Генерировать набор данных
- Преобразовать набор данных к XML
- Преобразовать набор данных в Pandas DataFrame
- Сохранить файл
- CSV
- XML
- паркет
Образец структуры данных
machine_id | нить | ||
test_id | uuid | ||
техник | нить | ||
test_routine | категорический | ||
пакетный | категорический | ||
loc_1 | толковый словарь | ||
15 | -15 | loc_1_x_offset | десятичный |
1 | -1 | loc_1_y_offset | десятичный |
5000 | 2500 | loc_1_z_offset | инт |
loc_2 | толковый словарь | ||
15 | -15 | loc_2_x_offset | десятичный |
1 | -1 | loc_2_y_offset | десятичный |
5000 | 2500 | loc_2_z_offset | инт |
Пакеты
Faker: Это пакет Python для создания, как следует из названия, фальшивые данные. Эта библиотека генерирует не только случайные числа и строки, но и более сложные элементы, такие как адреса, и имена.
from faker import Faker fake = Faker() Faker.seed(0)
xml.etree. ElementTree: Является базовой библиотекой питона, которая является простым и эффективным способом запроса, анализа и создания данных XML.
import xml.etree.ElementTree as ET from xml.dom import minidom
Панды: Это библиотека GOTO для работы с табличными данными.
import pandas as pd
# base imports import uuid import os
Генерировать набор данных
Структура набора данных представлена словарем и использует Faker для заполнения значений данных. Это обеспечивает простые модификации при перемещении между вариантами использования.
def generate_measurement_record(): base_equipment_name='Machine' equipment_cnt = 25 n = fake.pyint(min_value=1, max_value=equipment_cnt) measurement_record = { 'machine_id': '_'.join([base_equipment_name, f'{n:02}']) ,'test_id':str(uuid.uuid4().hex) ,'technician':fake.name() ,'test_routine':fake.random_sample(elements=('a', 'b', 'c', 'd', 'e', 'f')) ,'batched':fake.random_sample(elements=('Yes', 'No', 'N/A'), length=1)[0] ,'loc_1':{ 'x_offset':fake.pydecimal(left_digits=2, right_digits=2, min_value=-15, max_value=15) ,'y_offset':fake.pydecimal(left_digits=1, right_digits=6, min_value=-1, max_value=1) ,'z_offset':fake.pyint(min_value=2500, max_value=5000) } ,'loc_2':{ 'x_offset':fake.pydecimal(left_digits=2, right_digits=2, min_value=-15, max_value=15) ,'y_offset':fake.pydecimal(left_digits=1, right_digits=6, min_value=-1, max_value=1) ,'z_offset':fake.pyint(min_value=2500, max_value=5000) } } return measurement_record
Повторно вызывая эту функцию генерирует новые записи со случайными данными, которые можно собрать в списке до желаемого размера.
records_cnt = 5 measurement_record = None measurement_list=[] for _ in range(records_cnt): measurement_record = generate_measurement_record() measurement_list.append(measurement_record) # List of nested dictionaries
Преобразовать набор данных к XML
Далее нам понадобится функция, которая будет обрабатывать преобразование записей, хранящихся в качестве словарей в XML. Затем примените функцию к каждой записи в списке.
import xml.etree.ElementTree as ET def dict_to_xml(d, r=None): file_id = str(uuid.uuid4().hex) if r is None: r = ET.Element('DataFile') r.set('id', file_id) if isinstance(d, dict): for k, v in d.items(): s = ET.SubElement(r, k) dict_to_xml(v, s) elif isinstance(d, tuple) or isinstance(d, list): val = '/'.join(str(v) for v in d) r.text = val elif isinstance(d, str): r.text = d else: r.text = str(d) return r
# Convert each record xml_dataset = ET.Element('DataFiles') for rcd in measurement_list: file_id = str(uuid.uuid4().hex) child = ET.SubElement(xml_dataset,'DataFile') child.set('id', file_id) # Convert to xml element= dict_to_xml(rcd,child)
Полученный XML -файл можно просмотреть с помощью:
from xml.dom import minidom xml= ET.tostring(xml_dataset, encoding='unicode', method='xml') xml= minidom.parseString(xml) xml= xml.toprettyxml(indent=' ') print(xml)
Machine_10 3c0c95f773bf426585a3a68642d2d41a Brett Kerr c/f/a/b Yes 8.63 0.39661 3736 -4.94 0.964363 3182
Преобразовать набор данных в Pandas DataFrame
Панды могут напрямую создавать данные о данных из словаря, если словарь не вложен. Таким образом, первый шаг преобразования состоит в том, чтобы создать функцию, чтобы сгладить структуру словаря измерения:
import collections.abc def flatten(d, parent_key='', sep='_'): items = [] for k, v in d.items(): new_key = parent_key + sep + k if parent_key else k if isinstance(v, collections.MutableMapping): items.extend(flatten(v, new_key, sep=sep).items()) else: items.append((new_key, v)) return dict(items)
Далее создайте новый список сплющенных записей:
measurement_flat_list= [] for rcd in measurement_list: measurement_flat_list.append(flatten(rcd)) # List of single depth dictionaries
Наконец, преобразовать список в DataFrame:
measurement_df = pd.DataFrame(measurement_flat_list) measurement_df.head()
Да | FFBB9F35D54844DEEBAB0598926194203 | 0 | Machine_02 | Стефани Лебланк | [F, D, C, E, A] | 14.86 | 0.607854 | 3627 | 0.63 | 0.863740 | 3828 |
N/a | FB824A88E0F145169B411A2180C5671C | 1 | Machine_20 | Кевин Роджерс | [B, A] | -6.14 | 0.390133 | 3198 | -4.54 | 0.105494 | 3099 |
N/a | 25D73F925BA14DF5A09A11EF8FB3A68D | 2 | Machine_23 | Роберт Уолтерс | [E, A, F, D, C] | 12.73 | 0.410212 | 2874 | -3.14 | 0.634917 | 2588 |
N/a | A3FB30A0FE8F4000AA72EB182230D236 | 3 | Machine_07 | Кэти Мартинес | [F, A] | -14.69 | 0.650746 | 2915 | 12.33 | 0.231556 | 2794 |
Нет | 02A27172E0354644FBDF680C476312B03 | 4 | Машина_21 | Джеффри Браун | [A, E, F, C] | -8.33 | 0.948330 | 4426 | 12.72 | 0.731588 | 3333 |
Сохранить файлы наборов данных
- XML
- CSV
- Паркет
# xml destPath = 'sample_lab_measurement.xml' # Convert to string xml_str= ET.tostring(xml_dataset, encoding='unicode', method='xml') # Pretty print string xml_str= minidom.parseString(xml_str) xml_str= xml_str.toprettyxml(indent=' ') # Write file with open(destPath, 'w') as f: # Write in file as utf-8 f.write(xml_str)
# csv destPath = 'sample_lab_measurement.csv' measurement_df.to_csv(destPath, index = False, header=True)
# parquet destPath = 'sample_lab_measurement.parquet' measurement_df.to_parquet(destPath, index = False)
Оригинал: “https://dev.to/darrylbrysondev0/auto-generate-lab-measurement-dataset-59kb”