滚动操作性能慢,创建一个新列

By simon at 2019-05-10 • 0人收藏 • 12人看过

您好,我已经创建了一个代码,它在创建数据框中的新列时性能非常低。 这个新列是一个具有不同权重的滚动移动平均值,这是我从 for 循环迭代中获得的,但是我猜在 Python 中可能有一种更好 / 更快的性能方法来实现这一点。

  • 最初的数据库与此类似(尽管规模大得多) :

    句子太长,请短一点。 Dataframe (data,index idx,columns'x']) df.index.names'date','type']

它看起来像这样:

1月1日 b 2月3日 b 2月3日 a 2 b 7 c 4月1 b 65月3日 a 5 b 2 c 3 Jul 1 Aug 9 c 3 Sep 2 b 7 Oct 3 a 6 b 8 Nov a 2 Dic b 7 c 9
  • 我的目标是改进以下代码,以在数据框中创建一个新列(具有不同权重的滚动移动平均线)。 我的原则是:

    Df df.reset index () df ['rolling']0 for j in df ['type']. Unique () : list 1 list (df ['x'][ df ['type'] j ]) cumsum [0] list 2 list (df ['x'][ df ['type'] j ]). Index) z ] for i,h in enumerate (list 1,1) : if i 4: cumsum.append (0.2 * list 1[ i-4] + 0.3 * list 1[ i-3] + 0.5 * list 1[ i-2]) else: cumsum.append ('NaN') cumsum.pop (0) z.append (cumsum [0]) df ['rolling'][ list 2] z

它看起来像这样:

3 Mar 2 an 4 Mar 4 b 7 NaN 5 Mar 3 c 3 Apr 1 NaN 7 Apr b 645.48 May 37 Apr b 6.48 May 3.7 Jun 51.310 Jun 24.76612 Jul a 10月3日,10月6日,10月6日,10月6日,10月8日,6月6日,20日,11月2,3,8,21,7,9,7,9,7,9,7,7,7,10,17

* * 如果你有一个比我的性能更好的代码,知道它的速度有多快会很有趣。 如果你认为你的代码更好,但是你不知道它有多快,不管怎样,发布它,因为我会意识到一个更大的数据框。 谢谢!

1 个回复 | 最后更新于 2019-05-10
2019-05-10   #1

让我们试试这个,看看它是否会加快你的代码:

句子太长,请短一点。 Dataframe (data,index idx,columns'x']) df.index.names'date','type'] df ['rolling'] df.groupby ('type')['x']. 滚动(4)。 Apply (lambda x: x [-4] * . 2 + x [-3] * . 3 + x [-2] * . 5). 重置索引(级别2,删除真)。 Swaplevel (0,1) df

输出:

2 b 7 c 3.6 a 23.8 Dic b 7.9 c 93.00 c

时间..。

你的代码:

324 ms / 1.55 ms / loop (平均标准时间)。 德夫。 7次循环,每次循环一次)

这个代码是:

12.6 ms / 138 s / (平均标准时间)。 德夫。 100个循环)

登录后方可回帖

Loading...