Найти - Пользователи
Полная версия: Pandas сравнение двух DataFrame
Начало » Python для новичков » Pandas сравнение двух DataFrame
1 2
Partsofbody
Здравствуйте,
 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 и записать новое время в соответствующую ячейку

Перелопатил много учебников и примеров, но соответствующего решения не нашел.
ZerG
я как то в мододсти был не сильно ращборчив и потому две бабы на меня одного было
Вопрос то в чем?
xam1816
так можно получить последнее значение
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 индекс
Partsofbody
xam1816
так можно получить последнее значение
В ‘check_bar’ несколько вариантов валюты. Сравнивать нужно именно с той ячейкой времени, которая соответствует строке валюты. Причем ‘check_bar’ не должен раздуваться. Количество строк всегда должно оставаться тем же. Изменяется только ячейка времени.
Попробую вариант. Благодарю
Partsofbody
ZerG
я как то в мододсти был не сильно ращборчив и потому две бабы на меня одного былоВопрос то в чем?
Вопрос в том, как решить задачу сравнения и записи нового бара. Без раздутия “check_bars”
Partsofbody
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()
Partsofbody
Partsofbody
Как теперь из dataframe перевести значения в сравниваемые?
xam1816
Мне было бы понятнее что нужно, если бы был отрывок данных исходных, и то что нужно получить(прописать руками, как должно быть)
Partsofbody
xam1816
Мне было бы понятнее что нужно, если бы был отрывок данных исходных, и то что нужно получить(прописать руками, как должно быть)
Код отрабатывает появления нового ценового бара в терминале MetaTrader5.
Результатом запроса является DataFrame.
df
В ячейке ‘time’ записывается дата и время последнего бара в виде 2024-04-10 18:40:00
Это, к примеру, время последнего. Мы его запоминаем.
После запроса df обновился. Нам необходимо взять последний бар из df и сравнить его время с нашим сохраненным.
Результатом сравнения является True или False(это новый бар)
xam1816
  
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB