我正在尝试计算我的数据的每月标准偏差。
我的数据从数据库加载到具有以下列的数据框中:
measurement_time, level, mixing_ratio, concentration
要计算每月标准偏差,我会执行以下操作:
df_std = df_std.set_index('measurement_time')
df_std = df_std.groupby(['level'], as_index=False)
df_std = df_std.resample('M').std()
结果是:
>> df_std.head()
level mixing_ratio concentration
measurement_time
0 2016-01-31 0.0 3.435376e-11 0.000015
2016-02-29 0.0 2.692636e-11 0.000012
2016-03-31 0.0 6.709993e-11 0.000029
2016-04-30 0.0 3.338249e-11 0.000014
2016-05-31 0.0 3.916523e-11 0.000017
问题在于它正在计算level
上的标准差,而我只想在mixing_ratio
&上进行计算。 concentration
结果应该是每个级别的每月标准偏差。如果我有7个级别,我希望我的数据帧有84行(7 * 12个月)。
我该如何解决这个问题?
答案 0 :(得分:0)
重新采样时,您必须对汇总数据执行某些操作。
不同列的不同功能示例:
df_resample = df_std.resample('M').agg({'level': np.mean, 'mixing_ratio': np.std, 'concentration':np.std})
其他选项是按时间和级别分组。
答案 1 :(得分:0)
SamuelNLP的答案非常适合在DataFrame上进行不同计算的情况,如他的示例所示!
但是我有一个与pookie非常相似的问题,一个大型的DataFrame(长度> 120'000'000),我需要每5分钟除一栏外的所有std。在这种特定情况下,有一个简单但较快的替代方法:
data_std = data.resample('5min').std()
data_std.drop('temperature', axis=1)
我只是在重新采样后计算了std,然后删除了我不需要的列。
>> data.head()
x y z temperature
time
2018-02-21 11:00:06.354 0.606 0.764 -0.499 21.163203
2018-02-21 11:00:06.364 -0.762 0.127 -0.499 21.163203
2018-02-21 11:00:06.374 -0.793 0.143 -0.482 21.163203
2018-02-21 11:00:06.384 -0.809 0.064 -0.418 21.163203
2018-02-21 11:00:06.394 -0.825 -0.016 -0.401 21.163203
>> data_std = data.resample('5min').std()
>> data_std.drop('temperature', axis=1)
>> data_std.head()
x y z
time
2018-02-21 11:00:05 0.260700 0.192227 0.244653
2018-02-21 11:00:10 0.125168 0.164327 0.116562
2018-02-21 11:00:15 0.138330 0.154963 0.126264
2018-02-21 11:00:20 0.182339 0.204350 0.226019
2018-02-21 11:00:25 0.193661 0.107022 0.133125
加速: 我用不同的DataFrame长度对这两个选项进行了测试,分别用一次简单的time.time()测量了50次。
# resample-drop method
tmp = data.resample('5s').std()
tmp.drop('temperature', axis=1, inplace=True)
# aggregate method
tmp = data.resample('5s').agg({'x': np.std, 'y':np.std, 'z':np.std})
我认为此运行时差异是由于与聚合相比,简单的重采样部分的更有效实现。但我很乐意提供更多解释。