我正在为不同的时间戳执行以下代码,每个时间戳将有近一百万条记录。一个日期用了一个多小时,我得到了总共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
对象。熊猫具有内置功能来计算滚动统计信息,包括滚动中值。可通过熊猫rolling
和Series
对象上的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/