【发布时间】:2020-07-21 07:27:04
【问题描述】:
我有一个简单的 pandas 数据框,我需要获取每一行的标准差值取决于前几行。我可以使用for 循环轻松做到这一点,但问题是计算需要很多时间。对于 1000 行,需要 4 秒。有什么办法可以加快速度吗?
结果:
a
0 0
1 1
2 2
3 3
4 4
.. ...
995 995
996 996
997 997
998 998
999 999
10:21:18.320780 starting loop
10:21:22.861962 ending loop
std
0 0.0
1 1.0
2 1.6
3 2.2
4 2.7
.. ...
995 574.9
996 575.5
997 576.1
998 576.6
999 577.2
代码:
import pandas as pd
import numpy as np
import math
from datetime import datetime
df = pd.DataFrame(data=np.arange(1000), columns=['a'])
print(df)
df_std = pd.DataFrame(0, index=np.arange(len(df)), columns=['std'])
print('{} starting loop'.format(datetime.now().strftime('%H:%M:%S.%f')))
for i in range(1, len(df_std)):
su = np.sum([math.pow(df['a'].iloc[t], 2) for t in range(i + 1)])
df_std['std'].iloc[i] = round(math.sqrt(su / i), 1)
print('{} ending loop'.format(datetime.now().strftime('%H:%M:%S.%f')))
print(df_std)
更新: 我需要做这样的事情:
for i in range(1, len(df_std)):
df_std['std'].iloc[i] = df['a'].rolling(window=i).std()
这意味着我需要为每个具有不同滚动的 df 行获取 std() 值。对于 i=5 滚动将是前 5 个 df 行,对于 i=500 滚动将是 500 等等。
【问题讨论】:
-
你能准确解释你想要达到的目标吗?您是否尝试根据所有前面的行计算滚动标准?在这种情况下,您可以使用 pandas
rolling()方法。 -
@pavel 这不是
rolling()所做的,它对最后 N 个值应用一些操作,而不是 all 以前的值。您所描述的是expanding(),它确实将操作应用于所有先前的值。df.expanding(1).sum()与df.cumsum()相同(可能除了边缘情况?)。
标签: python pandas numpy dataframe