Применение условия вложенного If к кадру данных - Python - PullRequest
0 голосов
/ 23 февраля 2020

Я подключаюсь к базе данных sql и генерирую фрейм данных со временем ожидания 5 минут в течение 2 часов с 4 до 6 часов утра и пытаюсь проверить статус задания, ниже приведены условия, которые я пытаюсь реализовать

проверить, выполняется ли какое-либо задание, и проверить, выполняется ли оно в течение расчетного времени. Если да, то распечатать («работает нормально в течение расчетного времени»), в противном случае распечатать («истекло ожидаемое время»)

еще проверить, если последнее задание завершено, затем печать («все задания завершены»)

Выход из l oop

Ниже приведены данные

enter image description here

i=0
while i <12:

    todays_run="select * from table where getdate()=startdate"  /*Checking for rundate as todays date*/
    result=pd.read_sql(todays_run,sql_conn)
    if result.empty:
        print(' No jobs are running  :')
    elif result[result.status=='RUNNING' and result.start_date <result.estimated_end]:
        print("Below  jobs are currently running with estimated time \n\n ",result)
    else print("Jobs taking long time",<job_name>)
    elsif result[result.status=='COMPLETED' and result.jobname='A']
        print("all jobs are completed \n \n ")
    time.sleep(60)
exit(1)

Я получаю сообщение об ошибке ValueError: Истинное значение Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Не могли бы вы помочь, если это возможно реализовать с помощью pthon

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Маска серии может помочь в этой ситуации. Каждое из ваших логических условий, примененное к каждой строке DataFrame, создает список / ряд значений True / False.

Затем вы можете получить доступ к строкам с помощью df.loc[mask] и преобразовать логические "и" в побитовую маску. «&» объединить маски. Я также хотел бы сказать mask.any() или mask.all() в зависимости от логического теста. Эти уловки помогают мне выполнить шаги, которые вы пытаетесь достичь.

Вот некоторые идеи, которые вы пытаетесь реализовать, преобразованные в маску серии.

for i in range(12):
    # Checking for rundate as todays date
    todays_run="select * from table where getdate()=startdate"
    result=pd.read_sql(todays_run,sql_conn)
    running_mask = result["status"] == 'RUNNING'
    completed_mask = result["status"] == 'COMPLETED'
    jobname_a_mask = result["jobname"] == 'A'
    estimated_mask = result["start_date"] < result["estimated_end"]
    if result.empty:
        print(' No jobs are running  :')
    elif (running_mask & estimated_mask).any():
        print("Below  jobs are currently running with estimated time \n\n ",
            result.loc[running_mask & estimated_mask])
    else (jobname_a_mask & completed_mask).all():
        print("all jobs are completed \n \n ")
    time.sleep(60)
exit(1)
1 голос
/ 23 февраля 2020

В ваших elif условиях вы, возможно, оцениваете несколько строк одновременно. Вот почему вы получаете эту ошибку. Если вам не важно, сколько строк соответствует вашему условию, вы можете попробовать:

elif (result[result.status=='RUNNING' and result.start_date <result.estimated_end]).any()

Или, если вам нужно, чтобы все строки соответствовали вашему условию, замените .any() на .all()

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