python - 如何加快每行的数据帧 std() 计算?
问题描述
我有一个简单的 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 等等。
解决方案
我认为不需要循环:
df = pd.DataFrame(data=np.arange(20), columns=['a'])
df['std'] = np.round(np.sqrt(np.power(df['a'], 2).cumsum() / np.arange(len(df))), 1)
print (df)
a std
0 0 NaN
1 1 1.0
2 2 1.6
3 3 2.2
4 4 2.7
5 5 3.3
6 6 3.9
7 7 4.5
8 8 5.0
9 9 5.6
10 10 6.2
11 11 6.8
12 12 7.4
13 13 7.9
14 14 8.5
15 15 9.1
16 16 9.7
17 17 10.2
18 18 10.8
19 19 11.4
推荐阅读
- javascript - 如何使这种网格布局在所有屏幕上工作
- reactjs - 使用邮递员登录时如何修复401未授权状态
- serilog - Serilog SQL Sink 日志服务器名称和 ASPNETCORE_ENVIRONMENT 作为列
- ruby-on-rails - 如何销毁/删除没有 id 列的 Rails Active Record?
- python - 将随机值平均分配给熊猫数据框
- angular - 在加载时使用响应式动态预填充下拉选项作为对象
- pandas - 如何将不同的股票数据帧存储在某种容器中,并可以在该容器操作中的所有数据帧上一次性运行一些操作
- javascript - 如何在不刷新页面的情况下发送和接收数据
- android - 使用操作栏中的图标按钮导航到另一个活动
- linkedin - UgcPost '成功',但返回的 URN 不存在 - 除非您先等待