Как упростить вложенные циклы, имеющие сравнение индексов? - PullRequest
0 голосов
/ 16 мая 2019

Я довольно новичок и создал базовые вложенные циклы для модификации существующей серии (A) почасовых данных.Серия состоит из панд, имеет индекс и значение datetime.

Мой код в основном сравнивает индекс года, месяца и дня двух серий (A & B) и, если они совпадают в некоторых строках, измените значениясерии (A) и сделайте модифицированную серию.

Работает для коротких данных, но эффективность довольно низкая.Когда я запускаю 10000 данных подсчета, цикл никогда не заканчивается.Для серии A - около 10000, для серии B - около 1000.

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

for i in range(0,len(A)):
    for j in range(0,len(B)):
        if A.index.year[i] == B.index.year[j] and A.index.month[i] == B.index.month[j] and A.index.day[i] == B.index.day[j]:
            A.values[i] = B.values[j]
            break
        else:
            pass

1 Ответ

1 голос
/ 16 мая 2019

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

Дата 1: 1 января 2019

Дата 2: 2 января 2019

Ваше условное утверждение проходит 3 сравнения, прежде чем окончательно определить, что две даты не равны.

  1. 2019 == 2019

  2. Январь == Январь

  3. 1! = 2

Если вы измените свое условие на:

A.index.day[i] == B.index.day[j] and A.index.month[i] == B.index.month[j] and A.index.year[i] == B.index.year[j]

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

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

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

Надеюсь, это поможет!

...