Обновление dataframe в Python внутри цикла While - PullRequest
1 голос
/ 14 октября 2019

У меня есть фрейм данных, который извлекает данные из SQL и отправляет электронное письмо в зависимости от состояния столбца. Но эти столбцы отсутствуют в SQL, мне нужно создать их после создания фрейма данных. Проблема здесь в том, что у меня есть цикл while, где он проверяет состояние столбца каждые 10 секунд. Я заметил, что цикл while отлично работает со всеми условиями, но фрейм данных не обновляется из SQL, поскольку он находится вне цикла while. Если я помещаю фрейм данных в цикл while, last_email_sent инициализируется как None и выдает неправильный вывод. Ниже мой псевдокод, в котором описана логика.

#initialisation and fetching of the table from SQL
df = pd.read_sql('SELECT * FROM stations', cnxn)
df['Timeflag'] = now - df['last_reported']
df['last_email_sent'] = None

while True:
   for index in df.index:
       if(df['Timeflag'] == 1 and df.loc[df.index[index], "Last_email_sent"] is None:
            print('pass')
            minutes = divmod((now - df.loc[index, "Last_email_sent"]).total_seconds(), 60)[0]

       elif df.loc[index, 'Time flag'] == 1 and minutes < min:
            print('fail')
            minutes = divmod((now - df.loc[index, "Last_email_sent"]).total_seconds(), 60)[0]
               else:
        print('false')
time.sleep(10)  

Проблема в том, что я не могу сделать что-то подобное ниже, поскольку внутри цикла for last_email_sent не может быть None, и он должен сохранятьпоследнее обновленное значение, которое было распространено после 1-й итерации цикла while.

while True:
    #initialisation and fetching of the table from SQL
    df = pd.read_sql('SELECT * FROM stations', cnxn)
    df['Timeflag'] = now - df['last_reported']
    df['last_email_sent'] = None

Есть ли какой-либо другой метод для вызова фрейма данных внутри цикла for и, таким образом, одновременного вычисления других столбцов?

1 Ответ

0 голосов
/ 14 октября 2019

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

First_Start = True  # first time we define db colum to None
Last_Email_Sent = None  # when we sent the last email

while True:

    # read data from db heare and do what you need
    df = pd.read_sql('SELECT * FROM stations', cnxn)
    df['Timeflag'] = now - df['last_reported']
    if First_Start:
        df['last_email_sent'] = None
        First_Start = False  # never again will be True
    else:
        df['last_email_sent'] = Last_Email_Sent

    while True:
       for index in df.index:  # cheack all you want in df
           if(df['Timeflag'] == 1 and df.loc[df.index[index], "Last_email_sent"] is None:
                print('pass')
                minutes = divmod((now - df.loc[index, "Last_email_sent"]).total_seconds(), 60)[0]

           elif df.loc[index, 'Time flag'] == 1 and minutes < min:
                print('fail')
                minutes = divmod((now - df.loc[index, "Last_email_sent"]).total_seconds(), 60)[0]
            else:
                print('false')

        Last_Email_Sent  = ??? # define new value here!
        break # all work is done and you go out of the while loop
    time.sleep(10)

    # now you can apply to db again to get a new df

Надеюсь, что ответ был полезен длявы.

...