我想让用户操纵一个(不是很大的,~800个数据行)数据集合,并让他们像在Excel上那样应用过滤器/排序。
我正在从csv读取数据,具有以下结构
Program | Mesh | Degree | Proc | Min | Max | Average | Status
-------------------------------------------------------------
'prog1' | 4x4x4| 2x2x2 | 2x1x1| 3.52| 3.8 | 3.72 | 'ok'
'prog2' | 8x4x4| 2x2x2 | 2x2x1| 3.60| 3.9 | 3.80 | 'Warning...'
假设我已经过滤了我的列表,我需要按'Proc'排序,我该怎么做? proc列实际上是类似枚举值的“字符串”
'1x1x1' < '2x1x1' < '2x2x1' < ... < '64x64x64' (powers of 2)
没有那么多“枚举”值,但我仍然觉得没有切换......我想也许我实际上可以将它们转换为整数(通过执行乘法),但后来我失去了“标签“(在我的图表中,我想显示”axbxc“)
我的首要目标是定义一个顶级函数“sort_data”,其中一个可以提供任意数量的列标题作为参数,程序应该相应地排序
例如
sort_data('proc') # => Sort data per Proc column (axbxc values)
sort_data('proc', 'mesh') # => Sort data per proc and then by mesh (axbxc)
由于数据集不是很大而且非实时计算,我更倾向于使用可读解决方案而不是效率(性能明智)
编辑:对于过滤,我有类似的东西
def filter_program:
self.filtered = [sample for sample in self.data_pointer if sample.program == program]
# similar for all columns, except the `if` clause gets more complicated
# (I have the code, no problem on those ones)
def filter(self, filter_dict):
"""Execute several filters."""
for header, value in filter_dict.iteritems():
if header in self.headers():
getattr(self, 'filter_'+header)(value)
self.active_filters[header] = value
else:
print('ERROR : unknown filter ' + column + ' (previous filters applied)')
return self.filtered
编写过滤器方法很简单,因为我们可以一个接一个地应用过滤器。对于排序它有点复杂,因为我们想要将一个元组传递给sort方法(按元组[0]然后按元组[1] ...排序),并且那些排序函数需要能够对维度进行排序' 1x1x1'等。)
def sort(self, sort_dict):
for header, value in sort_dict.iteritems():
if !(header in self.headers()):
# error
return
self.sorted = sorted(self.filtered, key=lambda row: (### ??? ###)
排序key lambda
的代码必须是一个元组,它考虑了sort_dict的所有排序标准。如果我想按最小/平均排序,我会做
# sort_order = ['min', 'max']
sorted(self.filtered, key=lambda row: (float(row.min), float(row.max))
示例用法是:
sort_order([
'mesh' # 1x1x1 then 2x1x1 then 2x2x1 ...
'program' # 'alphabetical': prog1 then prog2 ...
})