Часто для тестирования кода обработки или анализа больших данных требуются датафреймы с тестовыми данными. По разным причинам в тестах часто нельзя использовать реальные эксплуатационные данные. Вручную создавать подобные датафреймы очень накладно. Поэтому, здесь предлагается автоматическая генерация подобных датафреймов с применением библиотек Pandas, Numpy и Random в Python, которые принято применять при анализе больших данных.
Исходнные вводные для датафрейма.
Предлагается генерацию датафрейма с тестовыми данными обернуть в функцию generate_dataframe, которая у условии будет принимать на вход параметры:
- Cписок и тип столбцов.
- Наборы подстрок для каждого из будущих строковых значений и вероятностный алгоритм их объединения.
- Диапазоны числовых значений для каждого из числовых столбцов.
- Вероятность появления всех текстовых, числовых и булевых значений будущего датафрейма.
- Значение среднего количества строк датафрейма.
- Модуль значения отклонения допустимого количество строк от среднего количества строк датафрейма.
На выходе функция должна отдавать датафрейм, созданный по требованиям из условий функции, со случайным количество строк датафрейма, находящемся в заданном диапазоне.
Функция автоматической генерации датафрейма с тестовыми данными¶
import pandas as pd
import numpy as np
import random
import uuid
from typing import List, Tuple, Dict, Any, Union, Optional
def generate_dataframe(
columns: List[Tuple[str, str]],
text_substrings: Dict[str, List[str]],
numeric_ranges: Dict[str, Tuple[Union[int, float], Union[int, float]]],
bool_probabilities: Dict[str, float],
text_probability: float,
numeric_probability: float,
bool_probability: float,
mean_row_count: int,
deviation_row_count: int
) -> pd.DataFrame:
"""
Генерирует DataFrame со случайными данными по заданным параметрам.
Args:
columns: Список кортежей (имя_столбца, тип)
text_substrings: Словарь {имя_столбца: [список подстрок]} для строковых столбцов
numeric_ranges: Словарь {имя_столбца: (мин, макс)} для числовых столбцов
bool_probabilities: Словарь {имя_столбца: вероятность_True} для булевых столбцов
text_probability: Вероятность появления текстового значения
numeric_probability: Вероятность появления числового значения
bool_probability: Вероятность появления булевого значения
mean_row_count: Среднее количество строк
deviation_row_count: Допустимое отклонение количества строк
Returns:
pd.DataFrame: Сгенерированный DataFrame
"""
# Генерация случайного количества строк
row_count = random.randint(
max(0, mean_row_count - deviation_row_count),
mean_row_count + deviation_row_count
)
data = {}
for col_name, col_type in columns:
col_values = []
if col_type == 'str':
for _ in range(row_count):
if random.random() < text_probability:
# Случайное объединение подстрок
parts = random.sample(
text_substrings[col_name],
#k = random.randint(1, len(text_substrings[col_name]))
k = random.randint(1, 1)
)
col_values.append(' '.join(parts))
else:
col_values.append(None)
elif col_type in ['int', 'float']:
min_val, max_val = numeric_ranges[col_name]
for _ in range(row_count):
if random.random() < numeric_probability:
if col_type == 'int':
col_values.append(random.randint(int(min_val), int(max_val)))
else:
col_values.append(random.uniform(min_val, max_val))
else:
col_values.append(None)
elif col_type == 'bool':
for _ in range(row_count):
if random.random() < bool_probability:
col_values.append(random.random() < bool_probabilities[col_name])
else:
col_values.append(None)
data[col_name] = col_values
return pd.DataFrame(data)
Основные особенности реализации:
- Типы столбцов задаются парой (имя, тип), где тип может быть:
str— строковые значенияint— целые числаfloat— числа с плавающей точкойbool— булевы значения
- Для каждого типа данных используются свои параметры генерации:
- Строки: объединяются случайные подстроки из заданного списка
- Числа: генерируются в заданном диапазоне
- Булевы значения: учитывают вероятность появления True
- Вероятностные параметры:
text_probability— вероятность появления текстового значенияnumeric_probability— вероятность появления числового значенияbool_probability— вероятность появления булевого значения
- Контроль количества строк:
mean_row_count— среднее количество строкdeviation_row_count— допустимое отклонение- Фактическое количество строк генерируется случайно в диапазоне [
mean—deviation,mean+deviation]
- Особенности генерации:
- Для строковых значений используется случайная комбинация подстрок
- Для числовых значений равномерное распределение в заданном диапазоне
- Для булевых значений используется бинарная генерация с заданной вероятностью
- Все типы данных могут содержать None-значения в соответствии с вероятностными параметрами
Примеры использования¶
Простой пример¶
# Пример использования
if __name__ == "__main__":
# Параметры генерации
columns = [
('name', 'str'),
('age', 'int'),
('salary', 'float'),
('is_active', 'bool')
]
text_substrings = {
'name': ['Alex', 'John', 'Emma', 'Sarah', 'Max', 'User']
}
numeric_ranges = {
'age': (18, 65),
'salary': (30000.0, 120000.0)
}
bool_probabilities = {
'is_active': 0.7
}
# Генерация DataFrame
df = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=0.9,
numeric_probability=0.95,
bool_probability=0.85,
mean_row_count=50,
deviation_row_count=10
)
print(f"\nСгенерировано строк: {len(df)}")
print("\nИнформация о данных:")
display(df.info())
print("\nПервые 5 строк:")
display(df.head())
Сгенерировано строк: 52 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 52 entries, 0 to 51 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 48 non-null object 1 age 50 non-null float64 2 salary 49 non-null float64 3 is_active 45 non-null object dtypes: float64(2), object(2) memory usage: 1.8+ KB
None
Первые 5 строк:
| name | age | salary | is_active | |
|---|---|---|---|---|
| 0 | Max | 22.0 | 90500.310685 | True |
| 1 | John | 29.0 | 106381.496347 | True |
| 2 | Sarah | 65.0 | 76617.331440 | True |
| 3 | Alex | 41.0 | 114616.580464 | True |
| 4 | Emma | 19.0 | 59231.783551 | False |
Пример генерации датафрейма с тестовыми данными контрагентов¶
Здесь приведен пример создания датафрема с тестовыми данными для векторного анализа названий контрагентов организации с целью автоматизации группировки дублей карточек контрагентов. В датафрейме должны присутствовать поля ID, Name, FullName, LegalAddress, Phone, Email, ContactAddress, 1INN, KPP, OGRN, OKPO, OKVED. Часть полей имеют сложную структуру для случайной генерации, поэтому потребуется сначала создать их отдельно с помощью функции generate_dataframe, а после их обработки собрать в единый датафрейм.
Переменные с основами значений¶
# Основы значений для ID, Name, FullName,
# LegalAddress, Phone, Email, ContactAddress,
# INN, KPP, OGRN, OKPO, OKVED
# Мужские имена, отчества и фамилии
man_firstname = ['Авдей', 'Альберт', 'Арис', 'Арман', 'Богдан',
'Борис', 'Бронислав', 'Валентин', 'Гектор', 'Глеб',
'Григорий', 'Даниил', 'Дарий', 'Демид', 'Демьян',
'Елисей', 'Елизар', 'Жан', 'Илья', 'Камиль',
'Кир', 'Лев', 'Леонид', 'Левон', 'Марк',
'Матвей', 'Маркелл', 'Мирон', 'Митрофан', 'Нил',
'Натан', 'Оскар', 'Пётр', 'Порфирий', 'Прокопий',
'Прохор', 'Рафаэль', 'Рагнар', 'Севастьян', 'Стивен',
'Таир', 'Тамаз', 'Тарон', 'Тимофей', 'Тимур',
'Феликс', 'Эдвард', 'Эльбрус', 'Эрнест', 'Яков']
man_patronymic = ['Александрович', 'Алексеевич', 'Анатольевич', 'Андреевич', 'Аркадьевич',
'Антонович', 'Арсеньевич', 'Борисович', 'Вадимович', 'Валентинович',
'Валерьевич', 'Васильевич', 'Вениаминович', 'Викторович', 'Витальевич',
'Владимирович', 'Владиславович', 'Вячеславович', 'Геннадьевич', 'Георгиевич',
'Глебович', 'Григорьевич', 'Денисович', 'Дмитриевич', 'Евгеньевич',
'Евдокимович', 'Иванович', 'Игнатьевич', 'Игоревич', 'Ильич',
'Кириллович', 'Константинович', 'Леонидович', 'Львович', 'Максимович',
'Михайлович', 'Николаевич', 'Олегович', 'Павлович', 'Петрович',
'Платонович', 'Прокофьевич', 'Прохорович', 'Романович', 'Ростиславович',
'Рудольфович', 'Русланович', 'Рустамович', 'Семёнович', 'Сергеевич']
man_lastname = ['Иванов', 'Смирнов', 'Кузнецов', 'Соколов', 'Попов',
'Лебедев', 'Козлов', 'Новиков', 'Морозов', 'Петров',
'Волков', 'Соловьёв', 'Васильев', 'Зайцев', 'Павлов',
'Семёнов', 'Голубев', 'Виноградов', 'Богданов', 'Воробьёв',
'Фёдоров', 'Михайлов', 'Беляев', 'Тарасов', 'Белов',
'Комаров', 'Орлов', 'Киселёв', 'Макаров', 'Андреев',
'Ковалёв', 'Ильин', 'Гусев', 'Титов', 'Кузьмин',
'Кудрявцев', 'Баранов', 'Куликов', 'Алексеев', 'Степанов',
'Яковлев', 'Сорокин', 'Сергеев', 'Романов', 'Захаров',
'Борисов', 'Королёв', 'Герасимов', 'Пономарёв', 'Григорьев']
# Женские имена, отчества и фамилии
woman_firstname = ['София', 'Анастасия', 'Виктория', 'Ксения', 'Арина',
'Елизавета', 'Аделина', 'Ирина', 'Елена', 'Полина',
'Дарья', 'Наталья', 'Светлана', 'Вера', 'Надежда',
'Галина', 'Любовь', 'Александра', 'Мария', 'Анна',
'Ангелина', 'Алиса', 'Алла', 'Антонина', 'Анфиса',
'Ассоль', 'Валерия', 'Варвара', 'Василиса', 'Васса',
'Вероника', 'Глафира', 'Гликерия', 'Дана', 'Евгения',
'Евдокия', 'Екатерина', 'Ева', 'Капитолина', 'Карина',
'Каролина', 'Кира', 'Клавдия', 'Клара', 'Кристина',
'Лада', 'Лариса', 'Лидия', 'Людмила', 'Маргарита']
woman_patronymic = ['Александровна', 'Алексеевна', 'Анатольевна', 'Андреевна', 'Аркадьевна',
'Антоновна', 'Арсеньевна', 'Борисовна', 'Вадимовна', 'Валентиновна',
'Валерьевна', 'Васильевна', 'Вениаминовна', 'Викторовна', 'Витальевна',
'Владимировна', 'Владиславовна', 'Вячеславовна', 'Геннадьевна', 'Георгиевна',
'Глебовна', 'Григорьевна', 'Денисовна', 'Дмитриевна', 'Евгеньевна',
'Евдокимовна', 'Ивановна', 'Игнатьевна', 'Игоревна', 'Ильинична',
'Кирилловна', 'Константиновна', 'Леонидовна', 'Львовна', 'Максимовна',
'Михайловна', 'Николаевна', 'Олеговна', 'Павловна', 'Петровна',
'Платоновна', 'Романовна', 'Рудольфовна', 'Сергеевна', 'Степановна',
'Тимофеевна', 'Фёдоровна', 'Филипповна', 'Юрьевна', 'Яковлевна']
woman_lastname = ['Иванова', 'Смирнова', 'Кузнецова', 'Соколова', 'Попова',
'Васильева', 'Петрова', 'Лебедева', 'Козлова', 'Новикова',
'Морозова', 'Волкова', 'Соловьёва', 'Зайцева', 'Павлова',
'Семёнова', 'Голубева', 'Виноградова', 'Богданова', 'Воробьёва',
'Фёдорова', 'Михайлова', 'Беляева', 'Тарасова', 'Белова',
'Комарова', 'Орлова', 'Киселёва', 'Макарова', 'Андреева',
'Ковалёва', 'Ильина', 'Гусева', 'Титова', 'Кузьмина',
'Кудрявцева', 'Баранова', 'Куликова', 'Алексеева', 'Степанова',
'Яковлева', 'Сорокина', 'Сергеева', 'Романова', 'Захарова',
'Борисова', 'Королёва', 'Герасимова', 'Пономарёва', 'Григорьева']
# Названия организаций
company_name = ['Русский горизонт', 'Северная звезда', 'Новые технологии', 'Чистый источник', 'Зелёная долина',
'Энергопром', 'Стройинновации', 'Кристалл', 'Вектор развития', 'Успех',
'Золотая роща', 'Прогресс', 'Балтийский путь', 'Сибирский лес', 'Дальневосточный бриз',
'Уральские мастера', 'Радуга', 'Чистый воздух', 'Инновационное решение', 'Путь к успеху',
'Русь', 'Волжский поток', 'Светлое будущее', 'Надежные технологии', 'Экологичные решения',
'Северный ветер', 'Южный рассвет', 'Центр прогресса', 'Горизонт возможностей', 'Чистый продукт',
'Сила Сибири', 'Энергия будущего', 'Новый век', 'Русская мечта', 'Вершины успеха',
'Чистая вода', 'Технологии завтрашнего дня', 'Путь инноваций', 'Зелёный мир', 'Развитие и рост',
'Сибирская инициатива', 'Дальневосточные горизонты', 'Уральское качество', 'Светлый путь', 'Новые вершины',
'Чистый мир', 'Русские традиции', 'Инновационный прорыв', 'Будущее сегодня', 'Русская перспектива.',
'ЭкоДом', 'Чистый ЭкоДом', 'Дом ЭкоЧиста', 'ЭкоДом Чистый', 'Чистота Дома Эко',
'Зелёный Уголок', 'Уголок Зелени', 'Зелёная Улочка', 'Угол Зелени', 'Зелёные Уголки',
'Путь Света', 'Светлое Направление', 'Светлый Курс', 'Дорога Света', 'Светлый Тракт',
'Новая Эра', 'Век Новых Технологий', 'Эра Нового Века', 'Новое Время Века', 'Век Новизны',
'Быстрый Запуск', 'Старт Быстро', 'Быстрая Старт-Система', 'Мгновенный Старт', 'Скоро Старт',
'ЧистыйВоздух', 'ИнновационноеРешение', 'ПутьУКспеху', 'ВолжскийПоток', 'СветлоеБудущее',
'НадежныеТехнологии', 'ЭкологичныеРешения', 'СеверныйВетер', 'ЮжныйРассвет', 'ЦентрПрогресса',
'ГоризонтВозможностей', 'ЧистыйПродукт', 'СилаСибири', 'ЭнергияБудущего', 'НовыйВек',
'РусскаяМечта', 'ВершиныУспеха', 'Зеленый мир', 'Развитие рост', 'Сибирская Инициатива',
'Дальневосточные Горизонты', 'Уральское Качество', 'Светлый Путь', 'Новые Вершины', 'Чистые источники']
# Вероятность появления ИП для ФИО
ip = .3
# Юридические формы организаций
org_forms = ['ООО', 'ОАО', 'ЗАО']
# Город и улица - основа адресов
street = ['Москва, ул. Академика Анохина', 'Москва, ул. Александра Лукьянова',
'Москва, ул. Александра Невского', 'Москва, ул. Алексея Дикого',
'Москва, ул. Алексеевская', 'Москва, Арбатская ул.',
'Москва, Большая Никитская ул.', 'Москва, Большая Ордынка',
'Москва, Большая Садовая ул.', 'Москва, Варварка',
'Москва, Гоголевский бульвар', 'Москва, ул. Горького',
'Москва, ул. Гжельского переулка', 'Москва, ул. Гиляровского',
'Москва, Гончарная ул.', 'Москва, ул. Горлова',
'Москва, ул. Говорова', 'Москва, Головановский переулок',
'Москва, Головинская набережная', 'Москва, Голубинская ул.',
'Москва, ул. Гончарова', 'Москва, Гончаровский переулок',
'Москва, Горбунова ул.', 'Москва, Горловский тупик',
'Москва, Горловская 1-я ул.', 'Москва, ул. Генерала Карбышева',
'Москва, Георгиевский переулок', 'Москва, ул. Герасима Курина',
'Москва, ул. Героев Панфиловцев', 'Москва, Гжатская ул.',
'Москва, Глазовский переулок', 'Москва, Глебовская ул.',
'Москва, Глинищевский переулок', 'Москва, Глухарёв переулок',
'Москва, ул. Головачёва', 'Москва, Головинское шоссе',
'Москва, Голутвинский 1-й переулок', 'Москва, Гольяновская ул.',
'Москва, Гончарная набережная', 'Москва, ул. Девичьего поля',
'Москва, Дегунинская ул.', 'Москва, ул. Добрынина',
'Москва, Донская ул.', 'Москва, ул. Доктора Гааза',
'Москва, Дорожная ул.', 'Москва, ул. Достоевского',
'Москва, ул. Дубининская', 'Москва, ул. Земляного вала',
'Москва, Знаменская ул.', 'Москва, Зубовский бульвар',
'Москва, Изваринская ул.', 'Москва, Ильинка',
'Москва, Кадашевская набережная', 'Москва, Каланчёвская ул.',
'Москва, Калитниковская Большая ул.', 'Москва, Калитниковский Большой проезд',
'Москва, ул. Казакова', 'Москва, Казачий переулок',
'Москва, ул. Каретный ряд', 'Москва, Каретный переулок',
'Москва, ул. Кирова', 'Москва, ул. Косыгина',
'Москва, ул. Красина', 'Москва, ул. Крутицкий переулок',
'Москва, ул. Кузнецкий Мост', 'Москва, ул. Кудринского переулка',
'Москва, ул. Курского вокзала', 'Москва, ул. Лаврушинский переулок',
'Москва, ул. Лефортовский вал', 'Москва, ул. Льва Толстого',
'Москва, ул. Ленивка', 'Москва, ул. Лубянка',
'Москва, ул. Малая Бронная', 'Москва, ул. Маросейка',
'Москва, ул. Маршала Жукова', 'Москва, ул. Марьина Роща',
'Москва, ул. Мастеркова', 'Москва, ул. Маяковского',
'Москва, ул. Мещанская', 'Москва, ул. Милютинский переулок',
'Москва, ул. Моховая', 'Москва, ул. Мясницкая',
'Москва, ул. Нагатинская', 'Москва, ул. Неглинная',
'Москва, ул. Николоямская', 'Москва, ул. Новая Басманная',
'Москва, ул. Остоженка', 'Москва, ул. Патриарших прудов',
'Москва, ул. Покровка', 'Москва, ул. Пречистенка',
'Москва, ул. Пятницкая', 'Москва, ул. Рождественка',
'Москва, ул. Рощинская', 'Москва, ул. Садовническая',
'Москва, ул. Самотечная', 'Москва, ул. Серафимовича',
'Москва, ул. Симоновская набережная', 'Москва, ул. Спартаковская',
'Москва, ул. Старая Басманная', 'Москва, ул. Тверская']
# Номера домов для адресов
num_house = (1, 50)
# Номера квартир или офисов для адресов
num_office = (1, 100)
# Номера телефонов
Phone = (70000000000, 79999999999)
# E-mail
Email = ['anna.smirnova@novomail.ru', 'ivan.petrov@rosnet.com',
'elena.kuznetsova@sibpost.org', 'sergey.voronin@uralinfo.net',
'natalia.egorova@volgaweb.ru', 'dmitriy.levin@centerlink.su',
'olga.fedorova@raduga-net.com', 'alexey.nikitin@steppe.info',
'kseniya.andreeva@whitecloud.org', 'mikhail.golubev@northstar.ru',
'tatyana.sidorova@southway.net', 'roman.borisov@eastgate.com',
'valentina.kuzmina@westline.org', 'artem.grigoriev@crystalweb.ru',
'ekaterina.stepanova@goldenpeak.net', 'pavel.korolev@silverlake.com',
'irina.makarova@rainbow.info', 'vladimir.sidorov@mountainview.org',
'alina.volkova@clearstream.ru', 'alexandr.chernov@brightsky.net',
'galina.loginova@forestpath.com', 'daniil.malyshev@riverflow.org',
'lara.karpova@sunshine.ru', 'igor.novikov@windfield.net',
'maria.danilova@starlight.com', 'nikita.ermakov@moonrise.org',
'veronika.klimova@oceanview.ru', 'igor.afanasev@springtime.net',
'alla.sokolova@autumnleaf.com', 'ilya.kuznetsov@wintersnow.org',
'lyubov.popova@dreamland.ru', 'timofey.babushkin@happyhome.net',
'anastasiya.martynova@magickey.com', 'roman.kudryavtsev@silvershore.org',
'oksana.lukinova@goldenrose.ru', 'vadim.yakovlev@redhill.net',
'polina.matveeva@blueocean.com', 'yuri.kravchenko@greenfield.org',
'margarita.abramova@yellowflower.ru', 'gennady.panin@blackpearl.net',
'arina.fedchenko@whitewater.com', 'igor.denisov@purplecloud.org',
'darya.shcherbakova@silvermoon.ru', 'andrey.kiselev@goldenhour.net',
'elena.leskova@redstar.com', 'maksim.ivanov@bluebird.org',
'valeria.nikitina@whitehill.ru', 'anton.sidorenko@greendream.net',
'olga.vasilyeva@silverlake.com', 'igor.gribanov@redriver.org',
'ekaterina.dmitrieva@goldenpath.ru', 'sergey.kondratiev@bluemountain.net',
'natalya.orlova@silverpeak.com', 'dmitriy.kharitonov@redforest.org',
'anna.kashina@whiterock.ru', 'alexey.lysenko@greenvalley.net',
'tatyana.klimentieva@bluehorizon.com', 'roman.stepanov@silverwave.org',
'valentina.kudryashova@redsun.ru', 'artem.denisenko@greenlight.net',
'ekaterina.kozlova@bluefire.com', 'pavel.tarasov@silverrain.org',
'irina.kopylova@redrose.ru', 'vladimir.kuzmin@greenleaf.net',
'alina.savenko@bluewind.com', 'alexandr.fedorov@silverstar.org',
'galina.nikiforova@redmoon.ru', 'daniil.petrenko@greenhill.net',
'lara.antipova@blueocean2.com', 'igor.sidorchuk@silverlake2.org',
'maria.kudryavtseva@redpeak.ru', 'nikita.klimov@greenfield2.net',
'veronika.romanova@bluevalley.com', 'igor.kravtsov@silverwood.org',
'alla.karpukha@redriver2.ru', 'ilya.stepanenko@greenpath.net',
'lyubov.kuznetsova@bluesky2.com', 'timofey.kudryashov@silverstream.org',
'anastasiya.shevchenko@redlake.ru', 'roman.leontyev@greenbay.net',
'oksana.fedorchenko@bluecreek.com', 'vadim.kolyada@silverhill.org',
'polina.gordeeva@redrock2.ru', 'yuri.sokolovsky@greenridge.net',
'margarita.krivtsova@bluelake.com', 'gennady.korneev@silvertree.org',
'arina.kuzmina@redvalley2.ru', 'igor.lukyanov@greenmeadow.net',
'darya.antonova@bluefield.com', 'andrey.panferov@silverbrook.org',
'elena.yuryeva@redglen.ru', 'maksim.kozyrev@greenridge2.net',
'valeria.kudryashina@blueriver.com', 'anton.klyuchnikov@silvermeadow.org',
'olga.gribanova@redcreek.ru', 'igor.matrosov@greenhills2.net',
'ekaterina.kravchuk@bluegrass.com', 'sergey.savchenko@silverpond.org',
'natalya.yakovleva@redspring.ru', 'dmitriy.fedosov@greenwood2.net']
# ИНН (отдельно для ИП и организаций)
INN_individual = (111111111111, 999999999999)
INN_legalentity = (1111111111, 9999999999)
# КПП (только для организаций)
KPP = (111111111, 999999999)
# ОГРН (только для организаций)
OGRN = (1111111111111, 9999999999999)
# ОКПО (отдельно для ИП и организаций)
OKPO_individual = (1111111111, 9999999999)
OKPO_legalentity = (11111111, 99999999)
# ОКВЕД (общий для ИП и организаций)
OKVED = ['96.02', # Предоставление услуг парикмахерскими и салонами красоты.
'47.11', # Торговля розничная преимущественно пищевыми продуктами,
# включая напитки, и табачными изделиями в неспециализированных магазинах.
'10.71', # Производство хлеба и мучных кондитерских изделий, тортов и пирожных недлительного хранения.
'55.10', # Деятельность гостиниц и прочих мест для временного проживания.
'56.10', # Деятельность ресторанов и услуги по доставке продуктов питания.
'73.11', # Деятельность рекламных агентств.
'79.11', # Деятельность туристических агентств.
'95.23', # Ремонт обуви и прочих изделий из кожи.
'93.13', # Деятельность фитнес-центров.
'68.31', # Деятельность агентств недвижимости за вознаграждение или на договорной основе.
'69.10', # Деятельность в области права.
'13.96.3', # Производство резиновых нитей и шнуров с текстильным покрытием;
# производство текстильных нитей и лент пропитанных
# или с пластмассовым или резиновым покрытием.
'01.13.11', # Выращивание овощей открытого грунта.
'01.13.12', # Выращивание овощей защищённого грунта.
'01.45', # Разведение овец и коз (включая выращивание и разведение,
# производство сырого овечьего и козьего молока,
# сырой (немытой) шерсти и волоса козы, производство спермы баранов и козлов).
'28.41', # Производство волочильных станов.
'25.73', # Производство оборудования для изготовления отливок и литейных форм (кроме изложниц).
'28.99', # Производство прочего оборудования общего назначения, не включённого в другие группировки.
'58.11.2', # Производство мётел и щёток, включая щётки, являющиеся составными частями машин,
# ручных механических щёток для пола, швабр, метёлок из перьев, малярных кистей,
# малярных валиков, резиновых скребков, прочих метёлок, щёток и т. п.
'96.09' # Предоставление прочих персональных услуг, не включённых в другие группировки
# (например, услуги астрологов и медиумов, услуги эскорта,
# услуги брачных бюро, услуги по уходу за домашними животными,
# деятельность генеалогических организаций и др.).
]
Генерация первичных датафреймов¶
# Датафрейм данных мужчин
# Колонки
columns = [
('man_firstname', 'str'),
('man_patronymic', 'str'),
('man_lastname', 'str'),
('ip', 'bool'),
('street', 'str'),
('num_house', 'int'),
('num_office', 'int'),
('Phone', 'int'),
('Email', 'str'),
('INN_individual', 'int'),
('OKPO_individual', 'int'),
('OKVED', 'str')
]
text_substrings = {
'man_firstname': man_firstname,
'man_patronymic': man_patronymic,
'man_lastname': man_lastname,
'street': street,
'Email': Email,
'OKVED': OKVED
}
numeric_ranges = {
'num_house': num_house,
'num_office': num_office,
'Phone': Phone,
'INN_individual': INN_individual,
'OKPO_individual': OKPO_individual
}
bool_probabilities = {
'ip': ip
}
# Генерация DataFrame
df_man = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=0.9,
numeric_probability=0.95,
bool_probability=0.85,
mean_row_count=500,
deviation_row_count=100
)
print(f"\nСгенерировано строк: {len(df_man)}")
print("\nИнформация о данных:")
display(df_man.info())
print("\nПервые 5 строк:")
display(df_man.head())
Сгенерировано строк: 518 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 518 entries, 0 to 517 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 man_firstname 468 non-null object 1 man_patronymic 459 non-null object 2 man_lastname 464 non-null object 3 ip 428 non-null object 4 street 466 non-null object 5 num_house 491 non-null float64 6 num_office 497 non-null float64 7 Phone 491 non-null float64 8 Email 469 non-null object 9 INN_individual 484 non-null float64 10 OKPO_individual 493 non-null float64 11 OKVED 468 non-null object dtypes: float64(5), object(7) memory usage: 48.7+ KB
None
Первые 5 строк:
| man_firstname | man_patronymic | man_lastname | ip | street | num_house | num_office | Phone | INN_individual | OKPO_individual | OKVED | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Севастьян | Рустамович | Борисов | True | Москва, Головинское шоссе | 46.0 | 87.0 | 7.843016e+10 | roman.kudryavtsev@silvershore.org | 6.438704e+11 | 2.978179e+09 | 28.99 |
| 1 | Бронислав | Глебович | Комаров | True | Москва, ул. Симоновская набережная | 44.0 | 85.0 | 7.016292e+10 | arina.fedchenko@whitewater.com | 2.316330e+11 | 4.393081e+09 | 68.31 |
| 2 | Маркелл | Ростиславович | Киселёв | None | Москва, Глазовский переулок | 42.0 | 37.0 | 7.559275e+10 | maria.danilova@starlight.com | 1.211271e+11 | 6.969218e+09 | 55.10 |
| 3 | Стивен | Валерьевич | None | False | Москва, ул. Курского вокзала | 39.0 | 31.0 | 7.539585e+10 | anastasiya.shevchenko@redlake.ru | 1.171304e+11 | 6.565002e+09 | 96.02 |
| 4 | Феликс | None | Голубев | False | Москва, Глазовский переулок | 7.0 | 29.0 | 7.443084e+10 | gennady.panin@blackpearl.net | 1.795164e+11 | 3.791788e+09 | None |
# Датафрейм данных женщин
# Колонки
columns = [
('woman_firstname', 'str'),
('woman_patronymic', 'str'),
('woman_lastname', 'str'),
('ip', 'bool'),
('street', 'str'),
('num_house', 'int'),
('num_office', 'int'),
('Phone', 'int'),
('Email', 'str'),
('INN_individual', 'int'),
('OKPO_individual', 'int'),
('OKVED', 'str')
]
text_substrings = {
'woman_firstname': woman_firstname,
'woman_patronymic': woman_patronymic,
'woman_lastname': woman_lastname,
'street': street,
'Email': Email,
'OKVED': OKVED
}
numeric_ranges = {
'num_house': num_house,
'num_office': num_office,
'Phone': Phone,
'INN_individual': INN_individual,
'OKPO_individual': OKPO_individual
}
bool_probabilities = {
'ip': ip
}
# Генерация DataFrame
df_woman = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=0.9,
numeric_probability=0.95,
bool_probability=0.85,
mean_row_count=500,
deviation_row_count=100
)
print(f"\nСгенерировано строк: {len(df_woman)}")
print("\nИнформация о данных:")
display(df_woman.info())
print("\nПервые 5 строк:")
display(df_woman.head())
Сгенерировано строк: 578 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 578 entries, 0 to 577 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 woman_firstname 523 non-null object 1 woman_patronymic 519 non-null object 2 woman_lastname 528 non-null object 3 ip 496 non-null object 4 street 515 non-null object 5 num_house 552 non-null float64 6 num_office 547 non-null float64 7 Phone 553 non-null float64 8 Email 521 non-null object 9 INN_individual 550 non-null float64 10 OKPO_individual 557 non-null float64 11 OKVED 521 non-null object dtypes: float64(5), object(7) memory usage: 54.3+ KB
None
Первые 5 строк:
| woman_firstname | woman_patronymic | woman_lastname | ip | street | num_house | num_office | Phone | INN_individual | OKPO_individual | OKVED | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Лидия | Игнатьевна | Сергеева | False | None | 34.0 | 2.0 | 7.806674e+10 | irina.kopylova@redrose.ru | 3.976058e+11 | 2.360131e+09 | 01.13.12 |
| 1 | Клавдия | Борисовна | None | False | Москва, Головинское шоссе | 45.0 | 68.0 | 7.352073e+10 | dmitriy.kharitonov@redforest.org | 5.495068e+11 | 3.621602e+09 | 25.73 |
| 2 | София | Яковлевна | Семёнова | False | Москва, Георгиевский переулок | 34.0 | 19.0 | 7.916471e+10 | igor.sidorchuk@silverlake2.org | 9.802752e+11 | 4.547152e+09 | 28.41 |
| 3 | София | Степановна | Белова | True | Москва, ул. Старая Басманная | 34.0 | 60.0 | 7.840816e+10 | galina.nikiforova@redmoon.ru | 9.796471e+11 | 6.404572e+09 | 58.11.2 |
| 4 | Глафира | Витальевна | Комарова | None | Москва, Калитниковский Большой проезд | 29.0 | 84.0 | 7.593570e+10 | igor.denisov@purplecloud.org | 1.448082e+11 | 8.500254e+09 | 55.10 |
# Датафрейм данных организаций
# Колонки
columns = [
('company_name', 'str'),
('org_forms', 'str'),
('street', 'str'),
('num_house', 'int'),
('num_office', 'int'),
('Phone', 'int'),
('Email', 'str'),
('INN_legalentity', 'int'),
('KPP', 'int'),
('OGRN', 'int'),
('OKPO_legalentity', 'int'),
('OKVED', 'str')
]
text_substrings = {
'company_name': company_name,
'org_forms': org_forms,
'street': street,
'num_house': num_house,
'num_office': num_office,
'Phone': Phone,
'Email': Email,
'OKVED': OKVED
}
numeric_ranges = {
'num_house': num_house,
'num_office': num_office,
'Phone': Phone,
'INN_legalentity': INN_legalentity,
'KPP': KPP,
'OGRN': OGRN,
'OKPO_legalentity': OKPO_legalentity
}
# Генерация DataFrame
df_legalentity = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=0.9,
numeric_probability=0.95,
bool_probability=0.85,
mean_row_count=100,
deviation_row_count=10
)
print(f"\nСгенерировано строк: {len(df_legalentity)}")
print("\nИнформация о данных:")
display(df_legalentity.info())
print("\nПервые 5 строк:")
display(df_legalentity.head())
Сгенерировано строк: 95 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 95 entries, 0 to 94 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 company_name 87 non-null object 1 org_forms 84 non-null object 2 street 81 non-null object 3 num_house 93 non-null float64 4 num_office 92 non-null float64 5 Phone 86 non-null float64 6 Email 85 non-null object 7 INN_legalentity 94 non-null float64 8 KPP 92 non-null float64 9 OGRN 90 non-null float64 10 OKPO_legalentity 87 non-null float64 11 OKVED 82 non-null object dtypes: float64(7), object(5) memory usage: 9.0+ KB
None
Первые 5 строк:
| company_name | org_forms | street | num_house | num_office | Phone | INN_legalentity | KPP | OGRN | OKPO_legalentity | OKVED | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Стройинновации | ООО | None | NaN | 37.0 | 7.549637e+10 | None | 6.712128e+09 | 838330515.0 | 6.314969e+12 | NaN | 79.11 |
| 1 | ЭкоДом | ОАО | Москва, ул. Дубининская | 14.0 | 24.0 | 7.387444e+10 | valentina.kudryashova@redsun.ru | 5.721200e+09 | 941986096.0 | 8.863192e+12 | 36940253.0 | 69.10 |
| 2 | Чистый продукт | ООО | Москва, Гольяновская ул. | 25.0 | 48.0 | 7.845106e+10 | alla.sokolova@autumnleaf.com | 2.070480e+09 | 312135872.0 | 8.617184e+12 | 71561391.0 | None |
| 3 | Русь | ЗАО | Москва, ул. Горлова | 49.0 | 77.0 | 7.729238e+10 | kseniya.andreeva@whitecloud.org | 7.305305e+09 | NaN | 8.863948e+12 | 59827362.0 | 25.73 |
| 4 | Старт Быстро | ООО | Москва, ул. Мещанская | 45.0 | 94.0 | 7.041111e+10 | None | 5.863802e+09 | 421512646.0 | 5.443479e+12 | 14767486.0 | 01.13.11 |
Обработка первичных датафреймов и их сборка¶
После обработки первичных датафреймов и их объединения в итоговом датафрейме должны остаться только колонки ID, Name, FullName, LegalAddress, Phone, Email, LegalAddress, INN, KPP, OGRN, OKPO, OKVED.
# Обработка первичного датафрейма df_man
# Полное и краткое имя
df_man['FullName'] = df_man['man_lastname'] + ' ' + df_man['man_firstname'] + ' ' + df_man['man_patronymic']
df_man['Name'] = df_man['man_lastname'] + ' ' + df_man['man_firstname'][0][0] + '.' + df_man['man_patronymic'][0][0] + '.'
# ИП
df_man.loc[df_man['ip'] == True, 'FullName'] = 'ИП ' + df_man['FullName']
df_man.loc[df_man['ip'] == True, 'Name'] = 'ИП ' + df_man['Name']
df_man.loc[df_man['ip'] == False, 'OKPO_individual'] = None
df_man.loc[df_man['ip'] == False, 'OKVED'] = None
# Официальный и контактный адрес
df_man['LegalAddress'] = df_man['street'] + ', д.' + df_man['num_house'].astype('str').str.replace('.0', '') \
+ ', кв.' + df_man['num_office'].astype('str').str.replace('.0', '')
df_man['ContactAddress'] = df_man['street'] + ', д.' + (df_man['num_house'] + np.random.randint(0, 10)).astype('str').str.replace('.0', '') \
+ ', кв.' + (df_man['num_office'] + np.random.randint(0, 10)).astype('str').str.replace('.0', '')
# Удаление не нудных далее столбцов
df_man = df_man.drop(['man_firstname', 'man_patronymic', 'man_lastname',
'ip', 'street', 'num_house', 'num_office'], axis=1)
# Переименование столбцов
df_man = df_man.rename(columns={'INN_individual':'INN', 'OKPO_individual':'OKPO'})
# Приведение float к str
for i in ['Phone', 'INN', 'OKPO']:
df_man[i] = df_man[i].astype('str').str.replace('.0', '')
df_man.head()
| Phone | INN | OKPO | OKVED | FullName | Name | LegalAddress | ContactAddress | ||
|---|---|---|---|---|---|---|---|---|---|
| 0 | 78430158691 | roman.kudryavtsev@silvershore.org | 643870358146 | 2978179421 | 28.99 | ИП Борисов Севастьян Рустамович | ИП Борисов С.Р. | Москва, Головинское шоссе, д.46, кв.87 | Москва, Головинское шоссе, д.53, кв.96 |
| 1 | 70162920670 | arina.fedchenko@whitewater.com | 231632986416 | 4393081208 | 68.31 | ИП Комаров Бронислав Глебович | ИП Комаров С.Р. | Москва, ул. Симоновская набережная, д.44, кв.85 | Москва, ул. Симоновская набережная, д.51, кв.94 |
| 2 | 75592745994 | maria.danilova@starlight.com | 121127059610 | 6969217501 | 55.10 | Киселёв Маркелл Ростиславович | Киселёв С.Р. | Москва, Глазовский переулок, д.42, кв.37 | Москва, Глазовский переулок, д.49, кв.46 |
| 3 | 75395852570 | anastasiya.shevchenko@redlake.ru | 117130442704 | nan | None | NaN | NaN | Москва, ул. Курского вокзала, д.39, кв.31 | Москва, ул. Курского вокзала, д.46, кв.40 |
| 4 | 74430844919 | gennady.panin@blackpearl.net | 179516448278 | nan | None | NaN | Голубев С.Р. | Москва, Глазовский переулок, д.7, кв.29 | Москва, Глазовский переулок, д.14, кв.38 |
# Обработка первичного датафрейма df_woman
df_woman['FullName'] = df_woman['woman_lastname'] + ' ' + df_woman['woman_firstname'] + ' ' + df_woman['woman_patronymic']
df_woman['Name'] = df_woman['woman_lastname'] + ' ' + df_woman['woman_firstname'] + ' ' + df_woman['woman_patronymic']
# ИП
df_woman.loc[df_woman['ip'] == True, 'FullName'] = 'ИП ' + df_woman['FullName']
df_woman.loc[df_woman['ip'] == True, 'Name'] = 'ИП ' + df_woman['Name']
df_woman.loc[df_woman['ip'] == False, 'OKPO_individual'] = None
df_woman.loc[df_woman['ip'] == False, 'OKVED'] = None
# Официальный и контактный адрес
df_woman['LegalAddress'] = df_woman['street'] + ', д.' + df_woman['num_house'].astype('str').str.replace('.0', '') \
+ ', кв.' + df_woman['num_office'].astype('str').str.replace('.0', '')
df_woman['ContactAddress'] = df_woman['street'] + ', д.' + (df_woman['num_house'] + np.random.randint(0, 10)).astype('str').str.replace('.0', '') \
+ ', кв.' + (df_woman['num_office'] + np.random.randint(0, 10)).astype('str').str.replace('.0', '')
# Удаление не нудных далее столбцов
df_woman = df_woman.drop(['woman_firstname', 'woman_patronymic', 'woman_lastname',
'ip', 'street', 'num_house', 'num_office'], axis=1)
# Переименование столбцов
df_woman = df_woman.rename(columns={'INN_individual':'INN', 'OKPO_individual':'OKPO'})
# Приведение float к str
for i in ['Phone', 'INN', 'OKPO']:
df_woman[i] = df_woman[i].astype('str').str.replace('.0', '')
df_woman.head()
| Phone | INN | OKPO | OKVED | FullName | Name | LegalAddress | ContactAddress | ||
|---|---|---|---|---|---|---|---|---|---|
| 0 | 78066742534 | irina.kopylova@redrose.ru | 397605787977 | nan | None | Сергеева Лидия Игнатьевна | Сергеева Лидия Игнатьевна | NaN | NaN |
| 1 | 73520732204 | dmitriy.kharitonov@redforest.org | 549506841678 | nan | None | NaN | NaN | Москва, Головинское шоссе, д.45, кв.68 | Москва, Головинское шоссе, д.54, кв.71 |
| 2 | 79164709673 | igor.sidorchuk@silverlake2.org | 980275150120 | nan | None | Семёнова София Яковлевна | Семёнова София Яковлевна | Москва, Георгиевский переулок, д.34, кв.19 | Москва, Георгиевский переулок, д.43, кв.22 |
| 3 | 78408155454 | galina.nikiforova@redmoon.ru | 979647058382 | 6404572433 | 58.11.2 | ИП Белова София Степановна | ИП Белова София Степановна | Москва, ул. Старая Басманная, д.34, кв.60 | Москва, ул. Старая Басманная, д.43, кв.63 |
| 4 | 75935699232 | igor.denisov@purplecloud.org | 144808239041 | 8500253664 | 55.10 | Комарова Глафира Витальевна | Комарова Глафира Витальевна | Москва, Калитниковский Большой проезд, д.29, к… | Москва, Калитниковский Большой проезд, д.38, к… |
# Обработка первичного датафрейма df_legalentity
df_legalentity['Name'] = df_legalentity['org_forms'] + ' ' + df_legalentity['company_name']
# ИП
df_legalentity.loc[df_legalentity['org_forms'] == 'ООО', 'org_forms'] = 'Общество с ограниченной ответственностью'
df_legalentity.loc[df_legalentity['org_forms'] == 'ОАО', 'org_forms'] = 'Открытое акционерное общество'
df_legalentity.loc[df_legalentity['org_forms'] == 'ЗАО', 'org_forms'] = 'Закрытое акционерное общество'
# Официальный и контактный адрес
df_legalentity['LegalAddress'] = df_legalentity['street'] + ', д.' + df_legalentity['num_house'].astype('str').str.replace('.0', '') \
+ ', оф.' + df_legalentity['num_office'].astype('str').str.replace('.0', '')
df_legalentity['ContactAddress'] = df_legalentity['street'] + ', д.' + (df_legalentity['num_house']
+ np.random.randint(0, 10)).astype('str').str.replace('.0', '') \
+ ', оф.' + (df_legalentity['num_office']
+ np.random.randint(0, 10)).astype('str').str.replace('.0', '')
# Удаление не нудных далее столбцов
df_legalentity = df_legalentity.drop(['company_name', 'org_forms',
'street', 'num_house', 'num_office'], axis=1)
# Переименование столбцов
df_legalentity = df_legalentity.rename(columns={'INN_legalentity':'INN', 'OKPO_legalentity':'OKPO'})
# Приведение float к str
for i in ['Phone', 'INN', 'KPP', 'OGRN', 'OKPO']:
df_legalentity[i] = df_legalentity[i].astype('str').str.replace('.0', '')
df_legalentity.head()
| Phone | INN | KPP | OGRN | OKPO | OKVED | Name | LegalAddress | ContactAddress | ||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 75496367798 | None | 6712127893 | 838330515 | 6314969265700 | nan | 79.11 | ООО Стройинновации | NaN | NaN |
| 1 | 73874438427 | valentina.kudryashova@redsun.ru | 5721199832 | 941986096 | 8863192007553 | 36940253 | 69.10 | ОАО ЭкоДом | Москва, ул. Дубининская, д.14, оф.24 | Москва, ул. Дубининская, д.23, оф.29 |
| 2 | 78451062414 | alla.sokolova@autumnleaf.com | 2070480258 | 312135872 | 8617183999073 | 71561391 | None | ООО Чистый продукт | Москва, Гольяновская ул., д.25, оф.48 | Москва, Гольяновская ул., д.34, оф.53 |
| 3 | 77292384345 | kseniya.andreeva@whitecloud.org | 7305305315 | nan | 8863947900334 | 59827362 | 25.73 | ЗАО Русь | Москва, ул. Горлова, д.49, оф.77 | Москва, ул. Горлова, д.58, оф.82 |
| 4 | 70411107510 | None | 5863802025 | 421512646 | 5443478938953 | 14767486 | 01.13.11 | ООО Старт Быстро | Москва, ул. Мещанская, д.45, оф.94 | Москва, ул. Мещанская, д.54, оф.99 |
Сборка финального датафрейма с тестовыми данными контрагентов¶
# Сборка финального датафрейма с тестовыми данными контрагентов
df_contragents = pd.concat([df_man, df_woman, df_legalentity], axis=0, ignore_index=True)
df_contragents['ID'] = [str(uuid.uuid4().hex)[:16] for _ in range(len(df_contragents))]
df_contragents = df_contragents.reindex(columns=['ID', 'Name', 'FullName',
'LegalAddress', 'Phone', 'Email', 'ContactAddress',
'INN', 'KPP', 'OGRN', 'OKPO', 'OKVED'])
df_contragents.to_csv('df_contragents.csv')
print(f"\nСгенерировано строк: {len(df_contragents)}")
print("\nИнформация о данных:")
display(df_contragents.info())
print("\nПервые 5 строк:")
display(df_contragents.head())
Сгенерировано строк: 1191 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 1191 entries, 0 to 1190 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 1191 non-null object 1 Name 972 non-null object 2 FullName 803 non-null object 3 LegalAddress 1062 non-null object 4 Phone 1191 non-null object 5 Email 1075 non-null object 6 ContactAddress 1062 non-null object 7 INN 1191 non-null object 8 KPP 95 non-null object 9 OGRN 95 non-null object 10 OKPO 1191 non-null object 11 OKVED 525 non-null object dtypes: object(12) memory usage: 111.8+ KB
None
Первые 5 строк:
| ID | Name | FullName | LegalAddress | Phone | ContactAddress | INN | KPP | OGRN | OKPO | OKVED | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 7cfef8ee9ae74414 | ИП Борисов С.Р. | ИП Борисов Севастьян Рустамович | Москва, Головинское шоссе, д.46, кв.87 | 78430158691 | roman.kudryavtsev@silvershore.org | Москва, Головинское шоссе, д.53, кв.96 | 643870358146 | NaN | NaN | 2978179421 | 28.99 |
| 1 | 9fc0f1b9e4cb4076 | ИП Комаров С.Р. | ИП Комаров Бронислав Глебович | Москва, ул. Симоновская набережная, д.44, кв.85 | 70162920670 | arina.fedchenko@whitewater.com | Москва, ул. Симоновская набережная, д.51, кв.94 | 231632986416 | NaN | NaN | 4393081208 | 68.31 |
| 2 | a0887d6cd675473e | Киселёв С.Р. | Киселёв Маркелл Ростиславович | Москва, Глазовский переулок, д.42, кв.37 | 75592745994 | maria.danilova@starlight.com | Москва, Глазовский переулок, д.49, кв.46 | 121127059610 | NaN | NaN | 6969217501 | 55.10 |
| 3 | 49db32a4bd8e410b | NaN | NaN | Москва, ул. Курского вокзала, д.39, кв.31 | 75395852570 | anastasiya.shevchenko@redlake.ru | Москва, ул. Курского вокзала, д.46, кв.40 | 117130442704 | NaN | NaN | nan | None |
| 4 | 4c0080ab4ee6416e | Голубев С.Р. | NaN | Москва, Глазовский переулок, д.7, кв.29 | 74430844919 | gennady.panin@blackpearl.net | Москва, Глазовский переулок, д.14, кв.38 | 179516448278 | NaN | NaN | nan | None |
