проблемы с индексами фреймов данных pandas

#pandas #dataframe #numpy

Вопрос:

Я загрузил следующие данные из api yfinance следующим образом:

 import yfinance as yf
symbols=['BTC-USD', 'SPY', 'TSLA', 'AAPL', 'CAKE', 'JBLU', 'MSFT']
data = yf.download(symbols, start="2015-01-01", end="2021-04-20")
 

Я попытался выбрать appl из объявления фрейма данных

 appl=data['AAPL'] 
 

но это не сработало, я не знаю, как панды индексировали название акции? Однако я могу сделать high=data[«Высокий»]

есть какие-нибудь идеи?

Ответ №1:

Вы можете использовать поперечное сечение xs :

 data.xs('AAPL', axis=1, level=1)
 

Выход:

             Adj Close   Close    High     Low    Open     Volume
Date                                                            
2015-01-02      24.82   27.33   27.86   26.84   27.85  212818400
2015-01-05      24.12   26.56   27.16   26.35   27.07  257142000
2015-01-06      24.12   26.57   26.86   26.16   26.64  263188400
2015-01-07      24.46   26.94   27.05   26.67   26.80  160423600
2015-01-08      25.40   27.97   28.04   27.17   27.31  237458000
...               ...     ...     ...     ...     ...        ...
2021-04-13     134.20  134.43  134.66  131.93  132.44   91266500
2021-04-14     131.81  132.03  135.00  131.66  134.94   87222800
2021-04-15     134.27  134.50  135.00  133.64  133.82   89347100
2021-04-16     133.93  134.16  134.67  133.28  134.30   84922400
2021-04-19     134.61  134.84  135.47  133.34  133.51   94264200
 

P.S. Как ни странно, я получал NaN s в течение нескольких дней, и удаление BTC-USD из списка тикеров помогло


Другой вариант, если вы хотите иметь тикер в качестве индекса верхнего уровня в столбцах, вы можете swaplevel , а затем получить доступ к данным Apple с помощью data['APPL'] :

 data = data.swaplevel(axis=1)
data['AAPL']
 

(тот же вывод, что и выше)

Комментарии:

1. Спасибо! это решило мою проблему! Мне было интересно, знаете ли вы, как я могу повторить эти данные, чтобы найти скользящую среднюю для каждой акции. Я знаю, что мы можем найти скользящее среднее по rolling.mean (), но как выполнить итерацию в цикле for ?

2. @AMEXPO Если вы запустите data.rolling(x).mean() (где x находится окно) в фрейме данных, он сделает это по всем столбцам, поэтому вы получите скользящее среднее для каждой акции, поэтому вам не нужно зацикливаться

3. Спасибо за ваш ответ, я сделал следующее, и это не сработало. «AV= pd.Фрейм данных(индекс=data.index) AV[’10’]=данные[‘Закрыть’].прокатка(10).среднее значение() AV[’30’]=данные[‘Закрыть’].прокатка(30).среднее значение() »

4. @AMEXPO Вы просто делаете data['Close'].rolling(10).mean() это-и вы получаете 10-дневную скользящую среднюю закрытия для всех тикеров (по одному столбцу на тикер).