У меня есть pandas датафрейм с объектом datetime64 на одном из столбцов.
time volume complete closeBid closeAsk openBid openAsk highBid highAsk lowBid lowAsk closeMid
0 2016-08-07 21:00:00+00:00 9 True 0.84734 0.84842 0.84706 0.84814 0.84734 0.84842 0.84706 0.84814 0.84788
1 2016-08-07 21:05:00+00:00 10 True 0.84735 0.84841 0.84752 0.84832 0.84752 0.84846 0.84712 0.8482 0.84788
2 2016-08-07 21:10:00+00:00 10 True 0.84742 0.84817 0.84739 0.84828 0.84757 0.84831 0.84735 0.84817 0.847795
3 2016-08-07 21:15:00+00:00 18 True 0.84732 0.84811 0.84737 0.84813 0.84737 0.84813 0.84721 0.8479 0.847715
4 2016-08-07 21:20:00+00:00 4 True 0.84755 0.84822 0.84739 0.84812 0.84755 0.84822 0.84739 0.84812 0.847885
5 2016-08-07 21:25:00+00:00 4 True 0.84769 0.84843 0.84758 0.84827 0.84769 0.84843 0.84758 0.84827 0.84806
6 2016-08-07 21:30:00+00:00 5 True 0.84764 0.84851 0.84768 0.84852 0.8478 0.84857 0.84764 0.84851 0.848075
7 2016-08-07 21:35:00+00:00 4 True 0.84755 0.84825 0.84762 0.84844 0.84765 0.84844 0.84755 0.84824 0.8479
8 2016-08-07 21:40:00+00:00 1 True 0.84759 0.84812 0.84759 0.84812 0.84759 0.84812 0.84759 0.84812 0.847855
9 2016-08-07 21:45:00+00:00 3 True 0.84727 0.84817 0.84743 0.8482 0.84743 0.84822 0.84727 0.84817 0.84772
Мое приложение следует (упрощенной) структуре ниже:
class Runner():
def execute_tick(self, clock_tick, previous_tick):
candles = self.broker.get_new_candles(clock_tick, previous_tick)
if candles:
run_calculations(candles)
class Broker():
def get_new_candles(clock_tick, previous_tick)
start = previous_tick - timedelta(minutes=1)
end = clock_tick - timedelta(minutes=3)
return df[(df.time > start) & (df.time <= end)]
Я заметил, что при профилировании приложения вызов df[(df.time > start) & (df.time <= end)]
вызывает самые высокие проблемы с производительностью, и мне было интересно, есть ли способ ускорить эти вызовы?
EDIT: я добавляю дополнительную информацию о прецеденте здесь (также источник доступен по адресу: https://github.com/jmelett/pyFxTrader)
- Приложение примет список instruments (например, EUR_USD, USD_JPY, GBP_CHF), а затем pre-fetch ticks/candles для каждого из них и их таймфреймов (например, 5 минут, 30 минут, 1 час и т.д.). Инициализированные данные в основном представляют собой
dict
инструментов, каждый из которых содержит еще одинdict
со свечными данными для M5, M30, H1 таймфреймов. - Каждый "таймфрейм" представляет собой фреймворк pandas, как показано вверху
- A симулятор часов используется для запроса отдельных свечей в течение определенного времени (например, в 15:30:00, дайте мне последний x "5-минутные свечи" ) для EUR_USD
- Этот фрагмент данных затем используется для "имитировать "конкретные рыночные условия (например, средняя цена за последний 1 час увеличилась на 10%, покупка рыночная позиция)