Несколько операций с df.groupby () - PullRequest
0 голосов
/ 20 марта 2019

Я работаю с набором данных форекс, пытаясь заполнить свой информационный фрейм открытым, высоким, низким, закрытым обновлением каждый тик.

Вот мой код:

import pandas as pd

# pandas settings
pd.set_option('display.max_columns', 320)
pd.set_option('display.max_rows', 320)
pd.set_option('display.width', 320)

# creating dataframe
df = pd.read_csv('https://www.dropbox.com/s/tcek3kmleklgxm5/eur_usd_lastweek.csv?dl=1', names=['timestamp', 'ask', 'bid', 'avol', 'bvol'], parse_dates=[0], header=0)
df['spread'] = df.ask - df.bid
df['symbol'] = 'EURUSD'
times = pd.DatetimeIndex(df.timestamp)

# parameters for df.groupby()
df['date'] = times.date
df['hour'] = times.hour

# 1h candles updated every tick
df['candle_number'] = '...'
df['1h_open'] = '...'
df['1h_high'] = '...'
df['1h_low'] = '...'
df['1h_close'] = '...'

# print(df)

grouped = df.groupby(['date', 'hour'])

for idx, x in enumerate(grouped):
    print(idx)
    print(x)



Итак, как вы можете видеть, с помощью цикла for я получаю группы.

Теперь я хочу заполнить следующие столбцы в моем фрейме данных:

  • idx быть моим df ['номер_вечи']
  • df ['1h_open'] должен быть равен самому первому df.bid в группе
  • df ['1h_high'] = самый высокийчисло в df.bid до текущей строки (например, если в группе 350 строк, для 20-го значения мы считаем наибольшее число от 0 до 20, для 215-го - самое высокое значение от 0 до 215, которое можетбыть совершенно другим.
  • df ['1h_low'] = самое низкое значение вплоть до текущей итерации (такой же подход, как и выше)

Я надеюсь, что этоне слишком запутанно =) ура

1 Ответ

1 голос
/ 21 марта 2019

Удобно переиндексировать дату и время:

df_new = df.set_index(['date', 'hour'])

Затем применить групповые функции, агрегирующие по индексу:

df_new['candle_number'] = df_new.groupby(level=[0,1]).ngroup()
df_new['1h_open'] = df_new.groupby(level=[0,1])['bid'].first()
df_new['1h_high'] = df_new.groupby(level=[0,1])['bid'].cummax()
df_new['1h_low']  = df_new.groupby(level=[0,1])['bid'].cummin()

Вы можете reset_index() вернутьсяна плоский кадр данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...