【问题标题】:Get a time of first transaction for each day from stock data从股票数据中获取每天的首次交易时间
【发布时间】:2019-10-03 00:12:59
【问题描述】:

最近我得到了一个 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

我已经将 Time 列转换为 pandas 日期时间。

虽然我能够获得一些所需的统计数据,但我却卡在查找每天的第一笔和最后一笔交易的时间。

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]])

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

【问题讨论】:

  • 你不应该修改你的帖子以获得额外的问题。相反,请打开一个新帖子。

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


【解决方案1】:
df.groupby(df['Time'].dt.day).apply(lambda x: x.iloc[np.r_[0:1, -1:0]])

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

【讨论】:

  • 由于“时间”是我的索引列,因此出现错误。我做了小改动: dbs.groupby(dbs.index.day).apply(lambda x: x.iloc[np.r_[0:1, -1:0]]) 但是现在我得到了 2019 年第一笔交易的输出-01-01 和最后一次在 2019-05-14 作为一组 2019-01-01 09:42:16 180.00 5.0 2019-05-14 10:30:03 198.50 15.0 dbs.groupby(dbs.index.date)。 apply(lambda x: x.iloc[np.r_[0:1,-1:0]]) - 这按预期工作。非常感谢
【解决方案2】:

选项 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 解决方案中没有获得交易时间。
  • @1001001 谢谢,已修复。
  • 现在它可以按预期工作了。万分感谢!对于这个关于市场最新开始的额外问题,您有什么想法吗?
  • .reset_index().groupby(df.index.date).Time.min().max()。您可以在dfnew_df 上进行操作。但就像我说的,下次请打开一个新问题。
  • 当我测试这个选项时,不幸的是它返回 min() 但仅适用于我数据集中的第一天或最后一天。 maxDF = new_df.reset_index().groupby(new_df.index.date).Time.min().max()
【解决方案3】:

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

【讨论】:

  • 感谢您的意见,但我最感兴趣的是交易时间。价格和数量也是非常有价值的信息,但在这种特殊情况下,我最需要的是时间。
  • @1001001 好的。现在我已经修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多