Рубрики
Без рубрики

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

Автоматическое генерировать лабораторный набор набора данных. Просмотр записной книжки Типичный источник данных, найденный в MOS … Tagged с помощью Python, DataScience, DevOps, Smapledata.

Просмотреть записную книжку

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

Содержимое

  1. Структура данных
  2. Пакеты
    • Фар
    • xml.etree. ElementTree
    • Панды
  3. Генерировать набор данных
  4. Преобразовать набор данных к XML
  5. Преобразовать набор данных в Pandas DataFrame
  6. Сохранить файл
    • 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”