Cách lặp qua các cột của cơ sở dữ liệu gấu trúc để chạy hồi quy


186

Tôi chắc chắn điều này đơn giản, nhưng là một người mới hoàn toàn với python, tôi gặp khó khăn khi tìm cách lặp lại các biến trong một pandaskhung dữ liệu và chạy hồi quy với từng biến.

Đây là những gì tôi đang làm:

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()

Tôi biết tôi có thể chạy hồi quy như thế này:

regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()

nhưng giả sử tôi muốn làm điều này cho mỗi cột trong khung dữ liệu. Cụ thể, tôi muốn hồi quy FIUIX trên FSTMX, và sau đó là FSAIX trên FSTMX, và sau đó là FSAVX trên FSTMX. Sau mỗi hồi quy tôi muốn lưu trữ phần dư.

Tôi đã thử các phiên bản khác nhau sau đây, nhưng tôi phải hiểu sai cú pháp:

resids = {}
for k in returns.keys():
    reg = sm.OLS(returns[k],returns.FSTMX).fit()
    resids[k] = reg.resid

Tôi nghĩ vấn đề là tôi không biết cách tham chiếu cột trả về theo khóa, nên returns[k]có lẽ sai.

Bất kỳ hướng dẫn về cách tốt nhất để làm điều này sẽ được nhiều đánh giá cao. Có lẽ có một cách tiếp cận gấu trúc phổ biến mà tôi đang thiếu.


1
Bạn có thể đăng ký các cols như vậy: for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()os tương tự
EdChum

Câu trả lời:


341
for column in df:
    print(df[column])

1
Tôi dường như chỉ lấy lại tiêu đề cột khi tôi sử dụng phương pháp này. Vì vậy, ví dụ: print (df) hiển thị cho tôi dữ liệu trong các cột dataframe nhưng đối với c in df: print (c) chỉ in tiêu đề chứ không phải dữ liệu.
dùng1761806

5
Ok bỏ qua cho tôi - Tôi đã in (cột) không in (df [cột])
user1761806 20/03/2017

14
Xem ra cho các cột có cùng tên!
freethebees

4
Thật hay và súc tích. Tuy nhiên, tôi hy vọng for x in dfsẽ lặp đi lặp lại qua các hàng. : - /
Eric Duminil

7
for idx, row in df.iterrows()lặp đi lặp lại qua các hàng. Vì các hoạt động được tô màu được vector hóa, nên việc lặp lại chính là trên các cột :)
Mèo Unun

68

Bạn có thể sử dụng iteritems():

for name, values in df.iteritems():
    print('{name}: {value}'.format(name=name, value=values[0]))

33

Câu trả lời này là lặp lại qua các cột được chọn cũng như tất cả các cột trong DF.

df.columnsđưa ra một danh sách chứa tất cả các tên của cột trong DF. Bây giờ điều đó không hữu ích nếu bạn muốn lặp lại tất cả các cột. Nhưng nó có ích khi bạn chỉ lặp đi lặp lại qua các cột bạn chọn.

Chúng ta có thể dễ dàng sử dụng danh sách của Python để cắt lát df.column theo nhu cầu của chúng ta. Ví dụ: để lặp lại trên tất cả các cột nhưng cột đầu tiên, chúng ta có thể làm:

for column in df.columns[1:]:
    print(df[column])

Tương tự như lặp lại trên tất cả các cột theo thứ tự đảo ngược, chúng ta có thể làm:

for column in df.columns[::-1]:
    print(df[column])

Chúng ta có thể lặp lại tất cả các cột theo nhiều cách hay bằng cách sử dụng kỹ thuật này. Cũng cần nhớ rằng bạn có thể dễ dàng lấy các chỉ số của tất cả các cột bằng cách sử dụng:

for ind, column in enumerate(df.columns):
    print(ind, column)

21

Bạn có thể lập chỉ mục các cột khung dữ liệu theo vị trí bằng cách sử dụng ix.

df1.ix[:,1]

Điều này trả về cột đầu tiên chẳng hạn. (0 sẽ là chỉ số)

df1.ix[0,]

Điều này trả về hàng đầu tiên.

df1.ix[:,1]

Đây sẽ là giá trị tại giao điểm của hàng 0 và cột 1:

df1.ix[0,1]

và như thế. Vì vậy, bạn có thể enumerate() returns.keys():và sử dụng số để lập chỉ mục khung dữ liệu.


7
ixkhông được dùng nữa, hãy sử dụngiloc
Yohan Obadia

8

Một cách giải quyết là hoán vị DataFramevà lặp lại trên các hàng.

for column_name, column in df.transpose().iterrows():
    print column_name

3
Chuyển vị khá tốn kém :)
Mèo Unun

Có thể tốn kém, nhưng đây là một giải pháp tuyệt vời cho các datafram tương đối nhỏ. Cảm ơn kdauria!
elPastor

5

Sử dụng hiểu danh sách, bạn có thể nhận được tất cả các tên cột (tiêu đề):

[column for column in df]


2
Phiên bản ngắn hơn: list(df.columns)hoặc[c for c in df]
The Unun Cat

4

Dựa trên câu trả lời được chấp nhận , nếu một chỉ số tương ứng với mỗi cột cũng được mong muốn :

for i, column in enumerate(df):
    print i, df[column]

df[column]Loại trên là Series, đơn giản có thể được chuyển đổi thành numpy ndarrays:

for i, column in enumerate(df):
    print i, np.asarray(df[column])

3

Tôi hơi muộn nhưng đây là cách tôi đã làm điều này. Các bước:

  1. Tạo một danh sách tất cả các cột
  2. Sử dụng itertools để lấy x kết hợp
  3. Nối từng kết quả R giá trị bình phương vào khung dữ liệu kết quả cùng với danh sách cột bị loại trừ
  4. Sắp xếp kết quả DF theo thứ tự giảm dần của R bình phương để xem cái nào phù hợp nhất.

Đây là mã tôi đã sử dụng trên DataFrame được gọi aft_tmt. Hãy ngoại suy cho trường hợp sử dụng của bạn ..

import pandas as pd
# setting options to print without truncating output
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)

import statsmodels.formula.api as smf
import itertools

# This section gets the column names of the DF and removes some columns which I don't want to use as predictors.
itercols = aft_tmt.columns.tolist()
itercols.remove("sc97")
itercols.remove("sc")
itercols.remove("grc")
itercols.remove("grc97")
print itercols
len(itercols)

# results DF
regression_res = pd.DataFrame(columns = ["Rsq", "predictors", "excluded"])

# excluded cols
exc = []

# change 9 to the number of columns you want to combine from N columns.
#Possibly run an outer loop from 0 to N/2?
for x in itertools.combinations(itercols, 9):
    lmstr = "+".join(x)
    m = smf.ols(formula = "sc ~ " + lmstr, data = aft_tmt)
    f = m.fit()
    exc = [item for item in x if item not in itercols]
    regression_res = regression_res.append(pd.DataFrame([[f.rsquared, lmstr, "+".join([y for y in itercols if y not in list(x)])]], columns = ["Rsq", "predictors", "excluded"]))

regression_res.sort_values(by="Rsq", ascending = False)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.