gpt4 book ai didi

pandas - 查询pandas MultiIndex的正确方法

转载 作者:行者123 更新时间:2023-12-04 12:18:44 24 4
gpt4 key购买 nike

我有一个巨大的数据框(1300 万行),其中包含股票和股价。我使用 MultiIndex(['stock', 'date']) 将它们编入索引。 ,其中 date已被解析为 DateTime .

这意味着我可以轻松地根据库存选择价格数据 df.loc['AAPL'] ,并按特定日期 df.loc['AAPL'].loc['2015-05-05'] .

我想知道的是,获取特定日期所有股票价格的最快和最优雅的访问器是什么(即如果指数反转)。

目前我正在使用 df.xs("2015-05-05", level=1) - 这是正确的方法吗?有没有更好/更清洁/更快的方法?

最佳答案

我认为你所做的很好,但也有其他方法。

>>> df = pd.DataFrame({ 
'stock':np.repeat( ['AAPL','GOOG','YHOO'], 3 ),
'date':np.tile( pd.date_range('5/5/2015', periods=3, freq='D'), 3 ),
'price':(np.random.randn(9).cumsum() + 10) })

>>> df = df.set_index(['stock','date'])

price
stock date
AAPL 2015-05-05 8.538459
2015-05-06 9.330140
2015-05-07 8.968898
GOOG 2015-05-05 8.964389
2015-05-06 9.828230
2015-05-07 9.992985
YHOO 2015-05-05 9.929548
2015-05-06 9.330295
2015-05-07 10.676468

使用 loc 两次的稍微更标准的方法
>>> df.loc['AAPL'].loc['2015-05-05']

会做
>>> df.loc['AAPL','2015-05-05']

price 8.538459
Name: (AAPL, 2015-05-05 00:00:00), dtype: float64

而不是 xs您可以使用 IndexSlice。我认为 2 个级别 xs更容易,但 IndexSlice 可能会更好地超过 2 个级别。
>>> idx=pd.IndexSlice

>>> df.loc[ idx[:,'2015-05-05'], : ]

price
stock date
AAPL 2015-05-05 8.538459
GOOG 2015-05-05 8.964389
YHOO 2015-05-05 9.929548

老实说,我认为这里最简单的方法是使用日期或股票(或两者都不是)作为索引,然后大多数选择都非常简单。例如,如果您完全删除索引,则可以毫不费力地按日期进行选择:
>>> df = df.reset_index()
>>> df[ df['date']=='2015-05-05' ]

index stock date price
0 0 AAPL 2015-05-05 8.538459
3 3 GOOG 2015-05-05 8.964389
6 6 YHOO 2015-05-05 9.929548

对 3 只股票和 3000 个日期(=9000 行)进行一些快速计时,我发现简单的 bool 选择(无索引)比 xs 快约 35%,而 xs 比使用 IndexSlice 快约 35%。但是请参阅下面杰夫的评论,您应该期望 bool 选择在行数更多时表现相对较差。

当然,对你来说最好的办法是测试你自己的数据,看看结果如何。

关于pandas - 查询pandas MultiIndex的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36101873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com