Pandas агрегация OHLC по данным OHLC
Я понимаю, что повторная выборка OHLC данных временных рядов в Pandas с использованием одного столбца данных будет работать отлично, например, на следующем фрейме данных:
>>df
ctime openbid
1443654000 1.11700
1443654060 1.11700
...
df['ctime'] = pd.to_datetime(df['ctime'], unit='s')
df = df.set_index('ctime')
df.resample('1H', how='ohlc', axis=0, fill_method='bfill')
>>>
open high low close
ctime
2015-09-30 23:00:00 1.11700 1.11700 1.11687 1.11697
2015-09-30 24:00:00 1.11700 1.11712 1.11697 1.11697
...
Но что мне делать, если данные уже находятся в формате OHLC? Из того, что я могу собрать, метод OHLC API вычисляет срез OHLC для каждого столбца, поэтому, если мои данные находятся в формате:
ctime openbid highbid lowbid closebid
0 1443654000 1.11700 1.11700 1.11687 1.11697
1 1443654060 1.11700 1.11712 1.11697 1.11697
2 1443654120 1.11701 1.11708 1.11699 1.11708
Когда я пытаюсь перепробовать, я получаю OHLC для каждого из столбцов, например:
openbid highbid \
open high low close open high
ctime
2015-09-30 23:00:00 1.11700 1.11700 1.11700 1.11700 1.11700 1.11712
2015-09-30 23:01:00 1.11701 1.11701 1.11701 1.11701 1.11708 1.11708
...
lowbid \
low close open high low close
ctime
2015-09-30 23:00:00 1.11700 1.11712 1.11687 1.11697 1.11687 1.11697
2015-09-30 23:01:00 1.11708 1.11708 1.11699 1.11699 1.11699 1.11699
...
closebid
open high low close
ctime
2015-09-30 23:00:00 1.11697 1.11697 1.11697 1.11697
2015-09-30 23:01:00 1.11708 1.11708 1.11708 1.11708
Есть ли быстрое (ish) обходное решение для этого, что кто-то хочет поделиться, пожалуйста, без меня, чтобы получить колено в руководстве pandas?
Спасибо.
ps, есть этот ответ - Преобразование данных запасов OHLC в разные таймфреймы с помощью python и pandas - но это было 4 года назад, поэтому я надеюсь был некоторый прогресс.
Ответы
Ответ 1
Это похоже на ответ, который вы связали, но немного чище и быстрее, потому что он использует оптимизированные скопления, а не лямбды.
Обратите внимание, что для синтаксиса resample(...).agg(...)
требуется pandas версия 0.18.0
.
In [101]: df.resample('1H').agg({'openbid': 'first',
'highbid': 'max',
'lowbid': 'min',
'closebid': 'last'})
Out[101]:
lowbid highbid closebid openbid
ctime
2015-09-30 23:00:00 1.11687 1.11712 1.11708 1.117
Ответ 2
Вам нужно использовать OrderedDict, чтобы поддерживать порядок строк в новых версиях панд, например:
import pandas as pd
from collections import OrderedDict
df['ctime'] = pd.to_datetime(df['ctime'], unit='s')
df = df.set_index('ctime')
df = df.resample('5Min').agg(
OrderedDict([
('open', 'first'),
('high', 'max'),
('low', 'min'),
('close', 'last'),
('volume', 'sum'),
])
)
Ответ 3
Приведен кадр данных со столбцами цены и суммы
def agg_ohlcv(x):
arr = x['price'].values
names = {
'low': min(arr) if len(arr) > 0 else np.nan,
'high': max(arr) if len(arr) > 0 else np.nan,
'open': arr[0] if len(arr) > 0 else np.nan,
'close': arr[-1] if len(arr) > 0 else np.nan,
'volume': sum(x['amount'].values) if len(x['amount'].values) > 0 else 0,
}
return pd.Series(names)
df = df.resample('1min').apply(agg_ohlcv)
df = df.ffill()
Ответ 4
Это похоже на работу,
def ohlcVolume(x):
if len(x):
ohlc={ "open":x["open"][0],"high":max(x["high"]),"low":min(x["low"]),"close":x["close"][-1],"volume":sum(x["volume"])}
return pd.Series(ohlc)
daily=df.resample('1D').apply(ohlcVolume)