Как фильтровать столбцы в мультииндексном фрейме данных (pandas) - PullRequest
0 голосов
/ 05 августа 2020

У меня есть следующий фрейм данных:

    WBA                                   ...                  HD                    
                                Open       High        Low      Close  ...      l-pc       h-l      h-pc      l-pc
Datetime                                                               ...                                        
2020-06-08 09:30:00-04:00  45.490002  46.090000  45.490002  46.049999  ...       NaN  2.100006       NaN       NaN
2020-06-08 09:35:00-04:00  46.070000  46.330002  46.040001  46.330002  ...  0.009998  1.119904  0.402496  0.717407
2020-06-08 09:40:00-04:00  46.330002  46.660000  46.240002  46.610001  ...  0.090000  0.874893  0.359894  0.514999
2020-06-08 09:45:00-04:00  46.624100  46.950001  46.624100  46.880001  ...  0.014099  0.639999  0.349991  0.290009
2020-06-08 09:50:00-04:00  46.880001  46.990002  46.820000  46.919998  ...  0.060001  0.490005  0.169998  0.320007

этот фрейм данных был получен с использованием приведенного ниже кода:

import yfinance as yf
import pandas as pd
import datetime as dt
end=dt.datetime.today()
start=end-dt.timedelta(59)
tickers=['WBA', 'HD']
ohlcv={}
df=pd.DataFrame
df = yf.download(tickers,group_by=tickers,start=start,end=end,interval='5m')
for i in tickers:
  df[i,"h-l"]=abs(df[i]['High']-df[i]['Low'])
  df[i,'h-pc']=abs (df[i]["High"]-df[i]['Adj Close'].shift(1))
  df[i,'l-pc']=abs(df[i]["Low"]-df[i]['Adj Close'].shift(1))
  

Я пытаюсь применить эту функцию для всех тикеров, упомянутых в Список "тикеров":

  df['tr']=dff[['h-l','h-pc','l-pc']].max(axis=1)
  df['atr']=df['tr'].rolling(window=n, min_periods=n).mean()

для тикеров мне нужно найти "tr", а затем, используя tr, мне нужно найти "atr". Я не могу получить "tr"

1 Ответ

0 голосов
/ 05 августа 2020

Будьте систематичны c о доступе к столбцам через кортежи, и все это просто работает.

import yfinance as yf
import pandas as pd
import datetime as dt
end=dt.datetime.today()
start=end-dt.timedelta(59)
tickers=['WBA', 'HD']
ohlcv={}

# df = yf.download(tickers,group_by=tickers,start=start,end=end,interval='5m')
dfc = df.copy()
for t in tickers:
    dfc[(t,"h-l")] = abs(dfc.loc[:,(t,'High')] - dfc.loc[:,(t,'Low')])
    dfc[(t,"h-pc")] = abs(dfc.loc[:,(t,'High')] - dfc.loc[:,(t,'Adj Close')].shift(1))
    dfc[(t,"l-pc")] = abs(dfc.loc[:,(t,'Low')] - dfc.loc[:,(t,'Adj Close')].shift(1))

# access all the new columns through tuples e.g ("WBA","h-l") ...
dfc["tr"] = dfc[[(t, c) for t in tickers for c in ['h-l','h-pc','l-pc']]].max(axis=1)

n=5
dfc["atr"] = dfc['tr'].rolling(window=n, min_periods=n).mean()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...