Pandas 重采样和方差不保持计时
Pandas resampling and variance doesn't keep timings
我正在使用 pandas
和以下代码对我的数据帧 df
中的一些值进行重采样:
>> df['hour'] = f.Date.dt.hour
>> df = df.set_index('Date').resample('60T').mean().reset_index()
我正确地得到了按 60 分钟重新采样的每小时的平均值,如下所示:
>> print(df)
date id mean hour
0 2017-02-09 14:00:00 12345.0 10.000000 14.0
1 2017-02-09 15:00:00 12345.0 10.166667 15.0
2 2017-02-09 16:00:00 12345.0 10.000000 16.0
3 2017-02-09 17:00:00 12345.0 11.000000 17.0
4 2017-02-09 18:00:00 12345.0 9.583333 18.0
5 2017-02-09 19:00:00 12345.0 11.333333 19.0
如果我在相同的数据帧上执行相同的代码(在上述重采样之前),对于方差,结果是:
>> df = df.set_index('Date').resample('60T').var().reset_index()
>> print(df)
date id var hour
0 2017-02-09 14:00:00 0.0 92.800000 0.0
1 2017-02-09 15:00:00 0.0 14.166667 0.0
2 2017-02-09 16:00:00 0.0 9.719697 0.0
3 2017-02-09 17:00:00 0.0 19.606061 0.0
4 2017-02-09 18:00:00 0.0 4.090909 0.0
5 2017-02-09 19:00:00 0.0 9.333333 0.0
你知道为什么吗?
编辑:
使用 .agg 我正确地执行了均值和中值,但方差保持为 nan。为什么?这是代码:
df = dataset.groupby(['ID',
pd.Grouper(key='Date', freq='60T')])['Value'].agg(['mean', 'median',
'var']).reset_index()
这是结果
, ID,Date,mean,median,var
0,13834,2017-02-09 12:00:00,1.4749195494770717,1.4749195494770717,
1,13834,2017-02-09 16:00:00,4.424796460176991,4.424796460176991,
2,13834,2017-02-09 20:00:00,2.2418710493046774,2.2418710493046774,
3,13834,2017-02-10 00:00:00,2.6548672566371687,2.6548672566371687,
4,13834,2017-02-10 04:00:00,2.6548672566371683,2.6548672566371683,
5,13834,2017-02-10 08:00:00,0.5110619469026555,0.5110619469026555,
如您所见,输出中甚至没有包含方差。如何?
谢谢
GroupBy.mean
和 GroupBy.var
会将这些计算应用于所有数字列。
在这种情况下,您定义了一个数字 'hour'
列,它在一个组中具有相同的值。例如,对于 mean
,这会导致返回单个唯一值 mean([14, 14, 14, 14]) = 14
。但是使用 var; var([14, 14, 14, 14]) = 0
这就是为什么在每个具有方差重采样的组中小时为 0 的原因。
您可能应该提供一个用于聚合的字典,以确保您对每一列使用正确的函数:agg({'hour': 'first', ...})
我正在使用 pandas
和以下代码对我的数据帧 df
中的一些值进行重采样:
>> df['hour'] = f.Date.dt.hour
>> df = df.set_index('Date').resample('60T').mean().reset_index()
我正确地得到了按 60 分钟重新采样的每小时的平均值,如下所示:
>> print(df)
date id mean hour
0 2017-02-09 14:00:00 12345.0 10.000000 14.0
1 2017-02-09 15:00:00 12345.0 10.166667 15.0
2 2017-02-09 16:00:00 12345.0 10.000000 16.0
3 2017-02-09 17:00:00 12345.0 11.000000 17.0
4 2017-02-09 18:00:00 12345.0 9.583333 18.0
5 2017-02-09 19:00:00 12345.0 11.333333 19.0
如果我在相同的数据帧上执行相同的代码(在上述重采样之前),对于方差,结果是:
>> df = df.set_index('Date').resample('60T').var().reset_index()
>> print(df)
date id var hour
0 2017-02-09 14:00:00 0.0 92.800000 0.0
1 2017-02-09 15:00:00 0.0 14.166667 0.0
2 2017-02-09 16:00:00 0.0 9.719697 0.0
3 2017-02-09 17:00:00 0.0 19.606061 0.0
4 2017-02-09 18:00:00 0.0 4.090909 0.0
5 2017-02-09 19:00:00 0.0 9.333333 0.0
你知道为什么吗?
编辑: 使用 .agg 我正确地执行了均值和中值,但方差保持为 nan。为什么?这是代码:
df = dataset.groupby(['ID',
pd.Grouper(key='Date', freq='60T')])['Value'].agg(['mean', 'median',
'var']).reset_index()
这是结果
, ID,Date,mean,median,var
0,13834,2017-02-09 12:00:00,1.4749195494770717,1.4749195494770717,
1,13834,2017-02-09 16:00:00,4.424796460176991,4.424796460176991,
2,13834,2017-02-09 20:00:00,2.2418710493046774,2.2418710493046774,
3,13834,2017-02-10 00:00:00,2.6548672566371687,2.6548672566371687,
4,13834,2017-02-10 04:00:00,2.6548672566371683,2.6548672566371683,
5,13834,2017-02-10 08:00:00,0.5110619469026555,0.5110619469026555,
如您所见,输出中甚至没有包含方差。如何? 谢谢
GroupBy.mean
和 GroupBy.var
会将这些计算应用于所有数字列。
在这种情况下,您定义了一个数字 'hour'
列,它在一个组中具有相同的值。例如,对于 mean
,这会导致返回单个唯一值 mean([14, 14, 14, 14]) = 14
。但是使用 var; var([14, 14, 14, 14]) = 0
这就是为什么在每个具有方差重采样的组中小时为 0 的原因。
您可能应该提供一个用于聚合的字典,以确保您对每一列使用正确的函数:agg({'hour': 'first', ...})