Как постоянно обновлять новые значения в фрейме данных pandas

#python #pandas #dataframe

Вопрос:

Я пытаюсь проверить изменение цен на все криптовалюты с интервалом в 15 минут. До сих пор мне удавалось получить все монеты, торгуемые с помощью пары USDT, получить процент изменения их цены и отсортировать их в порядке убывания. Теперь план состоит в том, чтобы подождать 15 минут, снова получить данные и сравнить их со старыми. Это будет происходить каждые 15 минут. (Например, допустим, я получил данные за 5.30, в 5.45 снова будут получены данные — будет произведено сравнение и выбрана самая волатильная монета. В 6.00 данные будут извлечены снова, теперь их нужно сравнить с данными 5.45 и так далее.)

Это то, что у меня есть до сих пор (это основано на библиотеке CCXT для python)Этот код работает для одноразовой выборки, все, что мне нужно,-это некоторые рекомендации по сравнению и хранению/обновлению новых значений.Должен ли я создать новый файл pricechange2 и продолжать сравнивать с ним или мне следует продолжать добавлять и удалять столбцы в фрейме данных?

 markets=exchange.fetchTickers()
with open('pricechange1.txt', 'w') as json_file:
    json.dump(markets, json_file)
with open('pricechange1.txt') as json_file:
    data = json.load(json_file)

symbol_list = [value['symbol'] for value in data.values()]

r = re.compile(".*/USDT")
filtered_list = list(filter(r.match, symbol_list))
fl = list([x for x in filtered_list if "DOWN" not in x and "UP" not in x and "BULL" not in x and "BEAR" not in x])
pp1 = []
for i in fl:
    pp = data[i]['info']['priceChangePercent']
    pp1.append(float(pp))
df = pd.DataFrame({'coinpair': fl})
df['change1'] = pp1
df = df.sort_values(by='change1', ascending=False)
print(df['coinpair'].head(10).iloc[0])
print(df.head(10))
 

Текущий вывод вышеуказанного кода

       coinpair  change1
90    FTT/USDT   29.677
48    FTM/USDT   24.615
246  TORN/USDT   24.508
259  MINA/USDT   23.265
156  YFII/USDT   20.739
37   CELR/USDT   18.435
179   INJ/USDT   17.601
207  FIRO/USDT   15.848
206   TWT/USDT   15.715
126  VTHO/USDT   15.634
 

Ответ №1:

Я бы рекомендовал поместить эти вещи в отдельные функции и использовать schedule библиотеку для их периодического запуска (в вашем случае каждые 15 минут). Прежде всего, вам нужно установить его с помощью:

 pip install schedule
 

Затем импортируйте его в свой скрипт:

 import schedule
import time
...
 

Теперь поместите все в отдельную функцию:

 markets = None
def fetch_data():
    global markets
    markets =  exchange.fetchTickers()
    return markets

def write_to_file(data):
    with open('pricechange1.txt', 'w') as json_file:
        json.dump(data, json_file)

previous_pp = None
def form_df(data, previous_pp):
    global previous_pp
    symbol_list = [value['symbol'] for value in data.values()]

    r = re.compile(".*/USDT")
    filtered_list = list(filter(r.match, symbol_list))
    fl = list([x for x in filtered_list if "DOWN" not in x and "UP" not in x and "BULL" not in x and "BEAR" not in x])
    pp1 = []
    
    for i in fl:
        if previous_pp:
            current_pp = data[i]['info']['priceChangePercent']
            if previous_pp > current_pp:
                # do something
                # update previous_pp value
            else:
                # do something
                # update previous_pp value
        else:
            previous_pp = current_pp = data[i]['info']['priceChangePercent']
            pp1.append(float(current_pp))

    df = pd.DataFrame({'coinpair': fl})
    df['change1'] = pp1
    df = df.sort_values(by='change1', ascending=False)
    print(df['coinpair'].head(10).iloc[0])
    print(df.head(10))
 

И периодически запускайте их, как показано ниже:

 schedule.every(15).minutes.do(fetch_data)
schedule.every(15).minutes.do(write_to_file, data=markets)
schedule.every(15).minutes.do(form_df, data=markets, previous_p=previous_pp)

while True:
    schedule.run_pending()
    time.sleep(1)
 

Комментарии:

1. Привет @Рустам, Спасибо за ответ, но у меня все еще есть вопрос, как эта настройка может сравнить предыдущее значение изменения цены и текущее значение изменения цены. Потому что, насколько я понимаю, через 15 минут старые данные будут перезаписаны новыми

2. @rohangala что именно вы хотите сделать, сравнив текущие значения с предыдущими? Чтобы мы могли адаптировать ваш код к нему

3. Привет @Рустам Идея состоит в том, чтобы проверить, увеличилось или уменьшилось изменение цены. Если он растет, это означает, что есть восходящий тренд, и я могу открывать ордера. Каждые 15 минут, сравнивая с предыдущей ценой, я буду узнавать, повышалась или снижалась цена

4. @rohangala, Вы можете в принципе создать глобальную переменную и назвать ее, допустим previous_pp , и передать в качестве аргумента form_df функции. Каждый раз, когда вы вызываете эту функцию , она будет сравнивать предыдущее изменение цены с текущим, если оно есть previous_pp , в противном случае она просто установит previous_pp текущее значение. Я отредактировал ответ, проверьте его