Фильтрация данных по кадрам по дням - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть фрейм данных Pandas с данными форекс по минутам, длиной в год (371635 строк):

                           O        H        L        C
0                                                      
2017-01-02 02:00:00  1.05155  1.05197  1.05155  1.05190
2017-01-02 02:01:00  1.05209  1.05209  1.05177  1.05179
2017-01-02 02:02:00  1.05177  1.05198  1.05177  1.05178
2017-01-02 02:03:00  1.05188  1.05200  1.05188  1.05200
2017-01-02 02:04:00  1.05196  1.05204  1.05196  1.05203

Я хочу отфильтровать дневные данные, чтобы получить диапазон часов:

dt = datetime(2017,1,1)
df_day = df1[df.index.date == dt.date()]
df_day_t = df_day.between_time('08:30', '09:30')   

Если я делаю цикл for с 200 днями, это занимает минуты. Я подозреваю, что на каждом шагу эта строка

df_day = df1[df.index.date == dt.date()] 

ищет равенство с каждой строкой в ​​наборе данных (даже если это упорядоченный набор данных).

Есть ли способ ускорить фильтрацию, или я должен просто сделать какой-то старый императив for цикл с января по декабрь ...?

1 Ответ

0 голосов
/ 10 ноября 2018

Избегайте Python datetime

Во-первых, вам следует избегать объединения Python datetime с операциями Pandas. Существует множество дружественных для Pandas / NumPy методов для создания datetime объектов для сравнения, например. pd.Timestamp и pd.to_datetime. Ваши проблемы с производительностью здесь частично связаны с этим поведением, описанным в документах :

pd.Series.dt.date возвращает массив Python datetime.date объектов

Использование object dtype таким способом устраняет преимущества векторизации, поскольку для операций требуются циклы уровня Python.

Использование groupby операций для агрегирования по дате

Панды уже имеют функциональность для группировки по дате через нормализованное время:

for day, df_day in df.groupby(df.index.floor('d')):
    df_day_t = df_day.between_time('08:30', '09:30')
    # do something

В качестве другого примера, вы можете получить доступ к срезу для определенного дня следующим образом:

g = df.groupby(df.index.floor('d'))
my_day = pd.Timestamp('2017-01-01')
df_slice = g.get_group(my_day)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...