如何计算groupby()之后的曲线下面积(积分)?

时间:2021-01-24 20:56:38

标签: python pandas dataframe time-series aggregation

我有一个循环运行的机器的数据集。我想从机器运行每个周期期间发生的时间序列中提取特征。

然后我使用 groupby() 来收集每个周期的数据。现在我想使用 np.trapz() 来获取曲线下的区域,但我得到了堆栈。

如果你知道其他更简单的方法,对我来说也很好。

数据如下:


data = {'date_time':['2017-03-22 10:07',
                     '2017-03-23 10:08',
                     '2017-03-24 10:09',
                     '2017-03-25 10:10',
                     '2017-03-26 10:11',
                     '2017-03-27 10:12',
                     '2017-03-28 10:13',
                     '2017-03-29 10:14',
                     '2017-03-22 10:15',
                     '2017-03-22 10:16',
                     '2017-03-22 10:17',
                     '2017-03-22 10:18',
                     '2017-03-22 10:19',
                     '2017-03-22 10:20',
                     '2017-03-22 10:21',
                     '2017-03-22 10:22',
                     '2017-03-22 10:23',
                     '2017-03-22 10:24',
                     '2017-03-22 10:25',
                     '2017-03-22 10:26',
                     '2017-03-22 10:27',
                     '2017-03-22 10:28',
                     '2017-03-22 10:29',
                     '2017-03-22 10:30'],
     
        'production_line_no':[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1], 
        'var1':[20, 21, 4, 18, 20, 21, 2, 18, 20, 21, 1, 18, 10, 6, 9, 8, 10, 3, 9, 8, 7, 18, 20, 21], 
        'var2':[20, 21, 19, 18, 20, 21, 19, 18, 20, 21, 19, 18, 10, 11, 9, 8, 10, 11, 9, 8, 19, 18, 20, 21], 
        'running':[0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
       }

df=pd.DataFrame(data)

现在我像这样为每个周期计算几个聚合,并且效果很好:


# Convert date time string to DateTime type
df['date_time']= pd.to_datetime(df['date_time'], format='%Y-%m-%d %H:%M')

# Create cycle_ID to differenciate the different cycles and prepare the use of groupby() + agg()
df['cycle_ID']=df['running'].diff().abs().cumsum()*df['running']

# Define agg type Pandas built-in
aggregations = {
    'var1':['std','min'],
    'var2':['std','min'],
    'date_time':[lambda x:(max(x) - min(x)).days, 'min','max']
}

# Create the gouped object
grouped=df.groupby(by=['cycle_ID', 'production_line_no'],as_index=False).agg(aggregations)
grouped

这是输出: df of aggregations

现在我想为每个变量添加一个新特征,即曲线下的面积。我尝试使用 groupby() + np.trapz() 但我卡住了。

grouped_area=df.groupby(by=['cycle_ID', 'production_line_no'],as_index=False).apply(lambda x: np.trapz(x, dx=1.0))

我收到了那个错误:ValueError: Cannot add integral value to Timestamp without freq.

0 个答案:

没有答案