• Как сгруппировать строки в DF по условию?

    Maksim_64
    @Maksim_64
    Data Analyst
    Профессиональных способов несколько например использовать resample метод. Это специализированный groupby для временной последовательности, второй это использовать groupby вместе с pd.Grouper. Приведу простенький пример.
    index = pd.date_range('1/1/2000', periods=9, freq='min')
    df= pd.DataFrame(data=np.random.randint(1,10,(9,2)), index=index, columns=['A','B'])
    df.resample('3min').agg({'A':'sum','B':'mean'})
    Я создал фрейм с индексом временная последовательность (1 мин). сгруппировал по 3минуты и применил к каждой из колонок разные аггрегирующие функции.

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Мне кажется, что эту задачу можно решить через SORTN, но вот что первое приходит в голову

    =LET(
      places;UNIQUE(A2:A);
      dates;BYROW(places;LAMBDA(_p;TO_DATE(INDEX(SORT(FILTER(B2:B;A2:A=_p);1;0);2))));
      {places\dates}
    )


    65d748ec053f9013780103.png

    Ссылка на Таблицу с примером https://docs.google.com/spreadsheets/d/1zPuzdN7EtT...
    Ответ написан
    1 комментарий
  • Как мне упростить формулу?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Что-то вроде:
    =ARRAYFORMULA(СУММ(
      ТРАНСП(G6:S6)*'Справичник'!$D$2:$D$14;
      T6:X6
    ))
    Ответ написан
    2 комментария
  • Есть два столбика с числами, как получить в третий процент?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    в C1:
    =if(a1<>0;b1/a1-1;"")
    И поставить процентный тип данных для столбца
    Ответ написан
    Комментировать
  • Почему тесты не срабатывают?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Твоя функция, когда доходит до последней рекурсии, возвращает результат вникуда.
    Рекурсивный вызов не присваивает то, что вернулось из return.

    Можно как-то так:
    def digital_root(n):
        n = [int(x) for x in str(n)]
        n = sum(n)
        if n >= 10:
            n = digital_root(n)
        return n
    Ответ написан
  • С чего лучше всего начинать рефакторинг?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот плохо написанная функция изменения цены товара, учитывающая множество разных условий. Нужно рефакторить, так как сама функция жутко нечитабельна. С чего начать рефакторинг или какие методы использовать для начала рефакторинга?

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

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

    .replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ')

    встречается 4 раза. Ее можно обработать через extract function. После этого кода станет визуально меньше.

    Далее - повторяющийся code-block с обновлением update_price. Его брат-близнец отличается только
    аргументом option_price. На этом можно сыграть и тоже сделать некоторое упрощение.

    if (prefix == '+') {
          update_price = current + Number(option_price);
        } else {
          update_price = current - Number(option_price);
        }


    Некоторые фрагменты кода напрашиваются на introduce temporary variable.
    Например следующий сниппет
    option_sizes.find('input[type="hidden"]')
    был использован дважды. И первый раз он нашел какое-то значение и был использован.
    И в следующей строке этот поиск был вызван снова. Хотя операция find как-бы подсказывает
    нам что она имеет complexity близкое к линейному. Тоесть нужно ценить процессорное
    время и не грузить его повторными поисками. Тут - как-бы смысл двойной. И перформанс
    и нормализация кода. Тоесть явное указание что этот результат нам еще понадобиться.

    Очень сильно в рефакторинге помогает типизация. Тоесть если переписать код с JavaScript на TypeScript
    то будут более очевидны некоторые инварианты.

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

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Отменить всплытие события в обработчике клика дочернего элемента с помощью event.stopPropagation()
    document.querySelector('.close').addEventListener('click', function(e){
      e.stopPropagation()
      document.querySelector('.result').insertAdjacentHTML('beforeend', '<div>Close</div>');
    });


    Либо в обработчике делать проверку на то, на каком конкретно элементе произошёл клик.
    Ответ написан
    1 комментарий
  • В чем разница между способами тестирования (в контексте web и php)?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Опишу простыми словами для упрощения понимания.

    модульное тестирование

    Тестирование конкретного модуля. Обычно - это самый нижний уровень, отдельные простые классы, т.е. ниже по логике уже будут отдельные функции. Например, в JS есть класс Math - тестирование всех его методов и есть модульный тест. Конечно, границы между логическими уровнями могут быть размыты и в данную категорию вполне можно вписать класс уровнем выше. Так же, модулем может быть и что-то более сложное - опять же, много зависит от масштабов и особенностей архитектуры.

    интеграционное тестирование

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

    функциональное тестирование

    Очевидно, что тестируются конкретные функции, которые есть в техническом задании. Например: когда пользователь нажимает кнопку "купить" в карточке товара - товар добавляется в корзину.
    какими инструментами оно делается?

    Инструментами автоматизации GUI - для сайтов это Selenium и браузеры. Для десктопных/мобильных приложений аналогичные решения.

    приемочное тестирование

    в че отличие от интеграционных.. еще видел фразу что тут и фронт и бек тестируются, но яснее не стало, какими инструментами оно делается?

    "Бизнес" заказал в "Конторе" разработку сайта, выдал ТЗ, контора сделала сайт, бизнес заплатить денег обещал. Как бизнес проверит что контора сделала именно то, что он хотел? Через приемочное тестировние - бизнес получает доступ к сайту и проверяет, что сайт именно такой, какой он заказывал в ТЗ, а не тот, который сделали индусы за доширак. Если в ТЗ указан конкретный список тестов/фич - используется этот список или так, как прописано в ТЗ само тестирование. Само тестирование проводит соответствующий специалист (инженер отдела качества) - тыкает все кнопочки, нажимает менюшечки и говорит начальству "все окей, подписывай и платим им деньги" или "вот тут и тут не окей, не подписывай, денег не давай". Реальный пример: была заказана и собрана станция спутниковой связи, на приемке были представители заказчика и исполнителя, была толстая пачка бумаги на несколько сотен страниц, по которой первые проверяли что все работает именно так, как там написано в течении нескольких недель (плюс-минус), а вторые исправляли косяки показывали что все окей, потом все поставили свои галочки и крестики и разъехались по домам.

    E2E - тут тестируется чрез браузер, с помощью Mocha и тп, те тестируются "требования бизнеса к приложению", тестируются пользовательские сценарии.. а в чем отличие от функциональных тестов тогда?

    Сквозное тестирование. Это полная проверка от начала и до конца. Отличие от функционального в том, что это более комплексный тест. Если функциональное тестирование - это проверка конкретной функции, тот сквозное - работа всего приложения, т.е. более комплексное. Например, E2E тест приложения для загрузки файла на сервер: тест включает в себя запуск приложения, авторизация пользователя, выбор файла, указание мета информации, загрузку файла на сервер, выход из приложения. Вот тут неплохая статья на хабре: https://habr.com/ru/company/otus/blog/681066/

    Совсем запутался, с unit только понятно, а как уложить и разделить остальные?

    60da68c37e576762375008e5_thumb-image.png
    Картинка отсюда: https://www.rainforestqa.com/blog/the-layers-of-te...
    Ответ написан
    Комментировать
  • Как систематизировать цикл for?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вот решение вашей исходной задачи:
    const commonParts = (str1, str2, size) => {
      const re = new RegExp(`.{1,${size}}`, 'g');
      const arr1 = str1.match(re);
      const arr2 = str2.match(re);
      return arr1.filter((e, i) => arr2[i] === e);
    }
    commonParts('1342567', '1242566', 2); // [ "42", "56" ]
    commonParts('1342567', '1242566', 3); // [ "256" ]
    Ответ написан
    2 комментария
  • Как объединить несколько объектов в один?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const merge = (target, ...sources) =>
      sources.reduce((acc, n) => (
        Object.entries(n).forEach(([ k, v ]) =>
          acc[k] = v instanceof Object
            ? merge(acc[k] instanceof Object ? acc[k] : {}, v)
            : v
        ),
        acc
      ), target);
    
    
    const result = merge({}, ...arrayObj);
    Ответ написан
    3 комментария
  • Нужна ли математика Python,Java программисту?

    @d-stream
    Готовые решения - не подаю, но...
    География не нужна! (с) Простакова

    Литература, кстати тоже нужна... Чтобы знать что за фамилия выше)
    Ответ написан
    Комментировать
  • Как возвести в квадрат каждый элемент в массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Минутка лишних усложнений и новых концепций.

    В JavaScript примитивные значения (числа, например) копируются/передаются «значением», не сохраняя никакой связи с оригиналом. А объекты (например, массив) передаются «ссылкой» на оригинал.

    Судя по неудачной попытке, был расчёт, что изменив elem, изменится и его «оригинал» – элемент массива. Но нет. Число возвели в квадрат, но в массиве всё осталось по-прежнему.

    Будь elem не числом, а объектом, трюк сработал бы.
    пример
    let arr = [ {x: 1},  {x: 2},  {x: 3},  {x: 4},  {x: 5} ];
    
    for (let elem of arr) {
      elem.x = elem.x ** 2;
    }
    // [ {"x": 1}, {"x": 4}, {"x": 9}, {"x": 16}, {"x": 25} ]


    А в случае с примитивами (числом, строкой) надо как-то вложить квадратное значение обратно в массив в нужную ячейку. Этого-то и не хватает в коде.
    Ответ написан
    Комментировать