pandas 将函数应用于按天分组的数据
pandas apply function to data grouped by day
我有一个如下所示的数据集:
date,value1,value2
2016-01-01 00:00:00,3,0
2016-01-01 01:00:00,0,0
2016-01-01 02:00:00,0,0
2016-01-01 03:00:00,0,0
2016-01-01 04:00:00,0,0
2016-01-01 05:00:00,0,0
2016-01-01 06:00:00,0,0
2016-01-01 07:00:00,0,2
2016-01-01 08:00:00,3,11
2016-01-01 09:00:00,14,14
2016-01-01 10:00:00,12,13
2016-01-01 11:00:00,11,13
2016-01-01 12:00:00,11,9
2016-01-01 13:00:00,17,21
2016-01-01 14:00:00,9,22
2016-01-01 15:00:00,10,9
2016-01-01 16:00:00,11,9
2016-01-01 17:00:00,8,8
2016-01-01 18:00:00,4,2
2016-01-01 19:00:00,5,7
2016-01-01 20:00:00,5,5
2016-01-01 21:00:00,3,4
2016-01-01 22:00:00,2,4
2016-01-01 23:00:00,2,4
2016-01-02 00:00:00,0,0
2016-01-02 01:00:00,0,0
2016-01-02 02:00:00,0,0
2016-01-02 03:00:00,0,0
2016-01-02 04:00:00,0,0
2016-01-02 05:00:00,0,0
2016-01-02 06:00:00,1,0
2016-01-02 07:00:00,0,0
2016-01-02 08:00:00,0,0
2016-01-02 09:00:00,0,0
2016-01-02 10:00:00,0,0
2016-01-02 11:00:00,0,0
2016-01-02 12:00:00,0,0
2016-01-02 13:00:00,1,0
2016-01-02 14:00:00,0,0
2016-01-02 15:00:00,0,0
2016-01-02 16:00:00,0,0
2016-01-02 17:00:00,0,0
2016-01-02 18:00:00,0,0
2016-01-02 19:00:00,0,0
2016-01-02 20:00:00,1,0
2016-01-02 21:00:00,0,0
2016-01-02 22:00:00,0,0
2016-01-02 23:00:00,0,0
我想做的是每天计算 value1 和 value2 之间的均方根。
所以基本上,我想 运行 函数 31 次(每天一次),输入将是当天的 24 个条目(每小时一个)
我尝试使用
rmse(df.groupby([df.index.day]).mean().value1,
df.groupby([df.index.day]).mean().value2)
但它给了我一个单一的值,而我想要的是一个包含每天有效值的列表,例如
daily_rmse = [rmse01_01, rmse01_02, ..., rmse01_31]
您不需要继续重做 groupby
,您需要计算每个元素的 rmse
,而不是均值序列:
gb = df.groupby(df.index.date)
mean_by_day = gb.mean()
rmse_by_day = gb.std(ddof=0)
我怀疑您应用的 RMSE 公式完全等同于按元素数量归一化的标准差(不是元素数量 - 1,Pandas 中默认为)。
您现在应该能够访问 mean_by_day.value1
和 std_by_day.value1
以获得您想要的值。
我得到的 mean_by_day
的值是
value1 value2
2016-01-01 5.416667 6.541667
2016-01-02 0.125000 0.000000
同样,对于 rmse_by_day
我得到
value1 value2
2016-01-01 5.139039 6.422481
2016-01-02 0.330719 0.000000
请注意,使用索引的 date
字段而不是 day
,如果您的数据持续多个月,则可能会重复。
使用 sklearn
s mean_squared_error
from sklearn.metrics import mean_squared_error
df.groupby(df.date.dt.date).apply(
lambda x: mean_squared_error(x.value1, x.value2) ** .5)
date
2016-01-01 3.494043
2016-01-02 0.377964
dtype: float64
我有一个如下所示的数据集:
date,value1,value2
2016-01-01 00:00:00,3,0
2016-01-01 01:00:00,0,0
2016-01-01 02:00:00,0,0
2016-01-01 03:00:00,0,0
2016-01-01 04:00:00,0,0
2016-01-01 05:00:00,0,0
2016-01-01 06:00:00,0,0
2016-01-01 07:00:00,0,2
2016-01-01 08:00:00,3,11
2016-01-01 09:00:00,14,14
2016-01-01 10:00:00,12,13
2016-01-01 11:00:00,11,13
2016-01-01 12:00:00,11,9
2016-01-01 13:00:00,17,21
2016-01-01 14:00:00,9,22
2016-01-01 15:00:00,10,9
2016-01-01 16:00:00,11,9
2016-01-01 17:00:00,8,8
2016-01-01 18:00:00,4,2
2016-01-01 19:00:00,5,7
2016-01-01 20:00:00,5,5
2016-01-01 21:00:00,3,4
2016-01-01 22:00:00,2,4
2016-01-01 23:00:00,2,4
2016-01-02 00:00:00,0,0
2016-01-02 01:00:00,0,0
2016-01-02 02:00:00,0,0
2016-01-02 03:00:00,0,0
2016-01-02 04:00:00,0,0
2016-01-02 05:00:00,0,0
2016-01-02 06:00:00,1,0
2016-01-02 07:00:00,0,0
2016-01-02 08:00:00,0,0
2016-01-02 09:00:00,0,0
2016-01-02 10:00:00,0,0
2016-01-02 11:00:00,0,0
2016-01-02 12:00:00,0,0
2016-01-02 13:00:00,1,0
2016-01-02 14:00:00,0,0
2016-01-02 15:00:00,0,0
2016-01-02 16:00:00,0,0
2016-01-02 17:00:00,0,0
2016-01-02 18:00:00,0,0
2016-01-02 19:00:00,0,0
2016-01-02 20:00:00,1,0
2016-01-02 21:00:00,0,0
2016-01-02 22:00:00,0,0
2016-01-02 23:00:00,0,0
我想做的是每天计算 value1 和 value2 之间的均方根。 所以基本上,我想 运行 函数 31 次(每天一次),输入将是当天的 24 个条目(每小时一个) 我尝试使用
rmse(df.groupby([df.index.day]).mean().value1,
df.groupby([df.index.day]).mean().value2)
但它给了我一个单一的值,而我想要的是一个包含每天有效值的列表,例如
daily_rmse = [rmse01_01, rmse01_02, ..., rmse01_31]
您不需要继续重做 groupby
,您需要计算每个元素的 rmse
,而不是均值序列:
gb = df.groupby(df.index.date)
mean_by_day = gb.mean()
rmse_by_day = gb.std(ddof=0)
我怀疑您应用的 RMSE 公式完全等同于按元素数量归一化的标准差(不是元素数量 - 1,Pandas 中默认为)。
您现在应该能够访问 mean_by_day.value1
和 std_by_day.value1
以获得您想要的值。
我得到的 mean_by_day
的值是
value1 value2
2016-01-01 5.416667 6.541667
2016-01-02 0.125000 0.000000
同样,对于 rmse_by_day
我得到
value1 value2
2016-01-01 5.139039 6.422481
2016-01-02 0.330719 0.000000
请注意,使用索引的 date
字段而不是 day
,如果您的数据持续多个月,则可能会重复。
使用 sklearn
s mean_squared_error
from sklearn.metrics import mean_squared_error
df.groupby(df.date.dt.date).apply(
lambda x: mean_squared_error(x.value1, x.value2) ** .5)
date
2016-01-01 3.494043
2016-01-02 0.377964
dtype: float64