Я пытаюсь переделать свой код и максимально векторизовать его.
Я бы хотел использовать ту же функцию, которая используется в 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 и заменить его, используя функции массива, тоже здесь борясь