我正在为不同的时间戳执行以下代码,每个时间戳将有近一百万条记录。一个日期用了一个多小时,我得到了总共35个日期的数据。

有没有一种方法可以优化此代码?

def median(a, b, c,d,e):
    I=[a,b,c,d,e]
    I.sort()
    return I[2]

for i in range(2, len(df['num'])-2):
    num_smooth= median(df['num'][i-1], df['num'][i-2], df['num'][i],
                       df['num'][i+1], df['num'][i+2])
    df.set_value(i,'num_smooth',num_smooth)
df['num_smooth'].fillna(df['num'], inplace=True)

...........................................
Remaining code

最佳答案

我猜您的df是熊猫DataFrame对象。熊猫具有内置功能来计算滚动统计信息,包括滚动中值。可通过熊猫rollingSeries对象上的DataFrame方法使用此功能。

>>> s = pd.Series(np.random.rand(10))
>>> s
0    0.500538
1    0.598179
2    0.747391
3    0.371498
4    0.244869
5    0.930303
6    0.327856
7    0.317395
8    0.190386
9    0.976148
dtype: float64
>>> s.rolling(window=5, center=True).median()
0         NaN
1         NaN
2    0.500538
3    0.598179
4    0.371498
5    0.327856
6    0.317395
7    0.327856
8         NaN
9         NaN
dtype: float64


有关使用rolling和相关功能的更多常规信息,请参见Window Functions上的Pandas文档。通常,当性能很重要时,您应该更喜欢使用内置的Pandas和NumPy函数和方法,而不要使用显式的Python级别的for循环,不过,与往常一样,您应该确定自己的解决方案。在我的机器上,使用包含一百万个随机浮点数的df['num']系列,基于rolling的解决方案大约需要129秒,而基于for循环的解决方案大约需要0.61秒,因此使用rolling可以加快最多编码200倍。

所以就你而言

df['num_smooth'] = df['num'].rolling(window=5, center=True).median()


连同已经执行的fillna步骤,应该可以为您提供所需的东西。

请注意,用于计算滚动统计信息的语法在Pandas 0.18中已更改,因此至少需要版本0.18才能使用上述代码。对于早期版本的Pandas,请查看rolling_median函数。

关于python - python中for循环的优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40005264/

10-12 22:53