Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2024 21:47:01

Partsofbody
Зарегистрирован: 2024-04-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

Здравствуйте,

 import MetaTrader5 as mt5
import pandas as pd
import numpy as np
import time
# Импортирую данные из Metatrader5.
symbol_list = ['EURUSD','BTCUSDT.cfd']
timeframe = mt5.TIMEFRAME_H1
start_pos = 0
num_bars = 10
check_bar = pd.DataFrame(columns = ['time', 'symbol'], index = range(0, len(symbol_list)))
check_bar['time'] = pd.to_datetime(1900-1-1)
check_bar['symbol'] = symbol_list
while True:
    for symbol in symbol_list:
        bars = mt5.copy_rates_from_pos(symbol, timeframe, start_pos, num_bars)
        df = pd.DataFrame(bars)[['time', 'open', 'high', 'low', 'close']]
        df['symbol'] = symbol
        df['time'] = pd.to_datetime(df['time'], unit='s')
        df.dropna(inplace=True)
# Далее необходимо сравнить ячейку из check_bar['time'] соответствующего символа check_bar['symbol'] с 
# последней ячейкой df['symbol', 'time'], если время последнего бара текущего символа из df не соответствует 
# времени, записанного в check_bar, вернуть True и записать новое время в соответствующую ячейку

Перелопатил много учебников и примеров, но соответствующего решения не нашел.

Отредактировано Partsofbody (Апрель 8, 2024 21:47:20)

Офлайн

#2 Апрель 8, 2024 22:42:21

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

я как то в мододсти был не сильно ращборчив и потому две бабы на меня одного было
Вопрос то в чем?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Апрель 8, 2024 22:47:31

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1350
Репутация: +  118  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

так можно получить последнее значение

last_bar_time = df.iloc[-1]['time']
так сравнить и присвоить
 if last_bar_time != check_bar.loc[i, 'time']:
            check_bar.loc[i, 'time'] = last_bar_time
где i индекс

Офлайн

#4 Апрель 8, 2024 23:42:50

Partsofbody
Зарегистрирован: 2024-04-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

xam1816
так можно получить последнее значение
В ‘check_bar’ несколько вариантов валюты. Сравнивать нужно именно с той ячейкой времени, которая соответствует строке валюты. Причем ‘check_bar’ не должен раздуваться. Количество строк всегда должно оставаться тем же. Изменяется только ячейка времени.
Попробую вариант. Благодарю

Отредактировано Partsofbody (Апрель 9, 2024 21:05:51)

Офлайн

#5 Апрель 8, 2024 23:44:23

Partsofbody
Зарегистрирован: 2024-04-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

ZerG
я как то в мододсти был не сильно ращборчив и потому две бабы на меня одного былоВопрос то в чем?
Вопрос в том, как решить задачу сравнения и записи нового бара. Без раздутия “check_bars”

Офлайн

#6 Апрель 9, 2024 21:30:59

Partsofbody
Зарегистрирован: 2024-04-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

xam1816
if last_bar_time != check_bar.loc:
check_bar.loc = last_bar_time
         for i in range(0, len(symbol_list)):
            if df.iloc[-1:]['time'] != check_bar.loc[i, 'time']:
                print(check_bar.loc[i,'symbol'], 'новый бар!')
                check_bar.loc[i, 'time'] = df.iloc[-1:]['time']

Частенько такая ошибка выскакивает:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

Офлайн

#7 Апрель 10, 2024 16:50:40

Partsofbody
Зарегистрирован: 2024-04-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

Partsofbody
Как теперь из dataframe перевести значения в сравниваемые?

Офлайн

#8 Апрель 10, 2024 18:51:23

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1350
Репутация: +  118  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

Мне было бы понятнее что нужно, если бы был отрывок данных исходных, и то что нужно получить(прописать руками, как должно быть)

Офлайн

#9 Апрель 10, 2024 19:01:39

Partsofbody
Зарегистрирован: 2024-04-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

xam1816
Мне было бы понятнее что нужно, если бы был отрывок данных исходных, и то что нужно получить(прописать руками, как должно быть)
Код отрабатывает появления нового ценового бара в терминале MetaTrader5.
Результатом запроса является DataFrame.
df
В ячейке ‘time’ записывается дата и время последнего бара в виде 2024-04-10 18:40:00
Это, к примеру, время последнего. Мы его запоминаем.
После запроса df обновился. Нам необходимо взять последний бар из df и сравнить его время с нашим сохраненным.
Результатом сравнения является True или False(это новый бар)

Офлайн

#10 Апрель 10, 2024 20:02:35

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1350
Репутация: +  118  -
Профиль   Отправить e-mail  

Pandas сравнение двух DataFrame

  
import pandas as pd
bars = [
    {'time': 1632048000, 'open': 1.1701, 'high': 1.1725, 'low': 1.1698, 'close': 1.1715, 'tick_volume': 0, 'spread': 2, 'real_volume': 0},
    {'time': 1632048060, 'open': 1.1716, 'high': 1.1722, 'low': 1.1714, 'close': 1.1717, 'tick_volume': 0, 'spread': 2, 'real_volume': 0},
    {'time': 1632048120, 'open': 1.1716, 'high': 1.1719, 'low': 1.1711, 'close': 1.1712, 'tick_volume': 0, 'spread': 2, 'real_volume': 0}
]
df = pd.DataFrame(bars)
df['time'] = pd.to_datetime(df['time'], unit='s')
last_bar_time = df.iloc[-1]['time']
print(df)
print(last_bar_time)
print(df.iloc[-1]['time'])
print(last_bar_time == df.iloc[-1]['time'])

                time    open    high  ...  tick_volume  spread  real_volume
0 2021-09-19 10:40:00 1.1701 1.1725 ... 0 2 0
1 2021-09-19 10:41:00 1.1716 1.1722 ... 0 2 0
2 2021-09-19 10:42:00 1.1716 1.1719 ... 0 2 0

[3 rows x 8 columns]
2021-09-19 10:42:00
2021-09-19 10:42:00
True

Process finished with exit code 0

Отредактировано xam1816 (Апрель 10, 2024 20:03:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version