Bagaimana cara mengulang kolom dataframe panda untuk menjalankan regresi

187

Saya yakin ini sederhana, tetapi sebagai pemula yang lengkap untuk python, saya mengalami kesulitan mencari cara untuk mengulangi variabel dalam pandaskerangka data dan menjalankan regresi dengan masing-masing.

Inilah yang saya lakukan:

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

Saya tahu saya dapat menjalankan regresi seperti ini:

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

tapi anggaplah saya ingin melakukan ini untuk setiap kolom di dataframe. Secara khusus, saya ingin mundur FIUIX di FSTMX, dan kemudian FSAIX di FSTMX, dan kemudian FSAVX di FSTMX. Setelah setiap regresi saya ingin menyimpan residu.

Saya sudah mencoba berbagai versi berikut ini, tetapi saya pasti salah mengerti sintaks:

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

Saya pikir masalahnya adalah saya tidak tahu bagaimana merujuk ke kolom pengembalian dengan kunci, jadi returns[k]mungkin salah.

Bimbingan apa pun tentang cara terbaik untuk melakukan ini akan sangat dihargai. Mungkin ada pendekatan panda umum yang saya lewatkan.

gatal
sumber
1
Anda dapat for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
mensubkripsikan

Jawaban:

343
for column in df:
    print(df[column])
Kucing Unfun
sumber
1
Saya sepertinya hanya mendapatkan kembali tajuk kolom ketika saya menggunakan metode ini. Jadi misalnya: print (df) menunjukkan data pada kolom dataframe tetapi untuk c in df: print (c) hanya mencetak header bukan data.
user1761806
5
Ok abaikan saya - Saya sedang melakukan print (kolom) bukan print (df [kolom])
user1761806
14
Watch out for kolom dengan nama yang sama!
freethebees
4
Itu bagus dan ringkas. Saya berharap for x in dfuntuk beralih dari baris, meskipun. : - /
Eric Duminil
7
for idx, row in df.iterrows()beralih di atas baris. Karena operasi colbased adalah vektor, itu wajar bahwa iterasi utama adalah lebih dari kolom :)
The Unfun Cat
69

Anda bisa menggunakan iteritems():

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

Jawaban ini untuk beralih di atas kolom yang dipilih serta semua kolom di DF.

df.columnsmemberikan daftar yang berisi semua nama kolom di DF. Nah, itu tidak terlalu membantu jika Anda ingin mengulang semua kolom. Tapi itu berguna ketika Anda ingin beralih di atas kolom yang Anda pilih saja.

Kita dapat menggunakan daftar Python mengiris dengan mudah untuk mengiris kolom df. sesuai dengan kebutuhan kita. Misalnya, untuk mengulangi semua kolom tapi yang pertama, kita bisa melakukan:

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

Demikian pula untuk beralih pada semua kolom dalam urutan terbalik, kita dapat melakukan:

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

Kita dapat mengulangi semua kolom dengan banyak cara keren menggunakan teknik ini. Ingat juga bahwa Anda bisa mendapatkan indeks dari semua kolom dengan mudah menggunakan:

for ind, column in enumerate(df.columns):
    print(ind, column)
Abhinav Gupta
sumber
21

Anda dapat mengindeks kolom dataframe dengan posisi menggunakan ix.

df1.ix[:,1]

Ini mengembalikan kolom pertama misalnya. (0 akan menjadi indeks)

df1.ix[0,]

Ini mengembalikan baris pertama.

df1.ix[:,1]

Ini akan menjadi nilai di persimpangan baris 0 dan kolom 1:

df1.ix[0,1]

dan seterusnya. Jadi Anda bisa enumerate() returns.keys():dan menggunakan nomor tersebut untuk mengindeks dataframe.

TUSUKAN
sumber
8
ixsudah usang, gunakaniloc
Yohan Obadia
8

Solusi adalah untuk mengubah posisi DataFramedan beralih di atas baris.

for column_name, column in df.transpose().iterrows():
    print column_name
kdauria
sumber
4
Transposisi agak mahal :)
The Unfun Cat
Mungkin mahal, tetapi ini adalah solusi hebat untuk kerangka data yang relatif kecil. Terima kasih kdauria!
elPastor
5

Menggunakan pemahaman daftar, Anda bisa mendapatkan semua nama kolom (tajuk):

[column for column in df]

MEhsan
sumber
2
Versi lebih pendek: list(df.columns)atau[c for c in df]
The Unfun Cat
4

Berdasarkan jawaban yang diterima , jika indeks yang sesuai untuk setiap kolom juga diinginkan :

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

df[column]Jenis di atas adalah Series, yang dapat dengan mudah dikonversi menjadi numpy ndarrays:

for i, column in enumerate(df):
    print i, np.asarray(df[column])
Insinyur Gratis Herpes
sumber
3

Saya agak terlambat tetapi inilah cara saya melakukan ini. Langkah langkah:

  1. Buat daftar semua kolom
  2. Gunakan itertools untuk mengambil x kombinasi
  3. Tambahkan setiap hasil R nilai kuadrat ke kerangka data hasil bersama dengan daftar kolom yang dikecualikan
  4. Urutkan DF hasil dalam urutan R kuadrat untuk melihat mana yang paling cocok.

Ini adalah kode yang saya gunakan pada DataFrame dipanggil aft_tmt . Jangan ragu untuk meramalkan kasus penggunaan Anda ..

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)
Gaurav
sumber