从库存数据获取每天的首次交易时间

时间:2019-05-15 19:21:33

标签: python python-3.x pandas pandas-groupby

最近我得到了一个csv文件,其中包含我们公司在不同市场/工具上进行的交易。我的数据集包含超过50万行。

这是我的数据样本,没有(此时)不相关的列:

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

我已经将“时间”列转换为熊猫日期时间。

尽管我能够获得一些所需的统计信息,但我却无法确定每天的第一笔和最后一笔交易的时间。

Expected OUTPUT:

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

好吧,我在Excel中获得此功能没有问题,但是考虑到快速增长的数据量,我宁愿使用pandas和python来实现此目的。

我假设可以使用groupby和resample方法的某种组合来解决问题,但是我不知道如何将它们正确地应用于数据框。

任何想法和评论都会受到赞赏。

感谢 Ben Pap ,我使用以下方法获得了结果:

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

这是我提出的另一个问题。我想使用什么函数来获得第一次交易时间的最大值。那么换句话说,哪一天的交易最晚开始?

3 个答案:

答案 0 :(得分:2)

df.groupby(df['Time'].dt.day).apply(lambda x: x.iloc[np.r_[0:1, -1:0]])

只要订购日期,这将为您提供每天的第一天和最后一天。

答案 1 :(得分:1)

选项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,后跟aggstack

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

答案 2 :(得分:1)

如果您使用日期时间格式的索引,则可以使用方法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
相关问题