Как рассчитать диаграмму трехстрочного разрыва по данным OHLC с использованием Pandas - PullRequest
0 голосов
/ 04 июня 2019

У меня есть данные OHLC (Open, High, Low, Close) во фрейме данных Pandas.Я хочу получить данные об этом из трех строк.Я написал функцию для этого.Но создание кадра данных разрыва строки из кадра данных OHLC, имеющего почти 1400 строк, занимает почти 2,5 секунды.Я могу понять, что это требует времени, потому что я перебираю каждую строку для расчета.Мне нужна помощь для преобразования функции без итерации каждой строки или с помощью реализации Pandas.

Я написал ниже упомянутую функцию.

def get_lbdata(data, lines = 3):
    data = data.reset_index().drop(['index'], axis=1)
    lbdata = pd.DataFrame(columns = ['open', 'high', 'low', 'close', 'timestamp', 'date', 'month', 'year', 'weekday', 'hour', 'minute', 'second'])
    lbdata.at[0, "open"] = data.open.iloc[0]
    lbdata.at[0, "close"] = data.close.iloc[0]
    lbdata.at[0, "timestamp"] = data.timestamp.iloc[0]
    lbdata.at[0, "date"] = data.date.iloc[0]
    lbdata.at[0, "month"] = data.month.iloc[0]
    lbdata.at[0, "year"] = data.year.iloc[0]
    lbdata.at[0, "weekday"] = data.weekday.iloc[0]
    lbdata.at[0, "hour"] = data.hour.iloc[0]
    lbdata.at[0, "minute"] = data.minute.iloc[0]
    lbdata.at[0, "second"] = data.second.iloc[0]
    if lbdata.close.iloc[-1] > lbdata.open.iloc[-1]:
        lbdata.at[0, "high"] = data.close.iloc[0]
        lbdata.at[0, "low"] = data.open.iloc[0]
        uptrend = 1
    else:
        lbdata.at[0, "high"] = data.open.iloc[0]
        lbdata.at[0, "low"] = data.close.iloc[0]
        uptrend = 0
    for ri,row in data.iterrows():
        if ri == 0:
            continue
        i = len(lbdata)
        vals = []
        for x in range(-(min(lines, i)), 0):
            vals.insert(len(vals), lbdata.open.iloc[x])
            vals.insert(len(vals), lbdata.close.iloc[x])
        minbreak = min(vals)
        maxbreak = max(vals)
        if row.close > maxbreak:
            if uptrend:
                lbdata.at[i, "open"] = lbdata.close.iloc[-1]
            else:
                lbdata.at[i, "open"] = lbdata.open.iloc[-1]
                uptrend = 1
            lbdata.at[i, "high"] = row.close
            lbdata.at[i, "low"] = lbdata.open.iloc[i]
            lbdata.at[i, "close"] = row.close
            lbdata.at[i, "timestamp"] = row.timestamp
            lbdata.at[i, "date"] = row.date
            lbdata.at[i, "month"] = row.month
            lbdata.at[i, "year"] = row.year
            lbdata.at[i, "weekday"] = row.weekday
            lbdata.at[i, "hour"] = row.hour
            lbdata.at[i, "minute"] = row.minute
            lbdata.at[i, "second"] = row.second
        elif row.close < minbreak:
            if not uptrend:
                lbdata.at[i, "open"] = lbdata.close.iloc[-1]
            else:
                lbdata.at[i, "open"] = lbdata.open.iloc[-1]
                uptrend = 0
            lbdata.at[i, "high"] = lbdata.open.iloc[i]
            lbdata.at[i, "low"] = row.close
            lbdata.at[i, "close"] = row.close
            lbdata.at[i, "timestamp"] = row.timestamp
            lbdata.at[i, "date"] = row.date
            lbdata.at[i, "month"] = row.month
            lbdata.at[i, "year"] = row.year
            lbdata.at[i, "weekday"] = row.weekday
            lbdata.at[i, "hour"] = row.hour
            lbdata.at[i, "minute"] = row.minute
            lbdata.at[i, "second"] = row.second
    return lbdata

Мне нужен код, соответствующий пандам, который рассчитывается по временирезко сократилось.

...