我有一个csv文件,其中保存了一些基准测试结果。我想用python3和pandas处理它,以获得最佳和均值并将它们分类。 csv文件具有以下结构:
N many ffts,OpenMP Threads,MPI Tasks,Wall Time,fftw
2,2,16,2.835,2.55
4,16,32,7.8246,7.61
18,32,64,11.198,11.0
4,8,64,10.76,10.6
32,16,8,1.808,1.32
10,2,64,1.2884,1.21
14,2,64,1.1992,1.13
14,16,16,1.667,1.29
20,16,32,3.0271,2.88
6,32,32,11.63,11.2
20,1,128,1.2584,1.18
4,16,8,5.0242,4.29
2,4,128,8.6859,8.56
2,16,64,29.043,28.9
6,4,16,3.6128,3.29
14,32,64,13.215,13.0
1)我评估所有具有相同的前三个元素(N个fft,OpenMP线程,MPI任务)的所有行的平均值,然后使用以下命令对列重新排序:
reader = pandas.read_csv(csv_log).groupby(['MPI Tasks', 'OpenMP Threads', pattern]).mean()
2)我还将获得最后两列的最小值和最大值。如何指定哪一列的最小值(通常,如果第四列是最小值,则同一行在最后一列也有最小值,但是我想确定这一点,因此我想首先指定第四列和第五列的最小值之后-但我希望将所有列都打印出来!)。我尝试过
reader = pandas.read_csv(csv_log).groupby(['MPI Tasks', 'OpenMP Threads', pattern]).min()
它行得通,但是我无法控制哪一列(如果是第四列或第五列)具有最小值。
3)我将以这种方式分析最小值:假设作为最后一步的结果的最小文件为:
MPI Tasks,OpenMP Threads,N many ffts,Wall Time,fftw
8,1,2,5.8825,5.42
8,1,4,5.8238,5.42
8,1,6,5.8082,5.41
8,1,8,5.7999,5.42
8,2,2,5.1886,4.57
8,2,4,5.0984,4.54
8,2,6,5.0674,4.52
8,2,8,5.0427,4.5
8,4,2,9.3574,8.57
8,4,4,5.3263,4.61
8,4,6,6.562,5.85
8,4,8,5.2726,4.58
16,1,2,3.0077,2.78
16,1,4,2.9718,2.76
16,1,6,2.9656,2.76
16,1,8,2.9538,2.76
16,2,2,2.8711,2.58
16,2,4,2.8274,2.56
16,2,6,2.798,2.54
16,2,8,2.7631,2.51
16,4,2,5.0885,4.73
16,4,4,2.9977,2.66
16,4,6,3.6192,3.3
16,4,8,2.9571,2.64
3a)我将获得另一个文件,其中该行的最小值具有相同的前两个元素,以便获得:
8,1,6,5.8082,5.41
8,2,8,5.0427,4.5
8,4,8,5.2726,4.58
16,1,8,2.9538,2.76
16,2,8,2.7631,2.51
16,4,8,2.9571,2.64
我该怎么办? 3b)我将获得另一个文件,其中具有与第一个元素相同的行的最小值:
8,2,8,5.0427,4.5
16,2,8,2.7631,2.51
3c)的最后一步是拥有一个性能最佳的文件,例如:
16,2,8,2.7631,2.51
现在:我尝试将groupby()。min()串联起来,但是它有一个很大的问题:当我串联groupby时,我没有得到所有列的打印件,而是想。你能帮我吗?
此刻,我使用了以下python代码
for csv_log in glob.glob('*.csv*'):
fname = os.path.splitext(os.path.basename(csv_log))[0]
if 'ntg' in fname:
pattern = 'N task groups'
else:
pattern = 'N many ffts'
reader = pandas.read_csv(csv_log).groupby(['MPI Tasks', 'OpenMP Threads', pattern]).mean()
reader.to_csv('{}_mean.csv'.format(fname))
reader = pandas.read_csv(csv_log).groupby(['MPI Tasks', 'OpenMP Threads', pattern]).min()
reader.to_csv('{}_min.csv'.format(fname))
reader = reader.groupby(['MPI Tasks', 'OpenMP Threads']).min()
reader.to_csv('{}_min_mpi+openmp.csv'.format(fname))
reader = reader.groupby(['MPI Tasks']).min()
reader.to_csv('{}_min_mpi.csv'.format(fname))
reader = reader.min()
reader.to_csv('{}_min_absolute.csv'.format(fname))
但是我在步骤2(我将两个最小值分开,一个用于第四和第五个)中没有成功,在步骤3(a,b,c:无论如何我都将打印所有列,但是我分别只有4、3和2)。