如何过滤任意结果的查询?

Posted

技术标签:

【中文标题】如何过滤任意结果的查询?【英文标题】:How to filter a query for arbitrary results? 【发布时间】:2019-09-09 16:54:49 【问题描述】:

我正在编写一个数据分析程序。为了对结果进行分组,我编写了这些函数:

def prepare_data(sample_list, group_option):
    if group_option == None:
        group_parameter = None
    elif group_option == 'sample':
        group_parameter = sample_parameters.sample
    elif group_option == 'parameter':
        group_parameter = (sample_parameters.speed, sample_parameters.gap, sample_parameters.temperature, sample_parameters.volume)

此函数确定如何对我的不同样本进行分组以供以后计算。这应该是唯一可以输入关于分组的地方。

def group_data(sample_list, group_parameter):
    query = session.query(sample_measurements_raw.data, group_parameter).filter(sample_parameters.idsample_parameters == sample_measurements_raw.sample_id).filter(sample_parameters.useless == 0).filter(sample_parameters.sample.in_(sample_list)).group_by(group_parameter)

    data_table = pandas.DataFrame()

    for row in query:
        data_table = pandas.concat([data_table, (calculate_data(sample_list, row.keys))[-1:-2]], axis = 'columns', join = 'outer')

    return data_table

此函数获取样本列表和组参数(由 orm.attributes 组成)。它在该列表中搜索具有相同参数的样本并将它们分组。然后它遍历所有传递给另一个函数的唯一参数集:

def calculate_data(sample_list, parameter):
    query = session.query(sample_measurements_raw.data).filter(sample_parameters.idsample_parameters == sample_measurements_raw.sample_id).filter(sample_parameters.useless == 0).filter(sample_parameters.sample.in_(sample_list)).filter(parameter)

    data_table = pandas.DataFrame()

    for row in query:
        data_table = pandas.concat([data_table, pandas.read_json(row.data, orient = 'split').set_index('nm').rename(columns = " %T": parameter)], axis = 'columns', join = 'outer')

    data_table[parameter + '_mean'] = data_table.mean(axis = 1)
    data_table[parameter + '_std'] = data_table[data_table.columns[0:-1]].std(axis = 1)

    return data_table

问题从这里开始。该函数应该获取唯一组的参数并执行过滤器以获取与该组的确切参数匹配的所有数据。请记住,提供的参数数量可能会发生变化。

问题:

如何过滤我从group_data 获得的那些参数?

希望我的问题可以理解并感谢您的帮助!

编辑:

一个具体的例子是:

开始的列表如下所示: table

表格还在扩展中,所以我想在第一个函数中编辑group_parameter。其他一切都应该从中派生。

    group_parameter 对数据进行分组并创建列表。该列表由带有成员语句的row 对象组成(例如row.speedrow.gap)。语句的数量和名称取决于group_parameters。 遍历列表并获取值与列表条目的值完全匹配的所有数据。因此表达式应该看起来像这样:.filter(sample_parameters.speed == row.speed, sample_parameters.gap == row.gap)

问题:

如何从该列表中获取任意参数集(例如sample_parameters.speedsample_parameters.gap、...)并在下一个查询中按它们过滤?

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,则您提供的函数不是问题,但需要对第二个函数的输入格式进行预处理。那么,概括一下您的问题:如何从返回的数据表中动态查询更改的唯一值?

我可以 - 快速 - 考虑使用 df.Series.unique() 来解决您的问题。

#iterates through a list of unique df.Seriesvalues
for row in group_data.Parameters.unique: 
    # do something

但是,在性能方面应该存在优化潜力。有关 df.Series.unique() 的参数的更多信息, 见documentation

【讨论】:

不完全。也许一个更具体的例子会澄清它。请看原帖。

以上是关于如何过滤任意结果的查询?的主要内容,如果未能解决你的问题,请参考以下文章

数据库笔记-SQL过滤(LIKE&正则表达式)

Django:使用 Q 对象对任意数量的输入进行动态过滤(OR & AND)

如何根据任意条件函数过滤字典?

使用任意小数位数格式化 SQL 数值查询结果

如何使用 xslt 从 xml 文档中过滤掉任意节点

TypeScript 按任意类型过滤元组类型