Jestem pewien, że jest to proste, ale jako kompletny nowicjusz w pythonie mam problem z ustaleniem, jak iterować zmienne w pandas
ramce danych i uruchomić regresję dla każdej z nich.
Oto co robię:
all_data = {}
for ticker in ['FIUIX', 'FSAIX', 'FSAVX', 'FSTMX']:
all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2010', '1/1/2015')
prices = DataFrame({tic: data['Adj Close'] for tic, data in all_data.iteritems()})
returns = prices.pct_change()
Wiem, że mogę przeprowadzić taką regresję:
regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()
ale przypuśćmy, że chcę to zrobić dla każdej kolumny w ramce danych. W szczególności chcę zresetować FIUIX na FSTMX, a następnie FSAIX na FSTMX, a następnie FSAVX na FSTMX. Po każdej regresji chcę przechowywać resztki.
Wypróbowałem różne wersje następujących elementów, ale muszę mieć złą składnię:
resids = {}
for k in returns.keys():
reg = sm.OLS(returns[k],returns.FSTMX).fit()
resids[k] = reg.resid
Myślę, że problem polega na tym, że nie wiem, jak odwoływać się do kolumny zwrotów według klucza, więc returns[k]
prawdopodobnie jest źle.
Wszelkie wskazówki dotyczące najlepszego sposobu osiągnięcia tego celu byłyby bardzo mile widziane. Być może brakuje mi wspólnego podejścia do pand.
źródło
for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
Odpowiedzi:
źródło
for x in df
jednak iteracji po wierszach. : - /for idx, row in df.iterrows()
iteruje po wierszach. Ponieważ operacje oparte na kolumnach są wektoryzowane, naturalne jest, że główna iteracja przebiega nad kolumnami :)Możesz użyć
iteritems()
:źródło
Ta odpowiedź ma na celu iterację wybranych kolumn, a także wszystkich kolumn w DF.
df.columns
daje listę zawierającą wszystkie nazwy kolumn w DF. To nie jest bardzo pomocne, jeśli chcesz iterować po wszystkich kolumnach. Ale przydaje się, gdy chcesz iterować tylko wybrane kolumny.Możemy łatwo używać wycinania list Pythona, aby pokroić df.columns zgodnie z naszymi potrzebami. Na przykład, aby wykonać iterację we wszystkich kolumnach oprócz pierwszej, możemy wykonać:
Podobnie do iteracji po wszystkich kolumnach w odwrotnej kolejności, możemy:
Możemy iterować wszystkie kolumny na wiele fajnych sposobów, stosując tę technikę. Pamiętaj również, że możesz łatwo uzyskać indeksy wszystkich kolumn, używając:
źródło
Możesz indeksować kolumny ramki danych według pozycji za pomocą
ix
.Zwraca na przykład pierwszą kolumnę. (0 to indeks)
Zwraca pierwszy wiersz.
Byłaby to wartość na przecięciu wiersza 0 i kolumny 1:
i tak dalej. Możesz więc
enumerate()
returns.keys():
użyć tego numeru do indeksowania ramki danych.źródło
ix
jest przestarzałe, użyjiloc
Obejściem tego problemu jest transpozycja
DataFrame
i iteracja po wierszach.źródło
Korzystając ze zrozumienia listy, możesz uzyskać wszystkie nazwy kolumn (nagłówek):
[column for column in df]
źródło
list(df.columns)
lub[c for c in df]
Na podstawie zaakceptowanej odpowiedzi , jeśli pożądany jest również indeks odpowiadający każdej kolumnie :
Powyższy
df[column]
typ toSeries
, który można po prostu przekonwertować nanumpy
ndarray
s:źródło
Jestem trochę spóźniony, ale oto jak to zrobiłem. Kroki:
To jest kod, którego użyłem na DataFrame o nazwie
aft_tmt
. Ekstrapoluj do swojego przypadku użycia.źródło