web-dev-qa-db-ja.com

回帰を実行するためにパンダデータフレームの列を反復する方法

これは簡単ですが、pythonの初心者として、pandasデータフレーム内の変数を反復処理してそれぞれで回帰を実行する方法を理解するのが困難です。

これが私がしていることです:

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

私はこのような回帰を実行できることを知っています:

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

しかし、データフレームの各列に対してこれを行いたいとします。特に、FSTMXでFIUIX、次にFSTMXでFSAIX、次にFSTMXでFSAVXを後退させたいと思います。各回帰後に、残差を保存します。

私は以下の様々なバージョンを試してみましたが、構文が間違っているはずです。

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

問題はキーでリターン列を参照する方法がわからないことだと思うので、returns[k]はおそらく間違っています。

これを行うための最善の方法に関するガイダンスは大いに有り難いでしょう。おそらく私が見逃している一般的なパンダアプローチがあります。

132
itzy
for column in df:
    print(df[column])
244
The Unfun Cat

iteritems()を使うことができます:

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

ixを使用して、位置によってデータフレーム列にインデックスを付けることができます。

df1.ix[:,1]

これは例えば最初の列を返します。 (0がインデックスになります)

df1.ix[0,]

これは最初の行を返します。

df1.ix[:,1]

これは、行0と列1の交点の値になります。

df1.ix[0,1]

等々。そのため、enumerate()returns.keys():とデータフレームのインデックスに番号を使用することができます。

19
JAB

この答えは、 - 選択された列 およびDF内のすべての列を反復処理することです。

df.columnsは、DF内のすべての列の名前を含むリストを提供します。すべての列を反復処理したい場合、これはあまり役に立ちません。しかし、あなたが選んだカラムだけを反復したいときには便利です。

必要に応じて、Pythonのリストスライスを使ってdf.columnsをスライスすることができます。たとえば、最初の列以外のすべての列を反復処理するには、次のようにします。

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

すべての列を逆の順序で繰り返すのと同様に、次のことができます。

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

このテクニックを使うことでたくさんのクールな方法ですべての列を反復することができます。また、すべての列のインデックスを簡単に取得できることを覚えておいてください。

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

この問題を回避するには、DataFrameを転置して行を反復処理します。

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

受け入れられた答え に基づいて、もし各列に対応する index 所望の であるならば:

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

上記のdf[column]型はSeriesです。これは単純にnumpyndarraysに変換できます。

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

私は少し遅れていますが、ここで私はこれをやった方法です。ステップ:

  1. 全列のリストを作成する
  2. Xの組み合わせを取るためにitertoolsを使う
  3. 除外された列リストとともに各結果のRの2乗値を結果のデータフレームに追加します
  4. 結果の[DFをRの2乗の降順で並べ替えて、どちらが最適かを確認します。

これは私がaft_tmtと呼ばれるDataFrameで使用したコードです。あなたのユースケースに外挿してお気軽に..

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

リスト内包表記を使用すると、すべての列名(ヘッダー)を取得できます。

[column for column in df]

2
MEhsan

(他の回答で主に示されている列名ではなく)データフレームの行を反復するには、次を使用できます。

# df has 3 columns and 5 rows
df = pd.DataFrame(np.random.randint(0, 10, (5, 3)), columns=['A','B','C'])

for col in df.values:
    print(col)

どの出力

[5 5 0]
[7 4 5]
[4 1 6]
[2 3 4]
[6 0 4]

行ではなく列ごとに反復するには、単にdf.valuesを転置します。

for col in df.values.T:
    print(col)
[5 7 4 2 6]
[5 4 1 3 0]
[0 5 6 4 4]
0
Casimir