#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-дневную скользящую среднюю закрытия для всех тикеров (по одному столбцу на тикер).