• Почему не работает наследование в jinja?

    ademaro
    @ademaro
    full-stack developer
    Добавьте вторую папку что бы использовать в качестве шаблонов:
    from jinja2 import Environment, DictLoader, Template, FileSystemLoader
    file_loader = FileSystemLoader(['templates', 'includes'])
    env = Environment(loader=file_loader)
    template = env.get_template('years.html')
    years_list = [1992, 1993, 1994]
    out_render = template.render(years = years_list)
    print(out_render)

    а в шаблоне наследуйте просто {% extends 'template.html' %}
    Ответ написан
    Комментировать
  • ФИАС, как правильно нормализовать?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Посмотрите у меня в гите. Возможно идеи появятся
    Ответ написан
    3 комментария
  • Форматирование (нормализация) почтового адреса для поиска дублей?

    @lyalius
    дешевая рабочая сила вас спасет :)
    а вообще можете нормализовать адреса через dadata.ru, а потом попробовать помэтчить
    только с домами строениями и квартирами придется повозиться
    Ответ написан
    Комментировать
  • Как выполнить нормализацию адресов?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Есть режимы как деления адреса на составляющие, так и нормализация.
    https://github.com/openvenues/libpostal
    Ответ написан
    Комментировать
  • Как правильно спарсить характеристики с сайта и записать в отдельные колонки эксель?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Например, можно автоматически создавать колонки под недостающие параметры по мере анализа. Можно завести словарь, который отображает названия характеристик в номер колонки, если при парсинге страницы обнаружена новая характеристика, которой в словаре нет - добавлять новую запись со следующим номером колонки. При создании новой строчки в выходнойм файле по именам параметров определять их позиции в массиве и подставлять.

    Другой вариант: разные категории помещать на разные листы (в случае с csv писать в разные файлы, ну или перейти на xlsxwriter). В этом случае таблица будет не такой разреженной, что в некоторых случаях может быть более удобно удобно.
    Ответ написан
    Комментировать
  • Как правильно спарсить характеристики с сайта и записать в отдельные колонки эксель?

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

    636cb8986b6f6371909319.jpeg
    Для получения данных с сайта источника, тоже использовал библиотеку BeautifulSoup,

    Фрагмент HTML кода с характеристиками товара на сайте источнике для парсинга:
    <div id="content_features" class="ty-wysiwyg-content content-features">
    	<div class="ty-product-feature">
    		<div class="ty-product-feature__label">Ширина:</div>
    		<div class="ty-product-feature__value">1400<span class="ty-product-feature__suffix"> мм</span></div>
    	</div>
    	<div class="ty-product-feature">
    		<div class="ty-product-feature__label">Высота:</div>
    		<div class="ty-product-feature__value">1345<span class="ty-product-feature__suffix"> мм</span></div>
    	</div>
    	<div class="ty-product-feature">
    		<div class="ty-product-feature__label">Глубина:</div>
    		<div class="ty-product-feature__value">880<span class="ty-product-feature__suffix"> мм</span></div>
    	</div>	
    </div>

    Фрагмент кода получения характеристик товара:
    propsBody = []
            try:
                propsBody = soup.find('div', {'id' : 'content_features'}).findAll('div', class_='ty-product-feature')
            except:
                pass
            if len(propsBody) > 0:
                #self.properties.clear()
                propsItems = []
                for props in propsBody:
                    item = {
                        'label' : props.find('div', class_='ty-product-feature__label').get_text(strip=True),
                        'value' : props.find('div', class_='ty-product-feature__value').get_text(strip=True)
                    }
                    propsItems.append(item)
                self.properties = propsItems

    В результате, полученные данные характеристик, для каждого товара в виде словаря, типа:
    [{"label": "Высота:", "value": "220мм"}, 
    {"label": "Глубина:", "value": "295мм"}, 
    {"label": "Материал:", "value": "Сталь"},
    {"label": "Вес:", "value": "4,3кг"},
    {"label": "Длина:", "value": "650мм"}]

    Где в label - название характеристики, а в value – значение.

    Учитывая, что у всех товаров разные типы, названия характеристик, собирал их в множество – так как в множестве могут быть только уникальные значения. Затем, при записи данных в Excel, как предлагал выше shurshur, автоматически добавлял колонки из полученных данных.

    Вот пример класса, который принимает полученные в результате парсинга данные товаров, и записывает их Excel.
    В данном прмере Вы можете увидеть, что помимо общих полей – для данных товара, как название, цена, описание и т.д, из названий характеристик в цикле добавляются колонки, куда записываются значения характеристик товара:

    spoiler

    class ExcelFile:
        data = {}
        labels = set() # множество, перменная, свойство для названий характеристик товаров
    
        def __init__(self, data):
            self.data = data 
    
        def get(self):
            # В цикле проходим по данным полученным в результате парсинга,
            # и собираем названия характеристик в множество
            for item in self.data:
                if len(item['properties']) > 0:
                    for prop in item['properties']:
                        self.labels.add(prop['label'])
    
            book = openpyxl.Workbook()
            sheet = book.active
            
            # Поля, колонки Excel - файла, для разных данных товаров
            sheet['A1'].value = 'src'
            sheet['B1'].value = 'name'
            sheet['C1'].value = 'category'
            sheet['D1'].value = 'art_namber'
            sheet['E1'].value = 'price'
            sheet['F1'].value = 'main'
            sheet['G1'].value = 'more'
            sheet['H1'].value = 'descrip'
            sheet['I1'].value = 'JSON_properties'
            sheet['J1'].value = 'video'
            sheet['K1'].value = 'docs'
            # Добавляем дополнительные колонки в Excel из названий характеристик
            if len(self.labels) > 0:
                nam = 12
                for nameProp in self.labels:
                    sheet.cell(row=1, column=nam, value=nameProp)
                    nam += 1
            row = 2
            # Записываем в строки Excel- файла данные товаров
            for res in self.data:
                sheet[row][0].value = res['src']
                sheet[row][1].value = res['name']
                sheet[row][2].value = res['category']
                sheet[row][3].value = res['art_namber']
                sheet[row][4].value = res['price']
                sheet[row][5].value = res['main']
                sheet[row][6].value = ','.join(res['more'])
                sheet[row][7].value = res['descrip']
                sheet[row][8].value = res['json']
                sheet[row][9].value = ','.join(res['video'])
                sheet[row][10].value = ','.join(res['docs'])
                # Записываем значения характеристик товара в соответствующие названиям колонки Excel- файла
                if len(self.labels) > 0:
                    namberCell = 12
                    while namberCell < len(self.labels) + 12:
                        propLabel = sheet.cell(row=1, column=namberCell).value
                        for property in res['properties']:
                            if property['label'] == propLabel:
                                sheet.cell(row=row, column=namberCell).value = property['value']
                            else:
                                sheet.cell(row=row, column=namberCell)
                        namberCell += 1
                row += 1
    
            file_name = detNameExcelFile()
            book.save(file_name)
            book.close()
    
            return file_name



    Возможно, данную задачу можно решить другим, более рациональным способом, но тем не менее -это способ работает.
    Ответ написан
    2 комментария
  • Как вычислить веса линейного классификатора?

    @dmshar
    Не надо изобретать велосипед. Ваша задача - это классика. Называется
    Метод_опорных_векторов (https://ru.wikipedia.org/wiki/Метод_опорных_векторов).
    Имеется куча литературы, да и в интернет тема раскрыта неплохо.
    (Просто несколько ссылок для "раскрутки"
    https://www.projectpro.io/data-science-in-r-progra...
    https://www.analyticsvidhya.com/blog/2021/03/begin...
    https://habr.com/ru/company/ods/blog/484148/

    Правда она математически сложнее регрессии. Но если вам надо - читайте, изучайте, применяйте.
    Ответ написан
    Комментировать
  • Хочу заняться программирование БПЛА/ ИИ на БПЛА, с чего начать?

    написать ИИ, который будет направлять дрон по заданному маршруту

    Здесь никакой ИИ не нужен.
    Нужно только записать маршрут в виде точек, периодически проверять GPS, и корректировать курс.

    анализировать данные, полученные по маршруту.

    Что это вообще значит? Какие данные он должен анализировать? Как? Какой результат в итоге хочется получить?

    Начать можешь с формулирования задачи и изучения матчасти (посмотри уже существующие решения как минимум), а после этого уже всё само по себе должно образоваться.
    Ответ написан
    Комментировать
  • Хочу заняться программирование БПЛА/ ИИ на БПЛА, с чего начать?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    С лётных симуляторов. Выбирайте те, у которых есть API с телеметрией.
    Имея АПИ, можно пробовать писать код.
    Ответ написан
    Комментировать
  • Как построить график функции по уравнению с помощью matplotlib Python?

    adugin
    @adugin Куратор тега Python
    5e08e650a3524768171316.png
    Ответ написан
    Комментировать
  • Как перевести кириллицу в ASCII?

    @nirvimel
    Ваша загадочная кодировка называется cp1251.
    'ной'.encode('cp1251') == b'\xed\xee\xe9'
    Но учитывайте, что этот пережиток прошлого не соответствует стандарту unicode. На современных ОС с такой кодировкой могут быть проблемы. Для современных переносимых решений лучше использовать utf8, как сказал pygame.
    Ответ написан
    2 комментария
  • Актуально ли второе высшее образование для программиста в области медицины?

    @NortaBirdo
    Для начала о себе: по образованию я врач-психиатр, по должности я ведущий бизнес-аналитик в фирме, которая пишет медицинский софт.

    Ответ коротко: нет, не нужно.

    Подробно:
    1. Высшее образование в медицине (я имею ввиду лечебный факультет, стоматологию (5 лет) и фармацевтику (5 лет) не рассматриваю) это 6 лет. После этого вы обязаны 3 года отработать врачом общей практики. После этого у вас специализация от 2 до 5 лет в зависимости от специальности. Чтобы пройти специализацию бесплатно, вам надо быть краснодипломником или к ним приближенным (что ой как не просто) чтобы пройти конкурс на федеральную льготу. Если по федералке не прошли, то остаются два способа: заплатить (простейшие специальности типа терапевта участкового стоят порядка 100 тыс./год), либо продаться больнице на 3 года (больница оплачивает вам обучение, а вы потом эти деньги отрабатываете). Если вы не проходите специализацию (это возможно) то значит практического опыта у вас по нулям. Ценность ваших знаний для разработки ПО -10 по шкале от 0 до 10 (я не опечатался, величина отрицательная при положительной шкале). чтобы понимать реальные потребности бизнеса вам нужен опыт, чтобы его получить вам надо: 1) пахать студентом в ночные смены мед.сестрой 2) пройти практику специализации.
      Кстати летние практики вам тоже надо проходить, и ночные дежурства в них тоже входят.
    2. На лечебном факультете заочки нет.
    3. Пропускать занятия - нельзя. Пропускать лекции - нельзя. Присутствие на лекциях проверяют, часто не ленятся пофамильно проверить весь курс (~300 человек). Пропускать сдачи историй болезни крайне не рекомендуется (хрен найдешь потом препода, а если найдешь - еще и хрен сдашь). Двойки получать - нельзя. Они штрафуются и/или отрабатываются (очно). Деканат обычно на стороне кафедры. Т.е. то что ты получил пару, потом не осилил 3 из 3 отработок в этом семестре и теперь тебя кафедра не допускает до сессии (кстати экзамена у этой кафедры в эту сессию может и не быть, но она все равно должна поставить допуск) - твои проблемы и только твои. Не выход на сессию - отчисление.
    4. Обучение медицине одно из сложнейших. Вам придется заучивать огромные объемы информации. Там нет логики. Например, чтобы сдать простейший (!) экзамен по нормальной (бог с ней, с патологической) анатомии вам придется заучить три тома анатомического атласа формата а4 по 600 страниц в каждом мелким шрифтом на латыни+русском + уметь все это показать на трупе (да-да, на три года ваш второй дом - анатомичка, есть, одной рукой ковыряя в трупе - это норма) Когда заучите, это первые года три - придется учится принимать решения исходя из всей этой информации
      Добавьте к этому: мудаков профессоров коих +50% в каждом вузе, разброс знаний: вам нужно будет ориентироваться в мед.биофизике, органической и неорганической химии, биохимии, биологии, ну профильных дисциплинах (первые три года - норма и патология тела+общая фармакология, вторые три года - клинические кафедры, когда собственно начинаем учить болячки (и да, тут снова придется кучу всего заучивать, но уже проще). Завершается это клинической фармакологией, которую заучить не возможно. Ты либо помнишь и понимаешь все свои 6 лет, либо очень плохо быть тобой)
    5. Для того чтобы писать медицинский софт в команду нужны бизнес-аналитики + грамотный архитектор + нормальный представитель на стороне клиента. Как и везде. Именно эти люди формируют техническое задание, осуществляют проектирование. К тебе в итоге уже придет конкретное задание вида "сделай класс А"
    6. Что бы быть хорошим бизнес-аналитиком, тебе на старте нужна не столько предметка, сколько методологии бизнес-анализа. Ты должен понимать как вытащить из пользователя что ему надо и зачем
    7. 95% рынка - это базовые учетные контуры (регистрация пациентов и их историй болезней/мед.карточек). Мед. тут не поможет вообще ни как от слова совсем. А вот хороший лид + внятный клиент + светлая голова и скрупулезность = profit. Оставшиеся 5% это исследовательские задачи, но тут без domain subject expert все равно не обойтись, даже если ты медик.


    В общем, как для того чтобы писать бухгалтерский софт, не нужно быть бухгалтером, так и здесь. Конечно, легче понимать чего хотят люди, когда ты прошел через тоже что и они. Но здесь не на столько существенная разница, годик поработать (только очень-очень плотно) с хорошим аналитиком - все будет хорошо.

    На сколько востребованы в целом специалисты по медицинской информатике? Очень востребованы. Рынок только развивается, поле - не паханное.

    P.S. Если хочется по работать в сфере мед.информатики - напишите, можем пообщаться.
    Ответ написан
    8 комментариев
  • Как скачать видео с Тик-ток?

    @issaychik
    я юзаю тг бота @allsaverbot
    скачивается без водяного знака
    Ответ написан
    2 комментария
  • Как скачать видео с Тик-ток?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Можно попробовать поискать на гитхабе исходники скриптов, которые загружают без вотермарки, скорее всего есть. Можно даже не на питоне, просто потом переписать. Механизм там посложнее, чем просто отправка одного запроса. Раньше нужно было взять ссылку на видео, найти в байтах ответа её айдишник, взять кусок этого id и сформировать с ней запрос на неофициальный API, передав нужные параметры. Ссылки меняются, кодировки видео, я думаю, тоже. Возможно, сейчас есть вариант полегче. Вариант выше был актуален года полтора назад.

    Либо, ищем любой сервис, который позволяет загружать видео без марок, и используем его как прокладку. Но тут только надежда на сторонний сервис, плюс они активно стараются бороться с подобным
    Ответ написан
    Комментировать
  • Как добавить несколько длинных f-строк в список?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    (
    f"Поезд {train['number']} отправляется в "
    f"{train['departure_time']} с {train['platform']}, {train['way']}"
    )
    Ответ написан
    Комментировать
  • Flask jinja2 extends как передать данные в базовый шаблон?

    moonz
    @moonz Автор вопроса
    web developer | seo | design
    Ответ помогли найти на ru.stackoverflow

    from flask import Blueprint
    
    from utils import db_connect
    
    app = Blueprint("name", __name__, template_folder='templates')
    
    @app.route("/")
    def index():
      return render_template("index.html")
    
    @app.context_processor
    def any_data_processor():
      with db_connect.connect() as con: 
    # тут же могла быть работа с кешем/API/файловой системой и др.
        ....
      result = ...
      return dict(any_data=result)

    После этого обращаться внутри всех шаблонов можно без явной передачи туда контекста.

    {{ any_data }}
    Ответ написан
    Комментировать
  • На какой CMS лучше сделать сайт?

    Adamos
    @Adamos
    Я бы советовал сначала смотреть не на CMS, а на результаты запроса "сайт детского сада" в вашем городе. Вполне может оказаться, что под них уже есть муниципальная площадка, просто заведующая об этом не знает.
    И сомненья отпадут, и вопросы персональных данных, например, будете решать не вы...
    Ответ написан
    2 комментария
  • Как распознать рукопись в pytesseract?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Тессерактом вряд ли достигнете желаемое. Обучайте нейронки...
    Туториалов по распознаванию mnist - валом. А у вас - задача очень похожая.
    Ответ написан
    4 комментария
  • Файл сервер на golang?

    @TwoRS Автор вопроса
    router := mux.NewRouter()
    s := http.StripPrefix("/files/", http.FileServer(http.Dir("./files/")))
    router.HandleFunc("/", Index)
    router.PathPrefix("/files/").Handler(s)
    http.Handle("/", router)
    http.ListenAndServe(":5000", nil)
    Ответ написан
    Комментировать
  • Python. Как вставить переменную в sql запрос?

    adugin
    @adugin Куратор тега Python
    Format String Syntax
    name = 'toster'
    option1 = f"CREATE TABLE '{name}' ..."
    option2 = "CREATE TABLE '{0}' ...".format(name)
    option3 = "CREATE TABLE '{name}' ...".format(name='toster')
    option4 = "CREATE TABLE '{name}' ...".format(**{'name': 'toster'})
    Ответ написан
    2 комментария