Создание динамического запроса с использованием функции Python Reduce? - PullRequest
0 голосов
/ 06 мая 2019

В настоящее время приведенный ниже код динамически создает запрос как: -

код:

zip_cols = list(zip(['name','address'],
                    ['name_1','address_1']))


self.matches = self.features[
                            (
                                [
                                    reduce(
                                        lambda x, y: x + y,
                                        [self.features[a + "_" + c[0] + "_" + c[1]] for a in self._algos],
                                    )
                                    for c in zip_cols
                                ][0]
                                > (self.input_args.get('threshold', 0.7) * 4)
                            )
                            & (
                                [
                                    reduce(
                                        lambda x, y: x + y,
                                        [self.features[a + "_" + c[0] + "_" + c[1]] for a in self._algos],
                                    )
                                    for c in zip_cols
                                ][1]
                                > (self.input_args.get('threshold', 0.7) * 4)
                            )].copy()

запрос:

matches = features[(
                    (
                       (features['fw_name_name_1'] / 100)  
                      + features['sw_name_name_1']
                      + features['jw_name_name_1']
                      + features['co_name_name_1']
                    )  > 2.8
                   ) 
                   & 
                    (
                       (
                        (features['fw_address_address_1'] / 100)  
                      + features['sw_address_address_1']
                      + features['jw_address_address_1']
                      + features['co_address_address_1']
                       ) > 2.8
                    )
           ].copy()

, но этот запрос работает, если есть2 столбца в source_compare_names и терпит неудачу для 1 или более 2. Как мы можем это исправить здесь?

1 Ответ

0 голосов
/ 06 мая 2019

С минимальным вводом и контекстом, которые я получил, это должно помочь вам начать. Идея состоит в том, что вы динамически выстраиваете критерии фильтра в виде строки, объединяете их и оцениваете их.


threshold = self.input_args.get('threshold', 0.7) * 4
column_selection = [reduce(lambda x, y: x + y,
                           [self.features[a + "_" + c[0] + "_" + c[1]] for a in self._algos]) for c in zip_cols]

size = 10 # number of items you need 
total_filter_list = []
for i in range(size):
    # build the filter columns as list of strings
    total_filter_list.append(f'(column_selection[{i}] > {threshold})') 

# join the list of strings with '&', build the total filter criteria as string
total_filter_string = ' & '.join(total_filter_list)

# evaluate the filter
self.features[eval(total_filter_string)]
...