2017-04-26 5 views
2

私は、1行(2次多項式)ごとにカーブフィッティングする必要があるデータフレームを持っています。pandasデータフレームにPythonカーブフィッティングを適用し、新しい列にcoefを追加します。

4つの列があり、各列名はxの値を表します。

各行には、列名のxの値に対応する4つのyの値が含まれています。例えば

: 以下のコードに基づいて、最初の行のためのフィッティングは、私は明示的に使用するために行を反復することなく、カーブフィッティングを行いたいx = [2, 5, 8, 12]y = [5.91, 28.06, 67.07, 145.20]

import numpy as np 
import panda as pd 

df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5], 
     'id2': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 
     'x': [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12], 
     'y': [5.91, 4.43, 5.22, 1.31, 4.42, 3.65, 4.45, 1.70, 3.94, 3.29, 28.06, 19.51, 23.30, 4.20, 18.61, 17.60, 18.27, 16.18, 16.81, 16.37, 67.07, 46.00, 54.95, 43.66, 42.70, 41.32, 12.69, 36.75, 41.36, 38.66, 145.20, 118.34, 16.74, 94.10, 93.45, 86.60, 26.17, 77.12, 91.42, 83.11]}) 

pivot_df = df.pivot_table(index=['id','id2'],columns=['x']) 

[output] 
>>> pivot_df 
      y      
x   2  5  8  12 
id id2        
1 A 5.91 28.06 67.07 145.20 
    B 3.65 17.60 41.32 86.60 
2 A 4.43 19.51 46.00 118.34 
    B 4.45 18.27 12.69 26.17 
3 A 5.22 23.30 54.95 16.74 
    B 1.70 16.18 36.75 77.12 
4 A 1.31 4.20 43.66 94.10 
    B 3.94 16.81 41.36 91.42 
5 A 4.42 16.37 42.70 93.45 
    B 3.29 18.61 38.66 83.11 

かかりますパンダのデータフレームに組み込まれた高性能のフット・アンダー・ザ・イテレーション私はそうする方法がわかりません。

とにかく、希望の出力を表示するために行をループするコードを書きました。以下のコードは機能し、望ましい出力を提供しますが、私はそれをより簡潔に/効率的にするために助けが必要です。

my_coef_array = np.zeros(3) 
#get the x values from the column names 
x = pivot_df.columns.get_level_values(pivot_df.columns.names.index('x')).values 
for index in pivot_df.index: 
    my_coef_array = np.vstack((my_coef_array,np.polyfit(x, pivot_df.loc[index].values, 2))) 
my_coef_array = my_coef_array[1:,:] 
pivot_df['m2'] = my_coef_array[:,0] 
pivot_df['m1'] = my_coef_array[:,1] 
pivot_df['c'] = my_coef_array[:,2] 

[output] 
>>> pivot_df 
      y        m2   m1   c 
x   2  5  8  12         
id id2                
1 A 5.91 28.06 67.07 145.20 0.934379 0.848422 0.471170 
    B 3.65 17.60 41.32 86.60 0.510664 1.156009 -0.767408 
2 A 4.43 19.51 46.00 118.34 1.034594 -3.221912 7.518221 
    B 4.45 18.27 12.69 26.17 -0.015300 2.045216 2.496306 
3 A 5.22 23.30 54.95 16.74 -1.356997 20.827407 -35.130416 
    B 1.70 16.18 36.75 77.12 0.410485 1.772052 -3.345097 
4 A 1.31 4.20 43.66 94.10 0.803630 -1.577705 -1.148066 
    B 3.94 16.81 41.36 91.42 0.631377 -0.085651 1.551586 
5 A 4.42 16.37 42.70 93.45 0.659044 -0.278738 2.068114 
    B 3.29 18.61 38.66 83.11 0.478171 1.218486 -0.638888 

答えて

2

Iはyの2次元アレイを取るnp.polyfitの代替である以下numpy.polynomial.polynomial.polyfitを発見しました。

my_coef_array = pd.DataFrame(np.polynomial.polynomial.polyfit(x, pivot_df.T.values, 2)).T 
my_coef_array.index = pivot_df.index 
my_coef_array.columns = ['c', 'm1', 'm2'] 

pivot_df = pivot_df.join(my_coef_array) 

Xからあなたのコードを開始、私は次の取得します

関連する問題