Python 基于最大滚动平均优化的分组

Python 基于最大滚动平均优化的分组,python,pandas,Python,Pandas,我对熊猫还比较陌生,只是想在这里发帖子,以确保我能以最有效的方式使用它。下面的代码可以工作,但需要很长时间才能运行 代码首先设置数据分组的特定间隔,并且对于每个分组采用滚动平均值。一旦拥有所有这些平均值,它会将该间隔的最大值保存到新的数据帧,并继续到下一个间隔。这适用于数据集中的所有训练(“最佳间隔时间”)以及数据集中的最新训练(“最新间隔时间”),因此可以将最新训练与历史最高训练进行比较 是否有其他方法可以加快处理时间 可在此处找到数据样本: #0-60秒之间间隔1秒 区间长度=[i代表范围

我对熊猫还比较陌生,只是想在这里发帖子,以确保我能以最有效的方式使用它。下面的代码可以工作,但需要很长时间才能运行

代码首先设置数据分组的特定间隔,并且对于每个分组采用滚动平均值。一旦拥有所有这些平均值,它会将该间隔的最大值保存到新的数据帧,并继续到下一个间隔。这适用于数据集中的所有训练(“最佳间隔时间”)以及数据集中的最新训练(“最新间隔时间”),因此可以将最新训练与历史最高训练进行比较

是否有其他方法可以加快处理时间

可在此处找到数据样本:

#0-60秒之间间隔1秒
区间长度=[i代表范围(1,61)内的i]
#从1:15到5:00分钟的15秒间隔
区间长度+=[i代表范围内的i(75,301,15)]
#5:00-10:00的30秒间隔
区间长度+=[i代表范围内的i(33060130)]
#10分钟后每件事间隔1分钟
间隔长度+=[i代表范围内的i(660,df样本['自踩踏板开始后的秒数]。应用(
lambda x:int(math.ceil(x/10.0))*10.max()+1,60)]
间隔=df_样本。排序_索引(升序=真)
间隔['power']=间隔['power']。插值()#用于填补数据中缺失的空白
最新的_df=间隔[interval['workoutId']==interval.loc[interval.index.max]['workoutId']]
latest_-df_length=最新_-df[“自踩踏板开始后的秒数]。max()
最佳间隔_df=pd.DataFrame()
最新\u间隔\u df=pd.DataFrame()
对于间隔_长度中的i:
#随时准备内部通话
温度=间隔
temp_df['best_power']=间隔。分组比(['workoutId'])['power']。滚动(int(i),
最小周期=i-1)。平均值()。重置索引(
0,
删除=真)
温度_df[‘间隔’]=i
最佳间隔\u df=最佳间隔\u df.append(temp\u df.loc[temp\u df['best\u power'].idxmax())
#不要插入比最新训练时间更长的间隔

如果我没有机会进行更深入的研究,但通常不应该在循环中附加到数据帧-创建临时数据帧列表并在末尾使用
pd.concat
进行组合更有效(temp_df和最新的temp_df添加到列表中,pd.concat循环后的列表。@KenSyme你能和我的代码分享一个如何工作的示例吗?我尝试了你的代码示例,但我的更改实际上只缩短了1秒(笔记本电脑上的示例缩短了17到16秒),因此在这种情况下可能不值得更改!
# 1 second intervals from 0-60 seconds
interval_lengths = [i for i in range(1, 61)]
# 15 second intervals from 1:15 - 5:00 mins
interval_lengths += [i for i in range(75, 301, 15)]
# 30 second intervals for 5:00 - 10:00
interval_lengths += [i for i in range(330, 601, 30)]
# 1 minute intervals for everything after 10 mins
interval_lengths += [i for i in range(660, df_samples['seconds_since_pedaling_start'].apply(
    lambda x: int(math.ceil(x / 10.0)) * 10).max() + 1, 60)]

intervals = df_samples.sort_index(ascending=True)
intervals['power'] = intervals['power'].interpolate()  # Used to fill in missing gaps in data
latest_df = intervals[intervals['workoutId'] == intervals.loc[intervals.index.max]['workoutId']]
latest_df_length = latest_df['seconds_since_pedaling_start'].max()

best_interval_df = pd.DataFrame()
latest_interval_df = pd.DataFrame()
for i in interval_lengths:
    # Get interals for all time
    temp_df = intervals
    temp_df['best_power'] = intervals.groupby(['workoutId'])['power'].rolling(int(i),
                                                                              min_periods=i - 1).mean().reset_index(
        0,
        drop=True)
    temp_df['interval'] = i
    best_interval_df = best_interval_df.append(temp_df.loc[temp_df['best_power'].idxmax()])

    # Don't insert intervals for periods longer than the latest workout
    if i <= latest_df_length:
        latest_temp_df = latest_df
        latest_temp_df['best_power'] = latest_df.groupby(['workoutId'])['power'].rolling(int(i),
                                                                                         min_periods=i - 1).mean().reset_index(
            0, drop=True)
        latest_temp_df['interval'] = i
        latest_interval_df = latest_interval_df.append(latest_temp_df.loc[latest_temp_df['best_power'].idxmax()])

best_interval_df['datetime'] = best_interval_df.index
best_interval_df = best_interval_df.set_index('interval')
latest_interval_df['datetime'] = latest_interval_df.index
latest_interval_df = latest_interval_df.set_index('interval')
# 1 second intervals from 0-60 seconds
interval_lengths = [i for i in range(1, 61)]
# 15 second intervals from 1:15 - 5:00 mins
interval_lengths += [i for i in range(75, 301, 15)]
# 30 second intervals for 5:00 - 10:00
interval_lengths += [i for i in range(330, 601, 30)]
# 1 minute intervals for everything after 10 mins
interval_lengths += [i for i in range(660, df_samples['seconds_since_pedaling_start'].apply(
    lambda x: int(math.ceil(x / 10.0)) * 10).max() + 1, 60)]

intervals = df_samples.sort_index(ascending=True)
intervals['power'] = intervals['power'].interpolate()  # Used to fill in missing gaps in data
latest_df = intervals[intervals['workoutId'] == intervals.loc[intervals.index.max]['workoutId']]
latest_df_length = latest_df['seconds_since_pedaling_start'].max()

best_interval_df_list = []
latest_interval_df_list = []
for i in interval_lengths:
    # Get interals for all time
    temp_df = intervals
    temp_df['best_power'] = intervals.groupby(['workoutId'])['power'].rolling(int(i),
                                                                              min_periods=i - 1).mean().reset_index(
        0,
        drop=True)
    temp_df['interval'] = i
    # Append list with best power record for given interval
    best_interval_df_list.append(temp_df.loc[temp_df['best_power'].idxmax()])

    # Don't insert intervals for periods longer than the latest workout
    if i <= latest_df_length:
        latest_temp_df = latest_df
        latest_temp_df['best_power'] = latest_df.groupby(['workoutId'])['power'].rolling(int(i),
                                                                                         min_periods=i - 1).mean().reset_index(
            0, drop=True)
        latest_temp_df['interval'] = i
        # Append list with best power record for given interval
        latest_interval_df_list.append(latest_temp_df.loc[latest_temp_df['best_power'].idxmax()])

# Merge lists of series into df
latest_interval_df = pd.DataFrame(latest_interval_df_list)
best_interval_df = pd.DataFrame(best_interval_df_list)

best_interval_df['datetime'] = best_interval_df.index
best_interval_df = best_interval_df.set_index('interval')
latest_interval_df['datetime'] = latest_interval_df.index
latest_interval_df = latest_interval_df.set_index('interval')