如何使用python中的循环有效地进行特征工程?

时间:2019-04-26 04:36:39

标签: python pandas loops

我正在尝试执行以下操作:

 public static void makeMatches(List<Person> list1, List<Person> list2) {
    // set each person to be free
    for (Person m : list1) {
        m.erasePartner();
    }

    for (Person w: list2) {
        w.erasePartner();
    }

    int m1 = stillNotEngaged(list1, list2);
    while (m1 != -1) { // at least one not engaged and has choices
        int w1 = m.getFirstChoice();
        Person m = list1.get(m1);
        Person w = list2.get(w1);
        if (!w.hasPartner()) {
            m.setPartner(w1);
            w.setPartner(m1);
        }
        // if chosen woman has partner, set her to be free and engage her and man
        else if (w.hasPartner()) {
            // assuming preferences are in descending order, so index 0 is the first priority choice
            if (w.getPartnerRank() > w.getChoices().indexOf(m1)) {
                list1.get(w.getPartner()).erasePartner();
                w.setPartner(m1);
                m.setPartner(w1);
            }
        }
        m.removeChoice(w1);
        m1 = stillNotEngaged(list1, list2);
    }
}

它看起来很愚蠢而且效率低下。有没有很酷的方法来创建一个函数来对此进行循环?我只是不敢将数字放在pct_change()的括号内。

3 个答案:

答案 0 :(得分:3)

为什么没有简单的for循环?

for n in list(range(1, 20)) + list(range(30, 270, 20)):
    df[f'SR{n}'] = df['Open'].pct_change(n)

注意:f字符串符号仅在Python> = 3.6中有效,并且等效于'SR{}'.format(n)

答案 1 :(得分:1)

也许

for n in numbers:
    df['SR'+str(n)] = df['Open'].pct_change(n)

其中numbers包含您要处理的所有索引。

答案 2 :(得分:1)

如果您想提高效率,请不要使用循环。您可以将assign与字典理解结合使用。

df = df.assign(**{f'SR{n}': df['Open'].pct_change(n)
                  for n in list(range(1, 21)) + list(range(30, 270, 20))})

还是不使用f字符串:

df = df.assign(**{'SR{n}'.format(n): df['Open'].pct_change(n)
                  for n in list(range(1, 21)) + list(range(30, 270, 20))})

时间

使用字典理解功能快一些。

df = pd.DataFrame({'Open': range(252 * 5)})

%%timeit
df.assign(**{f'SR{n}': df['Open'].pct_change(n)
             for n in list(range(1, 21)) + list(range(30, 270, 20))})
# 25.3 ms ± 2.45 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
for n in list(range(1, 21)) + list(range(30, 270, 20)):
    df[f'SR{n}'] = df['Open'].pct_change(n)
# 28.3 ms ± 3.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)