使用Python pandas DataFrame计算CSV文件中魔方成绩的滑动剪枝平均值
基于pandas的魔方还原时长滑动剪枝平均值计算实现
前置说明
你的CSV文件需包含至少1列存储魔方还原时长的浮点数据,示例CSV结构如下:
id,time 1,8.32 2,7.95 3,9.11 4,8.56 ...
完整实现代码
import pandas as pd # 自定义剪枝规则配置:{窗口大小: (剪掉的最优数量, 剪掉的最差数量)} default_trim_config = { 5: (1, 1), 12: (1, 1), 25: (2, 2), 50: (2, 3) } def calc_trimmed_mean(window_data, trim_low: int, trim_high: int): """计算单窗口的剪枝平均值""" sorted_data = sorted(window_data.dropna()) # 数据量不足剪枝要求时直接返回原始平均 if len(sorted_data) <= trim_low + trim_high: return sum(sorted_data)/len(sorted_data) # 剪掉首尾指定数量的成绩后求平均 trimmed_data = sorted_data[trim_low : len(sorted_data)-trim_high] return round(sum(trimmed_data)/len(trimmed_data), 3) if __name__ == "__main__": # -------------------------- 可修改配置项 -------------------------- csv_path = "cube_times.csv" # 替换为你的CSV文件路径 time_col = "time" # CSV中存储时长的列名 window_size = 5 # 滑动窗口大小,支持5/12/25/50或自定义数值 # 如需自定义剪枝数量,直接修改下面两个参数,默认会自动匹配上面的规则 trim_low = None trim_high = None # ------------------------------------------------------------------- # 读取CSV数据 df = pd.read_csv(csv_path) time_series = df[time_col] # 校验数据量 if len(time_series) < window_size: print(f"错误:数据总条数({len(time_series)})小于窗口大小({window_size}),无法计算滑动平均") exit() # 匹配剪枝规则 if trim_low is None or trim_high is None: trim_low, trim_high = default_trim_config.get(window_size, (0, 0)) print(f"自动匹配剪枝规则:窗口大小{window_size},剪掉{trim_low}个最优、{trim_high}个最差成绩") # 计算滑动剪枝平均值 rolling_trimmed_mean = time_series.rolling(window=window_size).apply( lambda x: calc_trimmed_mean(x, trim_low, trim_high) ) # 去掉前面窗口不足的空值 result_list = rolling_trimmed_mean.dropna().tolist() # 找最优平均值(魔方还原时间越短越好,所以取最小值) best_mean = min(result_list) # 输出结果 print("\n所有滑动剪枝平均值如下:") for idx, val in enumerate(result_list, 1): mark = " * 最优平均" if val == best_mean else "" print(f"窗口{idx}:{val}{mark}") print(f"\n全局最优剪枝平均值:{best_mean}")
使用说明
- 默认剪枝规则可直接修改
default_trim_config字典调整,也可以直接给trim_low和trim_high赋值,覆盖自动匹配的规则 - 窗口大小可自由修改,未在默认规则中配置的窗口大小默认不会剪枝,可手动指定剪枝数量
- 输出结果会自动标记所有等于最优值的窗口结果,最后单独输出全局最优平均值
内容的提问来源于stack exchange,提问作者Gauthier C.
相关产品推荐
相关产品推荐

