これは簡単ですが、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]
はおそらく間違っています。
これを行うための最善の方法に関するガイダンスは大いに有り難いでしょう。おそらく私が見逃している一般的なパンダアプローチがあります。
for column in df:
print(df[column])
iteritems()
を使うことができます:
for name, values in df.iteritems():
print('{name}: {value}'.format(name=name, value=values[0]))
ix
を使用して、位置によってデータフレーム列にインデックスを付けることができます。
df1.ix[:,1]
これは例えば最初の列を返します。 (0がインデックスになります)
df1.ix[0,]
これは最初の行を返します。
df1.ix[:,1]
これは、行0と列1の交点の値になります。
df1.ix[0,1]
等々。そのため、enumerate()
returns.keys():
とデータフレームのインデックスに番号を使用することができます。
この答えは、 - 選択された列 および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)
この問題を回避するには、DataFrame
を転置して行を反復処理します。
for column_name, column in df.transpose().iterrows():
print column_name
受け入れられた答え に基づいて、もし各列に対応する index が 所望の であるならば:
for i, column in enumerate(df):
print i, df[column]
上記のdf[column]
型はSeries
です。これは単純にnumpy
ndarray
sに変換できます。
for i, column in enumerate(df):
print i, np.asarray(df[column])
私は少し遅れていますが、ここで私はこれをやった方法です。ステップ:
これは私が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)
リスト内包表記を使用すると、すべての列名(ヘッダー)を取得できます。
[column for column in df]
(他の回答で主に示されている列名ではなく)データフレームの行を反復するには、次を使用できます。
# 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]