Условие оценки Python Numpy - используйте @ like pd.query - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь переделать свой код и максимально векторизовать его.

Я бы хотел использовать ту же функцию, которая используется в panda.query для замены строки, за которой следует @, с переменной.

Я пытался заглянуть в исходный код panda.query, но не нашел способа найти функцию и использовать ту же логику.

Если бы у вас были какие-то подробности об этом или вы могли бы помочь мне определить, где происходит это преобразование, это было бы полезно?

В моем примере у меня есть массив строк, подобный этому:

PricingArray = np.array([
"@Tariff == 'T2'",
"@Tariff in ['T1','T2','T5']",
"@Tariff == 'T1' and @CustomerType == 'Tier1'"
])

У меня также есть такие массивы:

TariffArray = np.array(['T2', 'T2', 'T2', 'T2', 'T3', 'T3'], dtype=object)

CustomerTypeArray == np.array(['Tier1', 'Tier2', 'Tier2', 'Tier3', 'VIP', 'B2C'], dtype=object)

Мои массивы TariffArray и CustomerTypeArrays имеют одинаковое измерение, которое может составлять пару тысяч.

Теперь у меня есть что-то вроде этого

MyDict = {'Tariff' : TariffArray, 'CustomerType' : CustomerTypeArray}

Я хотел бы перебрать мой PricingArray, заменить каждое слово, которому предшествует @, его переменный эквивалент в MyDict, и использовать всю строку в np.nonzero (Condition)

Как бы я это сделал?

Я пытался сделать следующее, но, к сожалению, это не работает

Если я получу возврат по ComputeString, он тоже не будет работать

Я хотел бы добавить полученный массив в dict по индексу

def ComputeString(String):
        return re.sub("@(\w+)", lambda m : str(MyDict[m.group(1)]),
                          String)
Output = {}
for i, Criteria in enumerate(PricingArray):
    Output[i] = np.nonzero(ComputeString(Criteria, MyDict))

Бонусный вопрос: Как мне также сделать, чтобы удалить условие for for и заменить его, используя функции массива, тоже здесь борясь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...