Условно создать новый столбец в фрейме данных

обновленный вопрос

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

@app.route("/sortbymax")
def sortbymax():
    df = updated_data()
    #### here i want to use most recently created column
    df = create_links(df)
    df = df.sort_values(by=['perc_change'], ascending=False)
    return render_template('sortbymax.html',tables=[df.to_html(escape = False)], titles=df.columns.values)


def read_data():
    filename = r'c:\Users\91956\Desktop\bk.xlsm'
    df = pd.read_excel(filename)    
    return df


def updated_data():
    df = read_data()
    for i in range(288): 
        temp = read_data()
        x=datetime.datetime.now().strftime("%H:%M:%S")
        df['perc_change_'+x] = temp['perc_change']
        time.sleep(300)
    return df

Когда вы говорите, что «эти ценности постоянно меняются», как они меняются и где берутся новые ценности?

IoaTzimas 15.12.2020 13:32

я имею в виду значения в столбце за последние 5 минут

user4599 15.12.2020 13:34

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

user4599 15.12.2020 13:36

Можете ли вы описать свои данные подробнее? У вас есть исходный столбец и множество других столбцов, представляющих perc_change, которые происходят каждые 5 минут. Это правильно? Мой вопрос: откуда вы берете эти значения? Это API или что-то в этом роде? Как узнать новые значения? И, наконец, относительно вашего вопроса: вы хотите, чтобы новые столбцы включали только значения, которые изменились, а те, которые не изменились, были пустыми?

IoaTzimas 15.12.2020 13:37

Итак, столбец per_change постоянно обновляется по какому-то алгоритму, и вы хотите сохранять «изображения» этого столбца каждые 5 минут?

IoaTzimas 15.12.2020 13:38

Нет. Когда я читаю лист Excel, у него есть только один столбец perc_change. я хочу создавать новые столбцы каждые 5 минут. предположим, я начинаю читать данные в 10:00. в 10:05 должен быть добавлен новый столбец в фрейме данных, который будет содержать значения perc_change в 10:05. снова в 10:10 должны быть сгенерированы новые столбцы, которые будут содержать значения perc_change в 10:10 и так далее.

user4599 15.12.2020 13:41

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

user4599 15.12.2020 13:42

мне не нужны картинки, они показаны только для того, чтобы объяснить вопрос, я хочу, чтобы столбцы генерировались в фрейме данных

user4599 15.12.2020 13:46

Под «изображениями» я подразумеваю копию столбца. Не беспокойтесь, я понял проблему, взгляните на мое предложение и дайте мне знать, если оно сработает.

IoaTzimas 15.12.2020 13:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
9
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу, у вас есть файл .xlsm, что означает, что в Excel включен макрос. Я думаю, вы можете его прочитать, но если вы хотите изменить его с помощью Python, вы, скорее всего, потеряете часть макроса в своем Excel.

Для части питона: это будет копировать столбец perc_change каждые 5 минут с соответствующим именем. Однако имейте в виду, что это будет работать только в течение одного дня (после этого он заменит существующие столбцы). Если вы хотите работать дольше, дайте мне знать, чтобы я добавил день-месяц-год (все, что вы хотите) в имена столбцов.

import datetime
import time

def read_data():
    filename = r'c:\Users\91956\Desktop\bk.xlsm'
    df = pd.read_excel(filename)    
    return df

def write_data(df):
    filename = r'c:\Users\91956\Desktop\bk.xlsm'
    df.to_excel(filename)    
    
df = read_data() #read excel for first time

for i in range(288): #this will run for one day exactly
    temp = read_data()
    x=datetime.datetime.now().strftime("%H:%M")
    df['perc_change_'+x] = temp['perc_change']
    time.sleep(300)

нет. один день в порядке, спасибо за помощь, проверю завтра, когда начнется прямая трансляция, и дам вам знать. еще раз спасибо

user4599 15.12.2020 13:55

поскольку существует бесконечный цикл, я должен сохранить этот код и фрейм данных в каком-то другом файле python и оттуда получить к нему доступ в main.py, я создаю приложение фляги.

user4599 15.12.2020 14:01

Я бы предложил запустить его отдельно, не нужно быть частью приложения фляги. Если вы хотите, мы можем добавить счетчик в цикл while, чтобы он выполнялся x раз (например, 288 за один день).

IoaTzimas 15.12.2020 14:04

создание столбцов в фрейме данных служит только цели, нет необходимости записывать данные для превосходства

user4599 15.12.2020 15:07

Даже если вы не хотите записывать данные в Excel, вы все равно должны читать файл Excel на каждой итерации, чтобы получить новые значения. В этом случае вы должны использовать отдельный фрейм данных, один для чтения excel, а другой для добавления дополнительных столбцов за 5 минут.

IoaTzimas 15.12.2020 15:11

да, это правда, нужно читать excel на каждой итерации. я попытался запустить код ниже, в идеале он должен создать три новых столбца, верно? но для i в диапазоне (3) создается только один новый столбец: df = read_data() x=datetime.datetime.now().strftime("%H:%M:%S") df['perc_change_'+x ] = df['perc_change'] # write_data(df) time.sleep(5) print(df) почему так?

user4599 15.12.2020 15:17

Действительно странно. Можете ли вы добавить print(x) после x=datetime...etc и посмотреть, что будет напечатано? Все 3 x разные?

IoaTzimas 15.12.2020 15:22

три разных значения x 19:53:55 19:54:00 19:54:05, но столбец все равно создается только для последнего значения

user4599 15.12.2020 15:24

даже пробовал печатать df до того, как time.sleep(5) создается только последний столбец значений x

user4599 15.12.2020 15:29

Это происходит потому, что мы читаем данные на каждой итерации. Я обновил код. Теперь он считывает данные в первый раз, сохраняет их в df, и на каждой итерации мы используем временный фрейм данных, чтобы снова прочитать excel и обновить df. Пожалуйста, попробуйте еще раз и дайте мне знать

IoaTzimas 15.12.2020 15:32

да я тоже так думал, реализовал и прочитал комментарий, работает.

user4599 15.12.2020 15:41

Давайте продолжим обсуждение в чате.

user4599 15.12.2020 17:01

Другие вопросы по теме