2016-05-07 14 views
1

私は数年の間、毎日のための米国財務省の曲線を含むデータセットを持っています。行=日付、列=特定財務省債(3月、1年、10年など)のテナントパンダのiterrowsとループカウンターのトラブル

私は毎日ループし、金利モデルのパラメータを較正するPythonコードを持っています。私はiterrowsと私のループカウンタで各行をループするのに問題があります。目標は行ごとに移動し、その日の曲線にモデルをキャリブレーションし、キャリブレーションされたパラメータをデータフレームに格納し、次の行に移動して繰り返します。

def do_calibration_model1(): 
    global i 
    for index, row in curves.iterrows():  
     day = np.array(row) #the subsequent error_fxn uses this daily curve 
     calibration() 
    i += 1 

def calibration(): 
    i = 0 
    param = scipy.brute(error_fxn, bounds...., etc.) 
    opt = scipy.fmin(error_fxn, param, xtol..., ftol...) 
    calibration.loc[i] = np.array(opt) # store result of minimization (parameters for that day) 

コードは最初の繰り返しで正しく機能しますが、データフレーム(カーブ)の最初の行の較正を繰り返し続けます。さらに、較正データフレームの次の行にパラメータを格納しません。私は最初の問題をiterrowsに関連して見ていますが、2番目の問題はループカウンタの問題です。

何が問題になるのでしょうか?私はMatlabの背景を持っていて、非常にイライラするようにパンダのセットアップを見つける。

参考までに私は以下のリンクを参照してください。改訂されたコードは、今に基づいてキャリブレーションデータフレームの各行の適切なパラメータを置く

def do_calibration_model1(): 
    global i 
    for index, row in curves.iterrows(): 
     for i in range(0,len(curves)):  
      day = np.array(row) #the subsequent error_fxn uses this daily curve 
      param = scipy.brute(error_fxn, bounds...., etc.) 
      opt = scipy.fmin(error_fxn, param, xtol..., ftol...) 
      calibration.loc[i] = np.array(opt) # store result of minimization (parameters for that day) 
      i += 1 

:私は、コードを更新した下記のジェイソンさんのコメントパー

https://www.python.org/dev/peps/pep-0212/

http://nipunbatra.github.io/2015/06/pandas-iteration/

ループカウンタ。

*ただし、パンダのiterrows関数のカーブデータフレームの2番目(または後続の行)にはまだ移動しません。

+0

私はあなたの質問のiterrows部分に対処するために私の答えを編集しました。これが役に立ったら教えてください。 – user6275647

答えて

2

calibrationが呼び出されるたびに、i = 0と設定します。その結果、calibration.loc[i] = np.array(opt)に電話すると、何が書き込まれているかは、校正の項目0です。変数iは、この関数では0以外の何も実際にはありません。

関数do_calibration_model1()では、関数呼び出しの最後にglobal iを宣言してから、iを1つ増やして宣言します。私はこのiカウンターが何を達成するのかは分かりません。おそらく、のicalibration()関数の変数iの値を更新していると思われますが、そうではありません。 calibration()global iステートメントがない場合、この関数のiはローカル変数です。

についてiterrowsについては、カーブの長さを循環する埋め込みforループは必要ありません。上記で

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D']) 

new = pd.DataFrame({'sum': [], 
        'mean': []}) 
for index, row in df.iterrows(): 
    temp = {'sum': sum(row), 'mean': np.mean(row)} 
    new = new.append(temp, ignore_index=True) 

dfは次のようになります:iterrows作品がどのようにここでお見せする簡単な例を示します

  A   B   C   D 
0 -2.197018 1.905543 0.773851 -0.006683 
1 0.675442 0.818040 -0.561957 0.002737 
2 -0.833482 0.248135 -1.159698 -0.302912 
3 0.784216 -0.156225 -0.043505 -2.539486 
4 -0.637248 0.034303 -1.405159 -1.590045 
5 0.289257 -0.085030 -0.619899 -0.211158 
6 0.804702 -0.838365 0.199911 0.210378 
7 -0.031306 0.166793 -0.200867 1.343865 

そしてiterrowsループを埋めnewデータフレームは、次のようになります。

 mean  sum 
0 0.118923 0.475693 
1 0.233566 0.934262 
2 -0.511989 -2.047958 
3 -0.488750 -1.954999 
4 -0.899537 -3.598148 
5 -0.156707 -0.626830 
6 0.094157 0.376626 
7 0.319621 1.278485 

ここでappendを使用すると、iカウンターでコードを簡素化します。あなたがoptを摂取するためのデータフレームを設定する必要があります。このステップcallibration = pd.DataFrame({'a': [], 'b': []})

def do_calibration_model1(): 
    callibration = pd.DataFrame({'a': [], 
           'b': []}) 
    for index, row in curves.iterrows(): 
     day = np.array(row) 
     param = scipy.brute(error_fxn, bounds...., etc.) 
     opt = scipy.fmin(error_fxn, param, xtol..., ftol...) 
     temp = {'a': ..., 'b': ...} # put opt values into dict 
     callibration = calibration.append(temp, ignore_index=True) 
    return callibration 

:あなたのコードに戻って

は、私は次のようなものを示唆しています。以前はoptをnumpyの配列に変換しましたが、optという値を、私がここでtempに対して行ったのと同じ方法で、あなたの呼び出しデータフレームに収まるように配置する必要があります:temp = {'sum': sum(row), 'mean': np.mean(row)}

関連する問題