Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог
Python

Генератор датафреймов Pandas

Генератор датафреймов Pandas
Python

Часто для тестирования кода обработки или анализа больших данных требуются датафреймы с тестовыми данными. По разным причинам в тестах часто нельзя использовать реальные эксплуатационные данные. Вручную создавать подобные датафреймы очень накладно. Поэтому, здесь предлагается автоматическая генерация подобных датафреймов с применением библиотек Pandas, Numpy и Random в Python, которые принято применять при анализе больших данных.

Исходнные вводные для датафрейма.

Предлагается генерацию датафрейма с тестовыми данными обернуть в функцию generate_dataframe, которая у условии будет принимать на вход параметры:

  1. Cписок и тип столбцов.
  2. Наборы подстрок для каждого из будущих строковых значений и вероятностный алгоритм их объединения.
  3. Диапазоны числовых значений для каждого из числовых столбцов.
  4. Вероятность появления всех текстовых, числовых и булевых значений будущего датафрейма.
  5. Значение среднего количества строк датафрейма.
  6. Модуль значения отклонения допустимого количество строк от среднего количества строк датафрейма.

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

Функция автоматической генерации датафрейма с тестовыми данными¶

In [4]:
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)

Основные особенности реализации:

  1. Типы столбцов задаются парой (имя, тип), где тип может быть:
    • str — строковые значения
    • int — целые числа
    • float — числа с плавающей точкой
    • bool — булевы значения
  2. Для каждого типа данных используются свои параметры генерации:
    • Строки: объединяются случайные подстроки из заданного списка
    • Числа: генерируются в заданном диапазоне
    • Булевы значения: учитывают вероятность появления True
  3. Вероятностные параметры:
    • text_probability — вероятность появления текстового значения
    • numeric_probability — вероятность появления числового значения
    • bool_probability — вероятность появления булевого значения
  4. Контроль количества строк:
    • mean_row_count — среднее количество строк
    • deviation_row_count — допустимое отклонение
    • Фактическое количество строк генерируется случайно в диапазоне [mean — deviation, mean + deviation]
  5. Особенности генерации:
    • Для строковых значений используется случайная комбинация подстрок
    • Для числовых значений равномерное распределение в заданном диапазоне
    • Для булевых значений используется бинарная генерация с заданной вероятностью
    • Все типы данных могут содержать None-значения в соответствии с вероятностными параметрами

Примеры использования¶

Простой пример¶

In [8]:
# Пример использования
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, а после их обработки собрать в единый датафрейм.

Переменные с основами значений¶

In [11]:
# Основы значений для 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' # Предоставление прочих персональных услуг, не включённых в другие группировки 
                 # (например, услуги астрологов и медиумов, услуги эскорта, 
                 # услуги брачных бюро, услуги по уходу за домашними животными, 
                 # деятельность генеалогических организаций и др.).
]

Генерация первичных датафреймов¶

In [13]:
# Датафрейм данных мужчин

# Колонки
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 Email 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
In [14]:
# Датафрейм данных женщин

# Колонки
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 Email 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
In [15]:
# Датафрейм данных организаций

# Колонки
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 Email 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.

In [17]:
# Обработка первичного датафрейма 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()
Out[17]:
Phone Email 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
In [18]:
# Обработка первичного датафрейма 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()
Out[18]:
Phone Email 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, к…
In [19]:
# Обработка первичного датафрейма 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()
Out[19]:
Phone Email 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

Сборка финального датафрейма с тестовыми данными контрагентов¶

In [21]:
# Сборка финального датафрейма с тестовыми данными контрагентов
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 Email 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

pandas Python tessa анализ математика практика тесса тест

Предыдущая статьяDeepSeek сгенерировал ролевую модель предоставления разрешений в Tessa

Рубрики

Метки

abc abcd excel ms sql pandas Python sql tessa VBA xyz анализ виртуальный помощник данные знания информационная система информация искусственный интеллект кластерный анализ комбинаторика компетенции корпоративная информационная система маркетинг математика мудрость о проекте оптимизация ошибка практика программное обеспечение пэст ролевая модель теория теория вероятностей тесса тест юмор языки программирования

Политика конфиденциальности

Продолжая использовать данный сайт вы подтверждаете свое согласие с условиями его политики конфиденциальности. Подробнее…




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2025)