Как я могу векторизовать функцию, если один параметр является фреймом данных, который не должен быть векторизован? - PullRequest
0 голосов
/ 03 февраля 2020

Мне нужно векторизовать функции, манипулирующие панорамирования данных или сериями, чтобы уменьшить время обработки.

Проблема в том, что некоторые параметры векторизованной функции не должны быть векторизованы.

Давайте посмотрим Пример со следующим кодом. Я создаю серию, которая будет обрабатываться как вектор.

Values = pd.DataFrame(np.random.uniform(0, 1, size=(3, 1)), columns=['V'], index = ['mean', 'std', 'delta'])
Values
        V
mean    0.885185
std     0.262265
delta   0.790134

Затем у меня есть модель, она связана со значениями столбцами 'cpt', но совсем не имеет той же формы .

Model = pd.DataFrame([['JAVA','mean',10],['Python','std',5],['JS','sqrt',6],['JAVA','dif',3]],
                  columns = ['Language', 'cpt' , 'Id'])
Model
    Language    cpt     Id
0   JAVA        mean    10
1   Python      std     5
2   JS          sqrt    6
3   JAVA        dif     3

Мне нужно найти Id, соответствующий в модели cpt для каждого значения. Я пишу функцию так, как будто я могу векторизовать ее.

def findId(Values, Model):
    return (Model[Model.cpt == Values].Id.values)

Выход функции будет

ValueError: Lengths must match to compare 

, поскольку параметр Model также векторизован.

Как я могу сделать, чтобы передать параметр 'Model' в функцию и что он не будет считаться параметром того же размера?

Я мог бы написать al oop как этот, но это первоначальная проблема I ' Я пытаюсь решить:

def loopfindId(Values, Model):
    ScaleNbrs = []
    for i in range (len(Values)):
        ScaleNbrs.append(findId(Values.index[i], Model))
    return ScaleNbrs
loopfindId(Values, Model)
[array([10], dtype=int64), array([5], dtype=int64), array([], dtype=int64)]

Однако, даже если я получаю почти желаемый результат, он очень медленный, потому что мне приходится многократно обрабатывать этот алгоритм в алгоритме, и он должен обрабатывать это миллион раз.

Я не уверен на 100% в желаемых результатах этого шага, но после получения идентификатора для каждого значения мне придется проверить, находится ли значение в строке таблицы, в зависимости от на Id. DataFrame Id будет выглядеть следующим образом:

Scale = pd.DataFrame([['LevelA', 0, 0.3, 10],['LevelB', 0.3, 1, 10],
                      ['LevelA', 0, 0.2, 3],['LevelB', 0.2, 0.6, 3],['LevelC', 0.6, 1, 3]],
                  columns = ['Level', 'lowerBound', 'upperBound', 'Id'])
      Level     lowerBound  upperBound  Id
0     LevelA    0.0         0.3         10
1     LevelB    0.3         1.0         10
2     LevelA    0.0         0.2         3
3     LevelB    0.2         0.6         3
4     LevelC    0.6         1.0         3

Затем мне нужно знать, на каком уровне находится Значение, а также другую информацию о строке и ее положении соответственно другим доступным уровням. В масштабе данных. Вот почему я хотел бы представить DataFrame в качестве параметра функции, но у него может быть лучший способ сделать это.

1 Ответ

0 голосов
/ 03 февраля 2020

Вы не предоставили ожидаемый результат, но на основании того, что вы написали, я думаю, что слияние индекса - это то, что вам нужно

Model.set_index('cpt').merge(Values, left_index=True, right_index=True)

     Language  Id         V
mean     JAVA  10  0.754550
std    Python   5  0.931809

Поиск isin может также работать, если слияние требует слишком много память

Model.loc[Model['cpt'].isin(Values.index)]

  Language   cpt  Id
0     JAVA  mean  10
1   Python   std   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...