Как векторизовать несколько условий в пандах - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь это сделать в python 3.5.2 и pandas 0.18.1

Ниже приведены мои примеры данных

    %busy   %queue
1   50      3.0
2   80      2.0
3   90      3.0
4   90      3.0
5   90      3.0
6   30      1.1
7   45      1.3
8   55      1.5
9   65      1.7

Ниже приведен мой код

import pandas as pd
df = pd.read_csv('cpu.csv')
total_row = df.shape[0]
for i in range(0, total_row):
  if df['busy'].iloc[i:i+3] >90 & df['queue'].iloc[i:i+3] => 3:
       print("High usage observed")
       break 
  else:
      continue

Выходные данные должны быть:

условие if должно оценивать True или False, если оно истинно, print («Наблюдается большое использование»)

Примечание. Цикл IF становится TRUE только во время значенияi = 2, от i = 2 до i = 4,% занятости больше 90 и% очереди равно 3, поэтому условие должно удовлетворяться, и оператор print выполняется

Я ожидаю, чтооператор df ['busy']. iloc [i: i + 3]> 90, должен давать либо True, либо False. Аналогично, второй оператор df ['queue']. ​​iloc [i: i + 3]> 3, должен быть Trueили False

наконец, цикл if должен быть похож на True & True, чем необходимо выполнить оператор внутри циклов

Но в настоящее время я получаю ошибку, как показано ниже. ValueError: Истинное значение Series являетсянеоднозначный.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Похоже, вы пытаетесь выполнить операцию roll .Для этого вы можете использовать функцию rolling(), которая встроена в панды Series объекты.

Возьмите пример:

df["status_busy"] = (df[::-1].busy.rolling(3).apply(lambda b: all(b >= 90))[::-1] *\
                     df[::-1].queue.rolling(3).apply(lambda q: all(q >= 3))[::-1]).fillna(0).astype(bool)



    busy    queue   status_busy
1   50  3.0         False
2   80  2.0         False
3   90  3.0         True
4   90  3.0         False
5   90  3.0         False
6   30  1.1         False
7   45  1.3         False
8   55  1.5         False
9   65  1.7         False

Я инвертировал значения с помощью [::-1] всделать прогнозную скользящую операцию.По умолчанию задом наперед и для этого просто удалите [::-1]

0 голосов
/ 28 мая 2018

Вы должны использовать векторизованные вычисления для этой задачи.

Вот пример использования np.minimum и pd.Series.shift:

b = df['%busy']
q = df['%queue']

mask1 = np.minimum.reduce((b, b.shift(-1), b.shift(-2))) >= 90
mask2 = np.minimum.reduce((q, q.shift(-1), q.shift(-2))) >= 3

df['high_usage_marker'] = mask1 & mask2

print(df)

   %busy  %queue  high_usage_marker
1     50     3.0              False
2     80     2.0              False
3     90     3.0               True
4     90     3.0              False
5     90     3.0              False
6     30     1.1              False
7     45     1.3              False
8     55     1.5              False
9     65     1.7              False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...