使用 pandas 按 bin 和时间对数据进行双重分组
Double grouping data by bins AND time with pandas
我正在尝试在一段时间 window 内对时间序列的值(每小时和每小时温度值)进行分类。
也就是说,我想从最初的每小时值中提取每天、每周或每月的合并值。
我尝试将 groupby
+TimeGrouper(" ")
与 pd.cut
结合使用,但效果不佳。
我从这个 tutorial 中发现了一个很好的函数,它建议映射数据(将每个值与下一列的映射范围相关联),然后根据该数据进行分组。
def map_bin(x, bins):
kwargs = {}
if x == max(bins):
kwargs['right'] = True
bin = bins[np.digitize([x], bins, **kwargs)[0]]
bin_lower = bins[np.digitize([x], bins, **kwargs)[0]-1]
return '[{0}-{1}]'.format(bin_lower, bin)
df['Binned'] = df['temp'].apply(map_bin, bins=freq_bins)
但是,应用此函数会导致 IndexError:索引 n 超出轴 0 的范围,大小为 n。
理想情况下,我想让这项工作发挥作用并将其应用于同时实现双重分组:一个按 bins,一个按 timegrouper。
更新:
由于双索引列,我之前的尝试似乎导致了问题。我已经简化了一些看起来效果更好的东西。
import pandas as pd
import numpy as np
xaxis = np.linspace(0,50)
temps = pd.Series(data=xaxis,name='temps')
times = pd.date_range(start='2015-07-15',periods=50,freq='6H')
temps.index = times
bins = [0,10,20,30,40,50]
temps.resample('W').agg(lambda series:pd.value_counts(pd.cut(series,bins),sort=False)).unstack()
这输出:
(0, 10] (10, 20] (20, 30] (30, 40] (40, 50]
2015-07-19 9 10 0 0 0
2015-07-26 0 0 10 10 8
2015-08-02 0 0 0 0 2
我正在尝试在一段时间 window 内对时间序列的值(每小时和每小时温度值)进行分类。
也就是说,我想从最初的每小时值中提取每天、每周或每月的合并值。
我尝试将 groupby
+TimeGrouper(" ")
与 pd.cut
结合使用,但效果不佳。
我从这个 tutorial 中发现了一个很好的函数,它建议映射数据(将每个值与下一列的映射范围相关联),然后根据该数据进行分组。
def map_bin(x, bins):
kwargs = {}
if x == max(bins):
kwargs['right'] = True
bin = bins[np.digitize([x], bins, **kwargs)[0]]
bin_lower = bins[np.digitize([x], bins, **kwargs)[0]-1]
return '[{0}-{1}]'.format(bin_lower, bin)
df['Binned'] = df['temp'].apply(map_bin, bins=freq_bins)
但是,应用此函数会导致 IndexError:索引 n 超出轴 0 的范围,大小为 n。
理想情况下,我想让这项工作发挥作用并将其应用于同时实现双重分组:一个按 bins,一个按 timegrouper。
更新:
由于双索引列,我之前的尝试似乎导致了问题。我已经简化了一些看起来效果更好的东西。
import pandas as pd
import numpy as np
xaxis = np.linspace(0,50)
temps = pd.Series(data=xaxis,name='temps')
times = pd.date_range(start='2015-07-15',periods=50,freq='6H')
temps.index = times
bins = [0,10,20,30,40,50]
temps.resample('W').agg(lambda series:pd.value_counts(pd.cut(series,bins),sort=False)).unstack()
这输出:
(0, 10] (10, 20] (20, 30] (30, 40] (40, 50]
2015-07-19 9 10 0 0 0
2015-07-26 0 0 10 10 8
2015-08-02 0 0 0 0 2