根据条件获取 pandas 多索引中的索引值
Getting index value in pandas multiindex based on condition
我用这段代码创建了一个数据框:
objective 是找到每周低点,并得到每周低点发生的日期。
为此:
import pandas as pd
from pandas_datareader import data as web
import pandas_datareader
import datetime
df = web.DataReader('GOOG', 'yahoo', start, end)
df2 = web.DataReader('GOOG', 'yahoo', start, end)
start = datetime.datetime(2021,1,1)
end = datetime.datetime.today()
df['Date1'] = df.index
df['month'] = df.index.month
df['week'] = df.index.week
df['day'] = df.index.day
df.set_index('week',append=True,inplace=True)
df.set_index('day',append=True,inplace=True)
获得每周低点:
df['Low'].groupby(['week']).min().tail(50)
我想找出每周最低点出现的日期:例如1735.420044
如果我尝试这样做:
df['Low'].isin([1735.420044])
我得到:
Date week day
2020-12-31 53 31 False
2021-01-04 1 4 False
2021-01-05 1 5 False
2021-01-06 1 6 False
2021-01-07 1 7 False
...
2021-08-02 31 2 False
2021-08-03 31 3 False
2021-08-04 31 4 False
2021-08-05 31 5 False
2021-08-06 31 6 False
Name: Low, Length: 151, dtype: bool
我怎样才能得到低点的实际日期?
要获得每周低点,您只需访问该指数即可。
res = df['Low'].groupby(['week']).min()
res
是索引中带有日期的最低价格系列。您可以使用 res.index.values
访问表示索引的原始 numpy 数组。这也将包括 week
和 day
级别。
要将日期作为一个系列,这应该可行:
dates = res.index.get_level_values("Date").to_series()
PS: 来自评论的澄清
df['Low'].isin([1735.420044]).any() # returns False
以上对你不起作用(如果有匹配,应该 return True
)因为当你说 .isin([<bunch of floats>])
时,你实际上是在比较浮点数是否相等。这是行不通的,因为永远不能保证浮点比较是准确的,它们总是必须在容差范围内(这不是 Python 特定的,对所有语言都是如此)。有时它似乎在 Python 中有效,但这完全是巧合,是底层内存优化的结果。查看 this thread 以获得一些(Python 特定的)洞察力。
我用这段代码创建了一个数据框: objective 是找到每周低点,并得到每周低点发生的日期。 为此:
import pandas as pd
from pandas_datareader import data as web
import pandas_datareader
import datetime
df = web.DataReader('GOOG', 'yahoo', start, end)
df2 = web.DataReader('GOOG', 'yahoo', start, end)
start = datetime.datetime(2021,1,1)
end = datetime.datetime.today()
df['Date1'] = df.index
df['month'] = df.index.month
df['week'] = df.index.week
df['day'] = df.index.day
df.set_index('week',append=True,inplace=True)
df.set_index('day',append=True,inplace=True)
获得每周低点:
df['Low'].groupby(['week']).min().tail(50)
我想找出每周最低点出现的日期:例如1735.420044
如果我尝试这样做:
df['Low'].isin([1735.420044])
我得到:
Date week day
2020-12-31 53 31 False
2021-01-04 1 4 False
2021-01-05 1 5 False
2021-01-06 1 6 False
2021-01-07 1 7 False
...
2021-08-02 31 2 False
2021-08-03 31 3 False
2021-08-04 31 4 False
2021-08-05 31 5 False
2021-08-06 31 6 False
Name: Low, Length: 151, dtype: bool
我怎样才能得到低点的实际日期?
要获得每周低点,您只需访问该指数即可。
res = df['Low'].groupby(['week']).min()
res
是索引中带有日期的最低价格系列。您可以使用 res.index.values
访问表示索引的原始 numpy 数组。这也将包括 week
和 day
级别。
要将日期作为一个系列,这应该可行:
dates = res.index.get_level_values("Date").to_series()
PS: 来自评论的澄清
df['Low'].isin([1735.420044]).any() # returns False
以上对你不起作用(如果有匹配,应该 return True
)因为当你说 .isin([<bunch of floats>])
时,你实际上是在比较浮点数是否相等。这是行不通的,因为永远不能保证浮点比较是准确的,它们总是必须在容差范围内(这不是 Python 特定的,对所有语言都是如此)。有时它似乎在 Python 中有效,但这完全是巧合,是底层内存优化的结果。查看 this thread 以获得一些(Python 特定的)洞察力。