Получить время первой транзакции для каждого дня из данных о запасах - PullRequest
3 голосов
/ 15 мая 2019

Недавно я получил CSV-файл с транзакциями, совершенными нашей компанией на различных рынках / инструментах. Мой набор данных состоит из более чем 500 000 строк.

Вот мой пример данных без нерелевантных (на данный момент) столбцов:

Market  Price   Quantity
Time            
2019-01-01 09:42:16 Share   180.00  5.0
2019-01-01 09:44:59 Share   180.00  10.0
2019-01-01 09:46:24 Share   180.00  6.0
2019-01-01 09:47:21 Share   180.00  5.0
2019-01-01 09:52:19 Share   180.00  10.0
2019-01-01 09:52:19 Share   180.00  5.0
2019-01-01 09:52:19 Share   180.00  5.0
2019-01-01 09:57:37 Share   180.01  10.0
2019-01-02 10:03:43 Share   235.00  10.0
2019-01-02 10:04:11 Share   235.00  10.0
2019-01-02 10:04:19 Share   235.00  10.0
... ... ... ...
2019-05-13 10:06:44 Share   233.00  10.0
2019-05-13 10:11:45 Share   233.00  10.0
2019-05-13 10:11:45 Share   233.00  10.0
2019-05-13 10:11:49 Share   234.00  10.0
2019-05-13 10:11:49 Share   234.00  10.0
2019-05-13 10:11:54 Share   233.00  10.0
2019-05-14 09:50:56 Share   230.00  10.0
2019-05-14 09:53:31 Share   229.00  10.0
2019-05-14 09:53:55 Share   229.00  5.0
2019-05-14 09:53:59 Share   229.00  3.0
2019-05-14 09:54:01 Share   229.00  2.0
2019-05-14 09:54:07 Share   229.00  3.0
2019-05-14 09:54:16 Share   229.00  2.0

Я уже преобразовал столбец Time в pandas datetime.

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

Expected OUTPUT:

2019-03-12 08:43:23    Share(name) 248  10
2019-03-12 16:48:21    Share(name) 250  20

Ну, у меня нет проблем с получением этого в Excel, но, учитывая быстро растущее количество данных, я бы предпочел использовать для этих целей панды и питон.

Я предполагаю, что некоторая комбинация методов groupby и resample могла бы быть решением, но я понятия не имею, как правильно применить их к моему фрейму данных.

Любые мысли и комментарии будут оценены.

Благодаря Бен Папу Я получил результат, используя:

dbs.groupby(dbs.index.date).apply(lambda x: x.iloc[np.r_[0:1,-1:0]])

Вот еще один вопрос, который я задал. Какую функцию я предполагаю использовать, чтобы получить максимальное значение времени первой транзакции. Другими словами, в какой день рынок начинается не позднее?

Ответы [ 3 ]

2 голосов
/ 15 мая 2019
df.groupby(df['Time'].dt.day).apply(lambda x: x.iloc[np.r_[0:1, -1:0]])

Это даст вам первый и последний день каждого дня, пока ваши даты заказаны.

1 голос
/ 15 мая 2019

Если у вас есть индекс в формате datetime, вы можете использовать метод resample():

df['Datetime'] = df.index
df.resample('D').agg(['first', 'last']).stack().set_index('Datetime')

Результат:

                    Market   Price  Quantity
Datetime                                    
2019-01-01 09:42:16  Share  180.00       5.0
2019-01-01 09:57:37  Share  180.01      10.0
2019-01-02 10:03:43  Share  235.00      10.0
2019-01-02 10:04:19  Share  235.00      10.0
1 голос
/ 15 мая 2019

Вариант 1:

groupby, за которым следует apply

new_df = (df.groupby(df.index.floor('D'))
            .apply(lambda x: x.iloc[[0,-1]])
            .reset_index(level=0, drop=True)
         )
new_df

Вариант 2:

groupby, за которым следуют agg и stack

new_df = (df.reset_index().groupby(df.index.floor('D'))
            .agg(['first','last'])
            .stack(level=1)
            .reset_index(drop=True)
            .set_index('Time')
         )

Вывод:

                    Market  Price   Quantity
Time            
2019-01-01 09:42:16 Share   180.00  5.0
2019-01-01 09:57:37 Share   180.01  10.0
2019-01-02 10:03:43 Share   235.00  10.0
2019-01-02 10:04:19 Share   235.00  10.0
2019-05-13 10:06:44 Share   233.00  10.0
2019-05-13 10:11:54 Share   233.00  10.0
2019-05-14 09:50:56 Share   230.00  10.0
2019-05-14 09:54:16 Share   229.00  2.0

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

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