Получение значения индекса в мультииндексе pandas на основе условия

avatar
Slartibartfast
9 августа 2021 в 01:19
81
1
0

Я создал фрейм данных с помощью этого кода: Цель этого состоит в том, чтобы найти недельный минимум и получить даты, когда недельный минимум имел место. Для этого:

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)

enter image description here

Я пытаюсь выяснить дату, когда произошел недельный минимум: Например, 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

Как я могу получить фактические даты минимума?

Источник
Michael Delgado
9 августа 2021 в 01:24
0

Используйте df['Low'].idxmin() — это вернет индекс метки(ей) минимального значения.

Slartibartfast
9 августа 2021 в 01:25
0

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

Michael Delgado
9 августа 2021 в 01:26
0

вы всегда можете сгруппировать по неделям, а затем использовать idxmin

Michael Delgado
9 августа 2021 в 01:45
0

Отвечает ли это на ваш вопрос? Получить наименьшее значение после groupby - Pandas

Ответы (1)

avatar
suvayu
9 августа 2021 в 01:26
1

Чтобы получить еженедельные минимумы, вы можете просто получить доступ к индексу.

res = df['Low'].groupby(['week']).min()

res — серия минимальных цен с датой в индексе. Вы можете получить доступ к необработанному массиву numpy, который представляет индекс, с помощью res.index.values. Это также будет включать уровни week и day.

Чтобы получить только даты в виде ряда, это должно работать:

dates = res.index.get_level_values("Date").to_series() 

PS: Уточнение из комментариев

df['Low'].isin([1735.420044]).any() # returns False

Вышеприведенное не работает для вас (должно возвращать True, если есть совпадение), потому что, когда вы говорите .isin([<bunch of floats>]), вы, по сути, сравниваете числа с плавающей запятой на равенство. Это не работает, потому что точность сравнений с плавающей запятой никогда не может быть гарантирована, они всегда должны находиться в диапазоне допусков (это не относится к Python, верно для всех языков). Иногда может показаться, что это работает в Python, но это совершенно случайно и является результатом базовой оптимизации памяти. Взгляните на эту ветку, чтобы получить представление об этом (конкретно для Python).

Slartibartfast
9 августа 2021 в 01:27
0

Сначала я пробовал это, но это просто дает мне пустой фрейм данных

suvayu
9 августа 2021 в 01:29
1

@Slartibartfast Тогда у вас нет совпадений, вы можете проверить с помощью df['Low'].isin([1735.420044]).any(). Если это возвращает False, совпадений нет, возможно, потому что вы пытаетесь сравнить числа с плавающей запятой. Точное сравнение чисел с плавающей запятой непредсказуемо и никогда не рекомендуется.

Slartibartfast
9 августа 2021 в 01:30
0

он возвращает False, но как это возможно, когда мы можем видеть это во фрейме данных?

suvayu
9 августа 2021 в 01:32
1

Вы не можете делать точные сравнения с числами с плавающей запятой,

Slartibartfast
9 августа 2021 в 01:35
0

Значит, я не могу сделать что-то подобное? df.where(df['Low'].groupby(['week']).min())

suvayu
9 августа 2021 в 01:37
0

@Slartibartfast поможет ли вам мой пересмотренный ответ?

suvayu
9 августа 2021 в 01:41
0

Давайте продолжим обсуждение в чате.