IMBA - Python | BIM | BI
75 subscribers
47 photos
48 videos
2 files
29 links
Канал для любителей Python, BIM и аналитики данных
Download Telegram
Продолжение базы....👋

💡 sep, end и \n — кастомим print() как хотим 😎

По умолчанию print() ставит пробел между аргументами и перевод строки в конце. Но мы можем это настроить через sep и end!

sep — разделитель между аргументами
По умолчанию sep=' ' (один пробел). Меняем на что угодно:

print('яблоко', 'груша', 'слива', sep=', ')
# яблоко, груша, слива

print('1️⃣', '2️⃣', '3️⃣', sep=' ➤ ')
# 1️⃣ ➤ 2️⃣ ➤ 3️⃣


end — что ставить вместо перевода строки

По умолчанию end='\n' (новая строка). Можно поменять:


print('Первая строка', end=' | ')
print('Вторая строка')
# Первая строка | Вторая строка


\n — символ новой строки
Это специальный символ для перевода строки внутри текста:

print('Строка 1\nСтрока 2\nСтрока 3')
# Строка 1
# Строка 2
# Строка 3

Комбо: всё вместе! 🔥

print('🅰️', '🅱️', '🅲️', sep=' ➤ ', end=' = готово!\n')
# 🅰️ ➤ 🅱️ ➤ 🅲️ = готово!


# Таблица без кривых пробелов
print('Имя', 'Возраст', sep=' | ')
print('Анна', '25', sep=' | ')
print('Борис', '32', sep=' | ')


Мини тест:

Написать программу которая выводит:
⭐️ 1 ⭐️ 2 ⭐️ 3 ⭐️
#пиши в комментариях варианты 🤝

#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
👏1
Продолжение базы... ну и немного фишек:

💡Мои любимые f-строки:

Подстановка переменных:
name = "Аня"
city = "Москва"
print(f"{name} из {city}") # Аня из Москва

f-строки подставляют значения выражений из {} прямо в строку.

Выражения внутри {}:
price = 499
qty = 3
print(f"Сумма: {price * qty} ₽") # Сумма: 1497 ₽

Внутри {} можно писать любое Python-выражение.

Округление (фиксированная точность):
pi = 3.1415926
print(f"pi={pi:.2f}") # pi=3.14

После : идёт формат-спецификатор (как в str.format).

Разделители разрядов:
views = 1234567
print(f"Просмотры: {views:,}") # Просмотры: 1,234,567

Спецификатор , добавляет разделитель тысяч при форматировании чисел.

Проценты из доли:
done = 0.875
print(f"Готово: {done:.0%}") # Готово: 88%

Процентный вывод задаётся формат-спецификатором после : .

Выравнивание “табличкой”:
item = "яблоко"
qty = 12
print(f"{item:<10} | {qty:>5}") # яблоко | 12


Ширина и выравнивание задаются в формате после :.

Динамическая ширина/точность (переменными):
num = 12.34567
w = 8
d = 2
print(f"{num:{w}.{d}f}") # 12.35

В формат-спецификатор можно “вкладывать” вычисляемые поля ширины/точности.

Отладка “имя=значение” (Python 3.8+):
x = 100
y = 200
print(f"{x=}, {y=}, {x+y=}") # x=100, y=200, x+y=300

Запись {expr=} выводит и выражение, и его значение.

Показать repr (видны кавычки и \n):
text = "hi\n"
print(f"{text!r}") # 'hi\n'

Конверсия !r печатает repr() объекта в f-строке. про это кстати сегодня только узнал 😄)

💡Мини Тест: 
Использовать f - строку при выводе из программы при помощи функции print():
name = "Egor"
age = "12"
Необходимо вывести:
Всем привет, меня зовут Егор, мне 12 лет и я люблю играть в хоккей.


делись вариантами в комментариях ⤵️
#Python

⭐️IMBA - Python,BIM,BI
Please open Telegram to view this post
VIEW IN TELEGRAM
продолжение базы...

💡 Сохраняй что бы на забыть ✍️

Задачка на ночь :
Какой тип данных выведет программа?

a = True + False / True


Ответы пишите в комментариях
⤵️

#Python
⭐️ t.me/BIM_PYTHON_BI
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Продолжение базы....Поздновато, ну ниче 💤

❗️Строки (str) — один из самых используемых типов данных в Python.

Вот компактная шпаргалка с примерами 👇

1. Изменение регистра
s = "Hello, World!"

s.upper() # 'HELLO, WORLD!'
s.lower() # 'hello, world!'
s.capitalize() # 'Hello, world!'
s.title() # 'Hello, World!'

2. Поиск и проверка
s = "Hello, World!"

s.startswith("H") # True
s.endswith("!") # True

s.find("o") # 4
s.rfind("o") # 8

s.index("W") # 7
s.rindex("o") # 8

# find() → возвращает -1, если не найдено
# index() → выбрасывает ошибку

3. Замена и подсчёт
s = "Hello, World!"

s.replace("l", "x") # 'Hexxo, Worxd!'
s.replace("l", "x", 1) # 'Hexlo, World!'

s.count("l") # 3

4. Разделение строки
"one;two;three".split(";")
# ['one', 'two', 'three']

"Hello World".split()
# ['Hello', 'World']

5. Очистка строки
"   Hello   ".strip()
# 'Hello'

"---Hello---".strip("-")
# 'Hello'

6. Форматирование
name = "Max"
age = 32

"Hi, {}!".format(name)
# 'Hi, Max!'

"Name: {n}, age: {a}".format(n=name, a=age)
# 'Name: Max, age: 32'

7. Длина строки
len("Hello, World!")
# 13

💡 Вывод:
Строки в Python — мощный инструмент для обработки данных, логов, CSV, BI и автоматизации.

🧠 Сам кстати постоянно использую в работе упомянутые методы по работе с данными.

#Python
⭐️t.me/BIM_PYTHON_BI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
💡 Продолжение базы....как сказка на ночь😀

Тип данных list в Python — зачем он нужен

list — универсальный контейнер для хранения упорядоченных и изменяемых данных.
Используется в 90% реальных задач: данные из файлов, API, BIM-моделей и тд.

data = [1, 2, 3, 4] # Пример

Основные методы list - чекай на изображении ❗️

1. append()
Добавляет один элемент в конец списка
data.append(5)
# [1, 2, 3, 4, 5]

2. extend()
Добавляет несколько элементов
data.extend([6, 7])
# [1, 2, 3, 4, 5, 6, 7]

3. insert()
Вставляет элемент по индексу
data.insert(1, 99)
# [1, 99, 2, 3, 4, 5, 6, 7]

4. remove()
Удаляет первое совпадение по значению
data.remove(99)
# [1, 2, 3, 4, 5, 6, 7]

5. pop()
Удаляет и возвращает элемент
last = data.pop()
# last = 7

6. sort()
Сортирует список
data.sort()

7. reverse()
Разворачивает порядок элементов
data.reverse()


8. index()
Возвращает индекс элемента
data.index(3)
# 2


🧠 Почему list реально полезен?

1. Хранит любые типы данных
2. Идеален для циклов, фильтрации, агрегаций
3. Основа для CSV, Excel, JSON, API, BIM-данных

Мне кажется один из самых популярных типов данных на практике в части данных.
Все - погнал спать 😴

#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
💡 Продолжение базы...сказки на ночь и спать💤
Всеми не любимые словари - но Я с ними подружился (почти)🤩

Тип данных Словарь (dict) — база для аналитики данных в стройке.
dict = “ключ ➡️ значение”: по мне отлично, чтобы хранить атрибуты элемента, статусы, суммы, счетчики и тому подобное.

Почему это важно в аналитике: почти любая сводка = группировка по ключу (этаж/зона/подрядчик/тип/экземпляр) + накопление значений (кол-во/объем/стоимость/статус).
❓Почему на большом объекте это решает: тысячи элементов, десятки моделей, куча статусов — словари дают быстрый учет и чистую агрегацию перед Power BI/SQL

Ниже основные методы данного класса что бы не забыть:

1. get() — безопасно взять значение
elem = {"id": 101, "floor": "05", "status": "OK"}
status = elem.get("status", "UNKNOWN") # "OK"
phase = elem.get("phase", "WIP") # "WIP" (нет ключа)

2. keys() — список “что вообще есть"
elem = {"id": 101, "floor": "05", "status": "OK"}
list(elem.keys()) # ["id", "floor", "status"]

3. values() — только значения
elem = {"id": 101, "floor": "05", "status": "OK"}
list(elem.values()) # [101, "05", "OK"]

4. items() — ключ+значение для обхода
elem = {"id": 101, "floor": "05", "status": "OK"}
for k, v in elem.items():
pass # лог/экспорт/проверка

5. pop() — забрать и удалить по ключу
elem = {"id": 101, "temp": "x", "status": "OK"}
tmp = elem.pop("temp", None) # "x"

6.popitem() — забрать “последнюю” пару
d = {"a": 1, "b": 2}
k, v = d.popitem() # ("b", 2)

7. update() — обновить данные
elem = {"id": 101, "status": "WIP"}
elem.update({"status": "OK", "vol_m3": 12.4})

8. clear() — очистить словарь
cache = {"floor05": 1200, "floor06": 980}
cache.clear()


🧠тема не простая, но только потом понимаешь, как это удобно.

Полезно?❤️⤵️
#Python

⭐️t.me/BIM_PYTHON_BI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💡Ночная база.....Pandas в аналитике данных — зачем он нужен

🐼 pandas — это основной инструмент в Python для работы с табличными данными (как Excel/SQL-таблица, только быстрее и гибче). Он нужен, чтобы:

➡️Загружать данные из CSV/Excel/SQL/API в нормальную структуру (DataFrame)
➡️Чистить мусор: пропуски, дубли, кривые типы, лишние столбцы/строки
➡️Быстро анализировать: группировки, агрегации, расчёты, сводные
➡️Готовить данные для BI: Power BI / DataLens / отчетность — уже чистыми и структурированными

Основные методы ( рекомендую официальную документацию ✍️ : https://pandas.pydata.org/docs/ )

Наглядный пример: ⤵️

import pandas as pd

df = pd.read_csv("data.csv") # Загружаем CSV в DataFrame
print(df.head(3)) # Показываем первые 3 строки (быстрая проверка данных)
print(df.tail(3)) # Показываем последние 3 строки (контроль конца файла)
df.info() # Смотрим структуру: типы столбцов, пропуски, память

df = df.drop(columns=["trash"]) # Удаляем ненужный столбец
df = df.rename(columns={"old":"new"}) # Переименовываем столбец old в new
df["new"] = df["new"].fillna(0) # Заполняем пропуски в new нулями

report = df.groupby("category")["new"].sum() # Группируем по category и суммируем new
print(report) # Выводим итоговый отчёт


#Python
⭐️ t.me/BIM_PYTHON_BI
Please open Telegram to view this post
VIEW IN TELEGRAM
👏1
from collections import Counter

c = Counter("ababaac") # Counter({'a': 4, 'b': 2, 'c': 1})
d = Counter("bccdd") # Counter({'c': 2, 'd': 2, 'b': 1})

Методы:

➡️ most_common(n):
c.most_common(2)         # [('a', 4), ('b', 2)]

➡️elements():
list(c.elements())[:7]   # ['a','a','a','a','b','b','c']

➡️update():
c.update("bbb")          # добавит +3 к 'b'
# c -> {'a': 4, 'b': 5, 'c': 1}

➡️subtract():
c.subtract("ab")         # вычтет 1 у 'a' и 'b'
# c -> {'a': 3, 'b': 4, 'c': 1}

➡️keys():
list(c.keys())           # ['a', 'b', 'c']

➡️values()
list(c.values())         # [3, 4, 1]

➡️items():
list(c.items())          # [('a', 3), ('b', 4), ('c', 1)]

➡️total():
c.total()                # 8  (сумма всех счетчиков)

➡️clear()
c.clear()                # очистит Counter
# c -> Counter()

➡️copy():
c2 = d.copy()            # независимая копия

➡️Операторы: + / - / & / |
c = Counter(a=3, b=1)
d = Counter(a=1, b=4, c=2)

c + d # Counter({'b': 5, 'a': 4, 'c': 2}) (складывает, отрицательные отбрасывает)
c - d # Counter({'a': 2}) (вычитает, <=0 отбрасывает)
c & d # Counter({'a': 1, 'b': 1}) (пересечение: min по каждому ключу)
c | d # Counter({'b': 4, 'a': 3, 'c': 2}) (объединение: max по каждому ключу)


❗️ Counter часто используют, когда нужно быстро посчитать частоты: количество экземпляров, распределение по классификации систем и именам систем — и сразу подсветить проблемные места (пустые значения, дубли, «мусорные» названия).

💡💡Модуль collections очень полезен: он дает готовые структуры данных, которые упрощают код и ускоряют типовые задачи. Иногда он может быть чуть медленнее «классических» dict, но чаще удобство и читаемость важнее. В итоге всё зависит от задачи и того, где именно ты используешь этот тип.

Полезно? ⤵️❤️

#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
🤝 всем привет!

После декораторов и рекурсии можно улететь на гнездо кукушки 🤪
Кто понял рекурсию тот понял рекурсию (с)

Пойду лучше 🍺 открою 😀

#Python
👍2😁2
🔎Навигация для удобства поиска нужной информации на канале:

➡️#BIM - Информация по BIM проектированию
🌐#IFC - Информация по работе с IFC форматом
📉#Аналитика - Информация по работе с BIM данными и не только
🥊#Спорт - Просто спорт видосы, досуг
🐍#Python - Информация по Python
🤖#AIBIM - Интеграции Ai с BIM
👨‍🎓#TEST - Проверка знаний
👩‍🎓#Курс - Курс по Power bi и аналитики BIM данных
🗞#НовостиЦифровизации
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Всем привет 🤝

Одна из востребованных встроенных функций для работы с данными:
💡 isinstance() и ее самые удобные фишки:

1️⃣ Базовое применение:
isinstance(x, int)

2️⃣ Ключевое удобство - кортеж типов как второй аргумент 🤔
isinstance(x, (int, float))

Пример применения в функции:
def del_spaces(x):
'''Удаляет пробелы по краям строки, числа возвращает без изменений'''
if isinstance(x, (int, float)):
return x
elif isinstance(x, str):
return x.strip()
else:
raise TypeError (f'Неверный тип данных {type(x)}')



#Python

⭐️t.me/BIM_PYTHON_BI
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
😊Регулярки (сам очень часто использую при проверки цифровых моделей ОКС).
Что это?
Регулярные выражения (Regex) — инструмент для проверки и очистки данных по шаблону.

Самая база:

. — любой символ | \d — цифра | \w — буква/цифра
^ начало | $ конец
* 0+ | + 1+ | ? 0/1
[ABC] выбор | [^ABC] исключение
( ) группа | | или

❗️ Применение в проектировании и аналитике данных:
➡️проверка имен элементов и например систем
➡️контроль заполнения параметров
➡️очистка данных перед аналитикой или подгрузки в базу данных

👥 Пример:
Необходимо заполнять наименование конкретной сущности проекта, пусть это будет "Стена гипсокартонная" в параметре ADSK_Наименование.
Шаблон регулярки для проверки:

^Стена\s+гипсокартон\w*$


Такой шаблон будет ловить гипсокартонная, гипсокартонные и т.д.

Вывод:
Регулярные выражения (Regex) это быстрый контроль качества BIM-данных без ручной проверки.


😃 Если у вас есть проблема и вы собираетесь ее решать с помощью регулярных выражений, тогда у вас уже две проблемы (c)


#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
💡 Написал первое простенькое приложение, которое чистит мусор из выгрузок ЦИМ различных Контрагентов. Была проблема в указании абсолютных путей в источниках , и различные префиксы и постфиксы. На выходе получаем чистую CSV для подгрузки в БД.
Делал исключительно для практики стандартным функционалом python 💪
Можно красивее конечно допилить, но в целом работает))
Использовал:

➡️ Модуль CSV
➡️ Модуль tkinter

Без ООП, только функциональное программирование


#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
👏1
⚙ Допилил приложение
BIM Cleaner, добавлено:
➡️ Авторизации в базе данных;
➡️ Очистка файлов регулярными выражениями;
➡️ Выпадающий список доступных таблиц в базе

👥 Утилиту можно использовать уже на корпоративном уровне

Даже UI получился не плохо 😏

Использовал модули:

➡️csv
➡️os
➡️re
➡️psycopg2
➡️customtkinter
➡️tkinter
➡️PIL



#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
👏2
Media is too big
VIEW IN TELEGRAM
Если кто то выбирает учить язык программирования в эпоху ИИ, да, не знаю что за парень, но неоднократно натыкаюсь на похожее мнение.

Python все больше набирает обороты.

print(“Hello world!”)😀

#Python
Всем привет 🤝

Делюсь декомпозиций кода для лучшей читаемости разделяя на блоки.

#                                        
# ▄▄ ▄▄ ▄▄ ▄▄▄▄ ▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄
# ██ ██▀▄▀██ ██▄█▀ ██▀██ ██▄█▄ ██
# ██ ██ ██ ██ ▀███▀ ██ ██ ██
#
import clr
clr.AddReference("RevitAPI")
from Autodesk.Revit import DB
from Autodesk.Revit.DB import FilteredElementCollector as FEC
from collections import defaultdict
from selections import get_category_by_id

#
# ▄▄ ▄▄ ▄▄▄ ▄▄ ▄▄ ▄▄
# ██▀▄▀██ ██▀██ ██ ███▄██
# ██ ██ ██▀██ ██ ██ ▀██

par_inst = defaultdict(list)
par_type = defaultdict(list)
bindings = doc.ParameterBindings
iterator = bindings.ForwardIterator()
iterator.Reset()

while iterator.MoveNext():
definition = iterator.Key
binding = iterator.Current
par_name = definition.Name
for category in binding.Categories:
if isinstance(binding, DB.InstanceBinding):
elements = get_category_by_id(doc,category, is_type=False)
par_inst[par_name].extend(elements)
elif isinstance(binding, DB.TypeBinding):
elements = get_category_by_id(doc,category, is_type=True)
par_type[par_name].extend(elements)

# ▄▄▄▄ ▄▄ ▄▄▄▄ ▄▄▄▄▄▄
# ██▀██ ██ ██▀▀▀ ██
# ████▀ ██ ▀████ ██

par_type.update(par_inst)
combined_dict = par_type


Делать такие прикольные генераторы ASCII можно с помощью сервисов:

1. Text to ASCII Art Generator - мой любимый
2. ASCII Code Generator - лайт версия

Кстати, фрагмент кода собирает параметры типа и экземпляра в словарь, ключами которыми являются те или иные общие параметры, а так же их связь с категориями.
(немного поигрался с API).



#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Приветствую работяги 😃🤝

Захотелось немного разложить, какие парадигмы есть у #Python. Попробую максимально просто и понятно.

👩‍💻 Python — мультипарадигменный язык: в одной программе можно сочетать несколько подходов.

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

2️⃣ Объектно-ориентированное программирование (ООП):
Программа состоит из объектов, объединяющих
состояние и поведение.
Подходит для крупных, масштабируемых
и структурированных проектов.
Пример: объект Car хранит скорость и умеет ехать.

3️⃣ Функциональное программирование:
Логика строится на функциях, преобразовании данных
и минимизации изменений состояния.
Удобно для обработки коллекций и вычислений.
Пример: умножить все элементы списка на 2 через map()

4️⃣ Декларативное программирование:
Разработчик описывает, какой результат нужен,
а не пошаговый способ его получения.
Код обычно получается короче и выразительнее.
Пример: создать список квадратов чисел через
генератор списка.

💠 Главное отличие:

➡️Процедурное — действия.
➡️ООП — объекты.
➡️Функциональное — функции и преобразования данных.
➡️Декларативное — описание результата.

На практике хороший Python-код обычно сочетает все эти подходы.
#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет! 👋

Немного ООП (Объектно-ориентированное программирование), которое сейчас активно изучаю. Хочу поделиться простым примером на классе BimManager и разложить основные понятия по полочкам.
class BimManager:

def __init__(self, name, age, company):
self.name = name
self.age = age
self.company = company

def code(self):
print("Пишу Python")

def meeting(self):
print("Участвую в совещании")

def sleep(self):
print("Сплю 😴")

➡️ Класс — это шаблон (описание) будущих объектов.
➡️ Объект — конкретный экземпляр класса со своими данными.
➡️ Инициализатор __init__() автоматически вызывается при создании объекта. Его задача — задать объекту начальные значения атрибутов.
➡️ self — ссылка на текущий объект. Благодаря self каждый объект хранит свои атрибуты и может вызывать свои методы.

Например:
Создание экземпляра класса Менеджер Максим
manager = BimManager("Максим", 32, "RM Engineering")

После создания объекта:
self.name = "Максим"
self.age = 32
self.company = "RM Engineering"
➡️ Атрибуты описывают состояние объекта:
name
age
company
➡️ Методы описывают поведение объекта:
code()
meeting()
sleep()
💡Часто __init__() называют конструктором, но точнее будет сказать, что это инициализатор. Сам объект создается методом __new__(), а __init__() лишь инициализирует уже созданный экземпляр.

❗ Почему это важно для BIM-специалистов?
Концепция ООП лежит в основе большинства BIM API. Например, в Revit API и Navisworks API практически всё представлено в виде объектов.
Например:
документ (Document);
элемент (Element);
помещение (Room);
стена (Wall);
семейство (Family);
3D-вид (View3D).
У каждого объекта есть атрибуты (свойства) и методы (действия). Поэтому понимание ООП значительно упрощает работу с API и помогает быстрее писать собственные инструменты автоматизации.

#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет! 👋

Немного про полезные функции 👩‍💻: lambda, map(), any(), all()

🔹 lambda — короткая анонимная функция.
square = lambda x: x ** 2
square(5) # 25

🔹 map() — применяет функцию к каждому элементу.
list(map(lambda x: x * 2, [1, 2, 3]))
# [2, 4, 6]

🔹 any() — True, если хотя бы один элемент истинен.
any(x > 5 for x in [1, 3, 8])
# True

🔹 all() — True, если все элементы истинны.
all(x > 5 for x in [10, 20, 30])
# True


💡Важно: map(), any() и all() принимают итерируемые объекты — например, экземпляры встроенных классов list, tuple, set, dict, str, а также генераторы.
С точки зрения ООП, list, tuple, set, dict и str — это классы, а конкретные списки, строки, словари и т.д. — их объекты (экземпляры).

📌 Итог:

lambda ➡️ создать функцию
map() ➡️ применить ко всем
any() ➡️ хотя бы один
all() ➡️ абсолютно все


#Python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Всем привет!

👨‍💻Работа со словарями нас окружает практически везде!
Иногда, чтобы не забывать основы, полезно освежить память. 🥶
Как быстро подсчитать количество элементов по категориям, используя словарь?
💡Разберём на простом примере: типы и размеры элементов Revit, сгруппированные по категориям.
Для решения используем Python и collections.Counter.

Из кода получаем:
Окна 2
Двери 2
Стены 2
Перекрытия 1
Несущие колонны 1

#Python
Please open Telegram to view this post
VIEW IN TELEGRAM