У меня есть данные 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
Мне нужен код, соответствующий пандам, который рассчитывается по временирезко сократилось.