我正在编写脚本,用于根据bechmarks结果数据绘制数十个图形。我的原始数据格式如下:
"Benchmark","Mode","Threads","Samples","Score","Score Error (99,9%)","Unit","Param: times"
"package.filtering.first.ReactorFirst.singleFirst","avgt",1,5,"0,000154","0,000011","ms/op",1
"package.filtering.first.ReactorFirst.singleFirst","avgt",1,5,"0,000150","0,000016","ms/op",1000
...
"package.filtering.r.ReactorFirst.singleFirst:+forced-gc-mem.<type>.<subtype>","avgt",1,5,"0,000162","0,000039","ms/op",10000000
...
其中过滤(模块),第一个(操作员),反应堆(解决方案),单个(方法)是创建基准的每种基准的属性。这种层次结构对我很重要,因为我的意图是基于整个module
级别,operator
级别共享的模块中的某些solution
等应用不同的绘图策略,等等。
我决定尝试使用正则表达式从基准名称列中提取上述信息,并使用MultiIndex结构:
times score benchmark error
module operator solution method
conditional asdda2s Reactor single [10000000] [0,000162] package.conditional.asdda2s.ReactorFirst.singl... [0,000039]
asddas Reactor single [10000000] [0,000162] package.conditional.asddas.ReactorFirst.single... [0,000039]
filtering first Reactor single [1, 1000, 1000000, 10000000] [0,000154, 0,000150, 0,000153, 0,000162] [] [0,000011, 0,000016, 0,000025, 0,000039]
first4 Reactor single [10000000] [0,000162] package.filtering.first4.ReactorFirst.singleFirst [0,000039]
df = pd.read_csv(..., delimiter=',')
df.columns = ['benchmark', 'mode', 'threads', 'samples', 'score', 'error', 'unit', 'times']
byModule = df.benchmark.str.extract(moduleRegex, expand=False).rename('module')
byOperator = df.benchmark.str.extract(operatorRegex, expand=False).rename('operator')
bySolution = df.benchmark.str.extract(solutionRegex, expand=False).rename('solution')
byMethod = df.benchmark.str.extract(methodRegex, expand=False).rename('method')
aggregator = {
'benchmark': lambda x: x,
'score': lambda x: x.tolist(),
'error': lambda x: x.tolist(),
'times': lambda x: x.tolist(),
}
multiGrouped = df.groupby(by=[byModule, byOperator, bySolution, byMethod])['benchmark', 'score', 'error', 'times'].agg(aggregator)
modules = multiGrouped.index.unique(level='module').values
for module in modules:
moduleGroup = multiGrouped.loc[module]
operators = moduleGroup.index.unique(level='operator').values
for operator in operators:
operatorGroup = moduleGroup.loc[operator]
methods = operatorGroup.index.unique(level='method').values
print operatorGroup
# plotting...
基于这些因素的分组使我可以将结果汇总为单行(由于不同的Param: times
而导致多个结果),并使用toList()
来计算得分/错误/时间参数
但是结果有些变化。每个(module, operator, solution, method)
都会有多个新行匹配,每行描述此基准测试的不同内存指标。
它的名称(类型/子类型)是唯一的,因此在这种情况下正则表达式也可能起作用。我的问题是如何以相同的聚合metricType/SubtypeError
将这些行中的转置/透视图(分数,错误,参数)到用类似score
(和toList()
等类似)描述的新列中。分数/错误的情况与原始案例一样。
有可能吗?我对python没有太多经验,但是在pandas库中发现它有点困难。
谢谢