Отфильтровать уникальные значения столбца за заданный интервал времени. - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть фрейм данных с датами и тиковыми данными, как показано ниже

    Date                    Bid
0   20160601 00:00:00.020   160.225
1   20160601 00:00:00.136   160.226
2   20160601 00:00:00.192   160.225
3   20160601 00:00:00.327   160.230
4   20160601 00:00:01.606   160.231
5   20160601 00:00:01.613   160.230

Я хочу отфильтровать уникальные значения в столбце «Ставка» с установленными интервалами

Например: 2016-06-01 00:00:00 - 00:15:00, 2016-06-01 00:15:00 - 00:30:00 ...

Результатом будет новый кадр данных (с сохранениемотфильтрованные значения с указанием даты и времени).Вот код, который у меня есть на данный момент:

#Convert Date column to index with seconds as base
df['Date'] = pd.DatetimeIndex(df['Date'])
df['Date'] = df['Date'].astype('datetime64[s]')
df.set_index('Date', inplace=True)

#Create new DataFrame with filtered values
ts = pd.DataFrame(df.loc['2016-06-01'].between_time('00:00', '00:30')['Bid'].unique())

С помощью метода, описанного выше, я теряю [Даты] (datetime) отфильтрованных значений в процессе создания нового DataFrame, плюс я должен вручную вводить каждую датуи интервал времени, который нереально.

Output:
    0
0   160.225
1   160.226
2   160.230
3   160.231
4   160.232
5   160.228
6   160.227

В идеале я ищу операцию, в которой я могу установить временной интервал в качестве временной шкалы и выполнить операцию над всем файлом (около 8 ГБ) одновременно, создав новый DataFrame с датой иСтавьте столбцы уникальных значений в пределах заданного интервала.Вот так

    Date                    Bid
0   20160601 00:00:00.020   160.225
1   20160601 00:00:00.136   160.226
2   20160601 00:00:00.327   160.230
3   20160601 00:00:01.606   160.231
...
805 20160601 00:15:00.606   159.127

PS.Я также пытался использовать pd.rolling() & pd.resample() методы с apply(lambda x: function (например, pd['Bid'].unique()), но он так и не смог его обрезать, может быть, кто-то лучше попытался бы.

1 Ответ

0 голосов
/ 18 сентября 2018

Просто чтобы уточнить: это , а не скользящий расчет. Вы упоминали, что пытались решить эту проблему, используя rolling, но из вашего пояснения кажется, что вы хотите разделить временные ряды на дискретные, не перекрывающиеся 15-минутные последовательности.

Настройка

df = pd.DataFrame({
    'Date': [
        '2016-06-01 00:00:00.020', '2016-06-01 00:00:00.136',
        '2016-06-01 00:15:00.636', '2016-06-01 00:15:02.836',
    ],
    'Bid': [150, 150, 200, 200]
})

print(df)

                      Date  Bid
0  2016-06-01 00:00:00.020  150
1  2016-06-01 00:00:00.136  150         # Should be dropped
2  2016-06-01 00:15:00.636  200
3  2016-06-01 00:15:02.836  200         # Should be dropped

Сначала убедитесь, что ваш столбец Date равен datetime:

df.Date = pd.to_datetime(df.Date)

Теперь используйте dt.floor, чтобы округлить каждое значение до ближайших 15 минут, и используйте этот новый столбец до drop_duplicates за 15-минутное окно, но сохраняйте точность ваших дат.

df.assign(flag=df.Date.dt.floor('15T')).drop_duplicates(['flag', 'Bid']).drop('flag', 1)

                     Date  Bid
0 2016-06-01 00:00:00.020  150
2 2016-06-01 00:15:00.636  200

Из моего первоначального ответа, но я все еще верю, что он имеет значение. Если вы хотите получить доступ к уникальным значениям для каждой группы, вы можете использовать pd.Grouper и unique, и я считаю, что научиться использовать pd.Grouper - это мощный инструмент для работы с pandas:

df.groupby(pd.Grouper(key='Date', freq='15T')).Bid.unique()

Date
2016-06-01 00:00:00    [150]
2016-06-01 00:15:00    [200]
Freq: 15T, Name: Bid, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...