Pandas groupby-应用循环平均值将10分钟的数据聚合为每小时的数据-更快?

Pandas groupby-应用循环平均值将10分钟的数据聚合为每小时的数据-更快?,pandas,pandas-groupby,vectorization,apply,circular-dependency,Pandas,Pandas Groupby,Vectorization,Apply,Circular Dependency,我需要您的帮助,以制定一种更快的方法,将10分钟的角度/圆形数据分组。由于循环数据的范围从0到360,普通平均值无法捕捉到0和360之间的关系。因此,我想使用scipy.stats circmean来实现循环平均值。我已经计算出,在pd.groupby中实现的apply()方法非常慢(对于标准的联想笔记本电脑来说是120秒),它将10分钟的数据类似于每小时的组,然后在这些组上应用循环平均值 此外,我使用的数据集可以由非连续的时间戳组成。然而,是否有办法加速以下代码(例如通过矢量化) 非常感谢你的

我需要您的帮助,以制定一种更快的方法,将10分钟的角度/圆形数据分组。由于循环数据的范围从0到360,普通平均值无法捕捉到0和360之间的关系。因此,我想使用scipy.stats circmean来实现循环平均值。我已经计算出,在pd.groupby中实现的apply()方法非常慢(对于标准的联想笔记本电脑来说是120秒),它将10分钟的数据类似于每小时的组,然后在这些组上应用循环平均值

此外,我使用的数据集可以由非连续的时间戳组成。然而,是否有办法加速以下代码(例如通过矢量化)

非常感谢你的帮助。如果你需要更多的信息,请告诉我

import time
import pandas as pd
from datetime import datetime
import numpy as np
from scipy.stats import circmean

data = pd.DataFrame()
start = datetime(2015, 1, 1)
end = datetime(2020, 1, 1)
data['time'] = pd.date_range(start, end, freq='10T')
data['angles'] = np.random.uniform(low=0.0, high=360.0, size=(len(data.time),))
data.drop(data.index[1500:2000], inplace=True)

def mean2(df):
    '''
    :param df: 10min Values inside a dataframe for the according hour - DataFrame
    :return: df_out: The aggregated dataframe - DataFrame
    '''
    df_out = pd.DataFrame(columns=df.columns)
    try:
        df_out.at[0,'angles'] = round(np.rad2deg(circmean(np.deg2rad(df['angles']))),2)
        df_out.at[0, 'time'] = df.time.iloc[0]
        df_out.time = pd.to_datetime(df_out.time)
        return df_out

    except:
        return df_out

start_time = time.time()
data_hourly = data.groupby([pd.Grouper(key='time',freq='1H')], as_index=False).apply(mean2)
print("--- %s seconds ---" % (time.time() - start_time))

在你的
mean2
函数中有很多无用的东西

当一个函数应用于一个
groupby
时,pandas将自动重新创建一个新的数据帧,无需在函数中执行一些奇怪的列/索引访问。此外,pandas访问特定列/索引对上的数据(at方法)的成本非常高

下面是一种更有效的简化方法:

导入时间
作为pd进口熊猫
从日期时间导入日期时间
将numpy作为np导入
从scipy.stats导入circmean
data=pd.DataFrame()
开始=日期时间(2015,1,1)
结束=日期时间(2020,1,1)
数据['time']=pd.date\u范围(开始、结束、频率=10T')
数据['angles']=np.random.uniform(低=0.0,高=360.0,大小=(len(data.time),)
data.drop(data.index[1500:2000],原地=真)
平均值(x):
返回圆(np.rad2deg(圆圈平均值(np.deg2rad(x['角度]]值))),2)
开始时间=time.time()
data.index=data['time']
数据每小时=数据。重新采样(规则='1H')。应用(循环平均值)
打印(“--%s秒--”%(time.time()-start\u time))

除了完整的代码外,请注明具有预期输出的输入。感谢您的澄清!