• Статистика. Как "вытащить" в одну строку данные за 2 даты?

    @kamenyuga
    Другой ответ, конечно, утверждает про треш. Но по мне задача звучит, как самый обычный и довольно простой запрос в базу данных, который даже без гугла пишется за пару минут. Если, конечно, работал с sql хотя бы на уровне джуна.

    К сожалению, я работаю с ораклом, поэтому напишу на оракловом диалекте. sysdate - это текущие дата и время. trunc - округляет дату и время до даты. trunc(sysdate) - 1 - это ноль часов вчерашнего дня.
    select
        parameter_column,
        trunc(sysdate) as date_today,
        max(case when date_column < trunc(sysdate) then value_column end) as value_today,
        trunc(sysdate) as date_yesterday,
        max(case when date_column >= trunc(sysdate) then value_column end) as value_yesterday
    from target_table
    where date_column >= trunc(sysdate) - 1
    group by parameter_column

    Запрос вычисляет максимальное значение параметров за сегодня и за вчера, если их было несколько. Если только один, то на выходе это единственное значение. Если не было, то NULL. Тут уж нужны детали о том, как именно устроены данные.

    Если в таблице существует ровно одно значение параметра в один день, то запрос намного упрощается - нужна одна-единственная оконная функция, даже case-when руками писать не надо. lag к текущей строке подтягивает предыдущую строку, так что можно объединять значения из двух строк в одной.
    select
        parameter_column,
        date_column as date_today,
        value_column as value_today,
        lag(date_column) over(partition by parameter_column order by date_column) as date_yeaterday,
        lag(value_column) over(partition by parameter_column order by date_column) as value_yeaterday
    from target_table
    where date_column >= trunc(sysdate)

    Если все же значений бывает много в одну дату, то надо будет фильтр настроить - отбирать строки в которых первая дата - сегодняшняя, а вторая - вчерашняя.

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

    @kamenyuga
    Вот пример, как можно такого добиться stackoverflow.

    Делается в несколько шагов, обязательно руками. Конечно, нужно учитывать, что в русифицированном экселе синтаксис формул абсолютно другой. Формула в ячейке Е2 будет примерно такой "=ЕСЛИ(B2<>B1;A2;E1 & "," & A2)" и позволит в сортированных данных построчно дойти до полной конкатенации всех вариантов через запятую.

    Наверное, можно было бы сделать через сводные таблицы, но они очень ограниченные, работают только с числами, а с текстом не умеют. Или это умение где-то запрятано.

    В python + pandas эта задача решается элементарно через группировку, как и в любой разновидности sql. Стоит рассмотреть такой вариант.
    Ответ написан
    1 комментарий
  • Как исправить ошибку при передаче массива через socket и pickle в Python?

    @kamenyuga
    Pickle сохраняет объекты и ссылки на типы данных (названия классов и функций), но не их определения. Исправить ошибку можно разными путями.
    1. Руками сохранить также определение класса.
    2. Сделать в классе методы сохранения/загрузки объектов в стандартные типы данных или текст.
    3. Использовать библиотеки, которые сразу сериализуют больше данных, например, dill.
    Ответ написан
  • Коррекция значения результата ошибки с плавающей запятой?

    @kamenyuga
    Решение из комментария от shurshur - простое до безобразия. Понятное и рабочее. Какая его особенность делает его непригодным для решения задачи?

    >>>round(1.1234567899999999, 10)
    1.12345679
    >>> round(3.234000000000001, 10)
    3.234
    >>> round(0.9192899999999999, 10)
    0.91929
    Ответ написан
  • Стоит ли изучать c++11?

    @kamenyuga
    На курсере (coursera.org) есть набор из 5 курсов по С++ от Яндекса. Там С++14 и немного С++17. Пройти можно полностью бесплатно. Нормальное количество практических задач. Требуется хоть какой-то предварительный опыт программирования, совсем для нулей не разжевывают. А потом можно шлифануть каким-нибудь учебником.
    Ответ написан
    Комментировать
  • Стоит ли подписывать согласие на обработку персональных данных до того как прислали оффер?

    @kamenyuga
    У меня такое было на текущем месте работы (фин сектор с гос регулированием). Согласие на обработку персональных данных просили подписать еще перед собеседованием, как соискателя. Срок действия был указан 1 год. А вот потом, после трудового договора еще согласие уже в качестве работника вместе с кучей всяких инструкций и техник безопасности. В похожей компании, работающей в менее напряженной отрасли, никакие согласия никому не были нужны.
    Ответ написан
    Комментировать
  • Оцените сборку ПК и поясните как сделать её работоспобней и дешевле не сильно жертвуя производительностью?

    @kamenyuga
    С одной стороны на встройке 630 от Интела та же Сабнавтика будет еле шевелиться. С другой - дискретная видеокарта сжирает треть с лишним бюджета.

    Разумным выходом будет отказаться от видеокарты. На эти деньги взять i7 11-ого поколения со встройкой UHD 750. К нему нормальный кулер, а не этот слабенький дешман, от которого проц тротлить будет под нагрузкой. Оперативку 2 планки по 16. SSD NVMe, если на материнке есть для него радиатор. Блок питания адекватный, хотя бы 80+ стандарт. В общем вложиться в нормальные комплектующие. А потом копить на видеокарту, ждать снижения цен.
    Ответ написан
    Комментировать
  • Как лучше делать return?

    @kamenyuga
    В данном случае никакой разницы. В обоих вариантах код простой, короткий и понятный. Второй покороче, я бы его использовал.

    На практике часто смешиваются эти два варианта. Сначала обрабатываешь простые граничные случаи, в них сразу пишешь return True/False/1/0. А потом заводишь нужные переменные, обрабатываешь общий случай с разными ответвлениями и вычислениями, в конце которого уже идет return answer.
    Ответ написан
    Комментировать
  • Нужен ли класс threading.Lock?

    @kamenyuga
    GIL который блокирует доступ разных потоков к одному и тому же участку памяти
    Нет, GIL гарантирует, что в каждый момент времени работает только один поток. При этом каждые несколько десятков/сотен тактов процессора работающие потоки сменяют друг друга (если их больше одного).

    что собственно является одним из якорей в производетельности
    Спорное и корявое утверждение.

    зачем нужен класс threading.Lock
    Чтобы дать работать одному потоку, а всем остальным запретить. Потому что иначе переключение между потоками произойдет в общем-то в случайный момент времени, а именно тогда, когда захочет интерпретатор. Он, конечно же, не парится по поводу зашитой в код логики и не будет ждать завершения каких-то конкретных вычислений/чтения/записи.
    Ответ написан
    Комментировать
  • Как в pandas сделать список на основании данных нескольких столбцов?

    @kamenyuga
    Не надо в пандасе использовать циклы - это медленно и некрасиво, т.к. пандас - векторный по своей сути. Потому что основан на нампае. Так что используй подходящий инструмент из нампая. Для фильтрации по значениям столбцов - это функция numpy.where, которую можно вкладывать в себя, как обычные условные операторы:

    import numpy as np
    import pandas as pd
    
    if __name__ == '__main__':
    
        df = pd.DataFrame({
            'movie': [9999999,  2,  3, 1, 9999999],
            'rating': [9999999,  2,  9999999, 9999999, 3],
            'name': [1,  2,  4, 5, 10]})
    
        df['result'] = np.where(
            df['movie'] != 9999999,
            df['movie'],
            np.where(
                df['rating'] != 9999999,
                df['rating'],
                df['name']))
    
        print(df)

    Результат:
    movie   rating  name  result
    0  9999999  9999999     1       1
    1        2        2     2       2
    2        3  9999999     4       3
    3        1  9999999     5       1
    4  9999999        3    10       3
    Ответ написан
    Комментировать
  • Можно ли приравнять ссылки обоих объектов в ООП?

    @kamenyuga
    Что это за одинаковость, которую нужно получить и/или проверить?

    В пайтоне переменные и объекты - это как ключи и значения словаря. Объекты непосредственно работают в коде, а переменные указывают на эти объекты и позволяют получить к ним доступ. На один объект могут ссылаться много переменных. Объекты сами могут ссылаться на другие объекты, например, список хранит ссылки на свое содержимое. И главное - объект живет, пока на него хоть кто-то ссылается, а когда ссылок становится 0, то объект уничтожается сборщиком мусора.

    Так что в приведенном коде произошло следующее - изначально созданы 2 объекта (Петя и Вася), потом обе переменные стали указывать на Васю, а Петя был уничтожен. Остался только 1 объект и 2 ссылки на него.

    Можно было вместо присваивания одного объекта обеим переменным, сделать в них значение self.player равным. Тогда это были бы два различных объекта с абсолютно одинаковым поведением - это кстати один из подходов к созданию синглтонов в питоне.

    Для полного понимания того, что тут происходит можно почитать хороший учебник по питону, а затем уже подробнее погуглить про сборщик мусора.
    Ответ написан
    Комментировать
  • Какие приемы ООП используются в методе библиотечной функции python ecdsa?

    @kamenyuga
    Странные какие вопросы. Так возьми любой учебник по питону, где описывается ооп для новичков. В идеале, конечно, на английском языке. Потому что питон создается на английском языке, а перевод придуман переводчиками или пользователями. А потом посмотри исходный код этой библиотеки. Своими глазами все и увидишь.

    SigningKey - это класс для работы с ключами (class). from_string - метода класса для получения ключа из последовательности байтов (classmethod). SECP256k1 - это объект класса Curve (class object). Реализовано все это на чистом питоне в смешанном (процедурном и ооп) стиле. Вероятно, самое сложное для новичка - это активное использование спец методов с двумя подчеркиваниями и распределение кода по модулям/пакетам. Немножко есть там декораторов для создания методов классов и статических методов. В общем все в рамках учебника для изучающих питон. Ну, и логика там реализована не самая простая.
    Ответ написан
    Комментировать
  • Идеальный Python Class для Pandas DataFrame?

    @kamenyuga
    Для решения задачи достаточно просто открыть исходный код пандас датафрэйма. Там сначала перебираются вполне определенные типы данных, а затем идут проверки на итерируемость. Любой нормальный учебник по питону описывает, как создавать такие классы самостоятельно. Начать можно с такого кода.
    import pandas as pd
    
    class URL_2:
    
        def __init__(self, title=None, description=None):
            self.title = title
            self.description = description
    
        def __iter__(self):
            for attr_name in self.__dict__:
                yield getattr(self, attr_name)
    
    if __name__ == '__main__':
    
        site_1 = URL_2(title='Купить телевизор', description='Телевизоры по низкой цене')
        site_2 = URL_2(title='Услуги юриста', description='Адвокат спешит к вам')
    
        df = pd.DataFrame([site_1, site_2])
        df.columns = site_1.__dict__
        print(df)

    Результат:
    title                description
    0  Купить телевизор  Телевизоры по низкой цене
    1     Услуги юриста       Адвокат спешит к вам
    Ответ написан
  • Можно ли атрибуты базового класса вызывать в дочернем классе? Если да, то напишите, нет ли исключений?

    @kamenyuga
    Это стандартное поведение. Если какой-то атрибут/метод не найден в текущем объекте, то проверяется его класс, а потом родительский класс. Точный порядок определен в __mro__. Если нужно вызвать что-то из родительского класса принудительно в обход текущего, то используется функция super. При множественном наследовании могут возникнуть сложности.
    Ответ написан
    Комментировать
  • Что такое batch_size в моделях на обучении?

    @kamenyuga
    Обычно под батчем понимают две вещи - 1) во время подготовки данных перед обучением - объем данных (количество строк), загружаемый в память за один раз, 2) во время обучения - объем данных (количество строк), подаваемый модели между вычислениями функции потерь. В первом случае еще используют термин чанк (chunk). Такое маленькое значение - это второй случай. Тем более он упоминается в разделе обучения модели. Т.е. за единичный шаг обучения - подаем модели 16 строк данных.
    Ответ написан
    Комментировать
  • Какой ИБП выбрать для слабого офисного ПК, чтобы работал без света?

    @kamenyuga
    У бесперебойников в общем-то две основные характеристики - максимальная мощность и емкость батареи. Мощность - ее прямо в названии в магазинах пишут. Ее должно хватать для типичного потребления компьютера. Для описанных в вопросе пк скорее всего и 300 Вт будет всегда хватать. Можно брать любой самый дешевый. А батарея - тут зависит от необходимого времени работы автономной. Почти любого ИБП хватит, чтобы нормально выключить компьютер. А если надо прямо проработать какое-то время, то гуглим "nix время автономной работы ИБП при нагрузке" и получаем список из протестированных ибп вместе с ценами.
    Ответ написан
    1 комментарий
  • Проблема интерпретируемости?

    @kamenyuga
    Да, это так. Нейронную сеть трудно интерпретировать, потому что она сложно устроена. Даже в простых случаях нейронка - это несколько слоев из десятков или сотен нейронов, при этом каждый следующий слой зависит от предыдущего, а кроме того между слоями применяются функции активации и дропауты. Один из свежих подходов к интерпретации нейронок - LRP (layer-wise relevance propagation). Так что гугли что-то вроде "neural network interpretation with lrp method". Ожидается, что все серьезные источники будут на английском и наполнены матаном.
    Ответ написан
    Комментировать
  • Как можно выделить фиксированный процент пользователей на основании их UUID?

    @kamenyuga
    UUID - это набор шестнадцатеричных чисел, разделенных дефисами. В зависимости от механизма генерации какие-то из этих чисел являются случайными/псевдослучайными с примерно равномерным распределением. Берем такое число из идентификатора. В этом случае простейшее условие вида
    uuid[position] < '1'
    отберет 1/16 от всех значений, а условие
    uuid[position] < '11'
    1/256 часть.
    Ответ написан
    Комментировать
  • Работа с датами в pandas?

    @kamenyuga
    Дело тут не в пандасе, а в самих данных, они кривые. Универсального решения парсинга дат, наверное, не существует. Можно начать с пары автоматических вариантов, а потом руками или кастомными обработчиками.

    1. Сообщения об ошибках позволят разделить проблемы на группы.
    from dateutil import parser
    
    spisok = ['25.05..2001',  '25.06.2001', '25.43.2004', '05.02.2005', '27.02.2008']
    
    for elem in spisok:
        try:
            d = parser.parse(elem, dayfirst=True)
            print(f"{elem} -> {repr(d)}")
        except parser.ParserError as err:
            print(f"{elem} -> {err.__class__.__name__}: {err}")

    25.05..2001 -> ParserError: Unknown string format: 25.05..2001
    25.06.2001 -> datetime.datetime(2001, 6, 25, 0, 0)
    25.43.2004 -> ParserError: month must be in 1..12: 25.43.2004
    05.02.2005 -> datetime.datetime(2005, 2, 5, 0, 0)
    27.02.2008 -> datetime.datetime(2008, 2, 27, 0, 0)

    2. Более продвинутая версия парсера. В его настройках не разбирался.
    import dateparser
    
    spisok = ['25.05..2001',  '25.06.2001', '25.43.2004', '05.02.2005', '27.02.2008']
    
    for elem in spisok:
        d = dateparser.parse(elem, languages=['ru'])
        print(f"{elem} -> {repr(d)}")

    25.05..2001 -> datetime.datetime(2001, 5, 25, 0, 0)
    25.06.2001 -> datetime.datetime(2001, 6, 25, 0, 0)
    25.43.2004 -> None
    05.02.2005 -> datetime.datetime(2005, 2, 5, 0, 0)
    27.02.2008 -> datetime.datetime(2008, 2, 27, 0, 0)
    Ответ написан
    Комментировать
  • Как можно упростить данный код?

    @kamenyuga
    В таком виде код почти ничего не делает. Просто меняет структуру данных - список кортежей превращает в словарь, затем в список кортежей. Единственное значимое изменение - суммирование. Так просто используй сразу подходящую структуру. Например, словарь. И вся функция превращается в одну строчку внутри цикла.
    foo = dict()
    
    min_amount = 1
    for type_, amount in (('food', 4), ('food', 3), ('car', 3), ('dog', 1)):
        foo[type_] = foo.get(type_, 0) + (amount if amount >= min_amount else 0)
    
    print(*sorted(foo.items(), key=lambda x: x[1]), sep='\n')
    Ответ написан
    Комментировать