#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
текущее значение. Я отредактировал ответ, проверьте его