【发布时间】:2021-05-08 12:41:40
【问题描述】:
我需要您的帮助,以制定一种更快的方法来对 10 分钟角/圆形数据进行分组。由于循环数据的范围是 0 到 360,因此普通平均值无法捕获 0 到 360 之间的关系。因此,我想使用 scipy.stats circmean 来完成循环平均值。我已经发现 pd.groupby 中实现的 apply() 方法在将 10 分钟数据类似于每小时组然后对这些组应用循环平均值时非常慢(标准联想笔记本电脑需要 120 秒)。
此外,我使用的数据集可以包含不连续的时间戳。不过,有没有办法加快以下代码的速度(例如通过矢量化)?
非常感谢您的帮助。如果您需要这方面的更多信息,请告诉我。
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))
【问题讨论】:
-
除完整代码外,请指明输入与预期输出。
标签: pandas pandas-groupby vectorization apply circular-dependency