Regresyon çalıştırmak için panda veri çerçevesinin sütunları üzerinde yineleme nasıl yapılır


187

Eminim bu basit, ama python için tam bir acemi olarak, bir pandasveri çerçevesinde değişkenler üzerinde yineleme ve her bir ile bir regresyon çalıştırmak için nasıl bulmakta sorun yaşıyorum .

İşte yaptığım şey:

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

Böyle bir gerileme yapabilirim biliyorum:

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

ancak bunu veri çerçevesindeki her sütun için yapmak istediğimi varsayalım. Özellikle, FSTMX üzerinde FIUIX ve sonra FSTMX üzerinde FSAIX ve sonra FSTMX üzerinde FSAVX regress istiyorum. Her regresyondan sonra artıkları saklamak istiyorum.

Aşağıdakilerin çeşitli sürümlerini denedim, ancak sözdizimini yanlış alıyorum:

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

Ben sorun nasıl anahtarları döner sütun başvurmak bilmiyorum, bu yüzden returns[k]muhtemelen yanlış olduğunu düşünüyorum.

Bunu yapmanın en iyi yoluna dair herhangi bir rehberlik çok takdir edilecektir. Belki de kaçırdığım ortak bir panda yaklaşımı vardır.


1
for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
Sütunları

Yanıtlar:


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

1
Yalnızca bu yöntemi kullandığımda sütun başlığını geri almak gibi görünüyor. Örneğin: print (df) bana veri çerçevesi sütunlarındaki verileri gösterir, ancak df: print (c) içindeki c için veri yalnızca başlık değil yazdırılır.
user1761806

5
Tamam görmezden gel -
Yazdırmıyordum

14
Aynı ada sahip sütunlara dikkat edin!
freethebees

4
Güzel ve özlü. for x in dfYine de satırlar üzerinde yinelemeyi beklerdim . : - /
Eric Duminil

7
for idx, row in df.iterrows()satırlar üzerinden yinelenir. Ortak tabanlı işlemler vektörleştirildiğinden, ana yinelemenin sütunlar üzerinde olması doğaldır :)
The Unfun Cat

69

Şunları kullanabilirsiniz iteritems():

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

33

Bu yanıt, seçili sütunların yanı sıra bir DF'deki tüm sütunları yinelemektir .

df.columnsDF'deki tüm sütunların adlarını içeren bir liste verir. Şimdi tüm sütunları yinelemek istiyorsanız bu çok yararlı değil. Ancak yalnızca seçtiğiniz sütunlar üzerinde yineleme yapmak istediğinizde kullanışlı olur.

İhtiyaçlarımız doğrultusunda df. sütunlarını dilimlemek için Python'un liste dilimlemesini kolayca kullanabiliriz. Örneğin, birincisi hariç tüm sütunları yinelemek için şunları yapabiliriz:

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

Tüm sütunları ters sırada yinelemeye benzer şekilde şunları yapabiliriz:

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

Bu tekniği kullanarak tüm sütunları çok güzel şekillerde yineleyebiliriz. Ayrıca aşağıdakileri kullanarak tüm sütunların indekslerini kolayca alabileceğinizi unutmayın:

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

21

Öğesini kullanarak veri çerçevesi sütunlarını konuma göre dizinleyebilirsiniz ix.

df1.ix[:,1]

Bu, örneğin ilk sütunu döndürür. (0 dizin olur)

df1.ix[0,]

Bu, ilk satırı döndürür.

df1.ix[:,1]

Bu, satır 0 ile sütun 1'in kesişimindeki değer olacaktır:

df1.ix[0,1]

ve bunun gibi. Böylece veri enumerate() returns.keys():çerçevesini indekslemek için numarayı kullanabilir ve kullanabilirsiniz.


8
ixkullanımdan kaldırıldı, kullanıniloc
Yohan Obadia

8

Geçici bir çözüm, DataFramesatırları dönüştürmek ve yinelemektir.

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

4
Transpozisyon oldukça pahalı :)
The Unfun Cat

Pahalı olabilir, ancak bu nispeten küçük veri çerçeveleri için harika bir çözümdür. Teşekkürler kdauria!
elPastor

5

Liste kavrama özelliğini kullanarak tüm sütun adlarını (başlık) alabilirsiniz:

[column for column in df]


2
Daha kısa versiyon: list(df.columns)veya[c for c in df]
Unfun Cat

4

Göre kabul edilen cevap , bir eğer dizin her sütun tekabül da bir arzu edilen :

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

Yukarıdaki df[column]tür, Seriesbasitçe numpy ndarrays'ye dönüştürülebilir :

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

3

Biraz geç kaldım ama işte böyle yaptım. Adımlar:

  1. Tüm sütunların bir listesini oluşturun
  2. X kombinasyonları almak için itertools kullanın
  3. Her sonuç R kare değerini, hariç tutulan sütun listesiyle birlikte bir sonuç veri çerçevesine ekleyin
  4. En iyi sonucu görmek için sonucu DF'yi R kare azalan düzende sıralayın.

Bu DataFrame üzerinde kullandığım kod aft_tmt. Kullanım durumunuza ekstrapole etmekten çekinmeyin.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.