2017-02-25 8 views
1

データフレームの各列を繰り返し処理して計算を実行し、結果を別のデータフレームに格納する方法を知りたいと思います。列全体を反復して結果をリストに格納する

上記の例で
df_empty = [] 
m = daily.ix[:,-1] #Columns= stocks & Rows= daily returns 
stocks = daily.ix[:,:-1] 
for col in range (len(stocks.columns)): 
    s = daily.ix[:,col] 
    covmat = np.cov(s,m) 
    beta = covmat[0,1]/covmat[1,1] 
    return (beta) 
    print(beta) 

、Iは最初の「S」との間の共分散行列を計算する(株式を表す列毎日戻り、私は1つずつを反復したい)と「M」(市場毎日の返品は私の参照列/私のデータフレームの最後の列です)。次に、各共分散ペア株式/市場のベータを計算したいと思います。

return(beta)が1つの株式について1つの数値結果を与える理由はわかりませんが、print(beta)はすべての株式のベータ版を表示します。 これらのすべてのベータ版を使用してデータフレームを作成する方法を知りたいと思います。

beta_df = df_empty.append(beta) 

私は上記のコードを試しましたが、結果を追加できないかのように「なし」を返します。 ご協力ありがとうございました

+0

ようこそスタックオーバーフロー! [Minimal、Complete、Verifiable](http://stackoverflow.com/help/mcve)の例では、私たちがあなたを助けてくれます。 –

+0

'return'はループを壊しますが、どうしてそんな風に使いますか? – VMAtm

答えて

0

forループ内のステートメントは、最初にリターンが発生したときにループ自体を終了します。さらに、forループ自体がPythonで値を返さないため(副作用のみ)、betaの値はどこにも保存されません。

これ以外にも、データフレームのapplyを使用してパンダのようなアプローチを選択することができます。これは基本的にデータフレームの列を反復し、各列を最初のパラメータとして渡します。関数呼び出し。いくつかのダミーデータを含む最小限の作業例を示します。

import pandas as pd 
import numpy as pd 

# create some dummy data 
daily = pd.DataFrame(np.random.randint(100, size=(100, 5))) 

# define reference column 
cov_column = daily.iloc[:, -1] 

# setup computation function 
def compute(column): 
    covmat = np.cov(column, cov_column) 
    return covmat[0,1]/covmat[1,1] 

# use apply to iterate over columns 
result = daily.iloc[:, :-1].apply(compute) 

# show output 
print(result) 

0 -0.125382 
1 0.024777 
2 0.011324 
3 -0.017622 
dtype: float64 
関連する問題