2017-10-15 103 views
0

我試圖在數據框中的兩個字段的單個子集上添加斜率計算,並將斜率值應用於每個子集中的所有行。 (我之前在excel中使用過「斜率」函數,儘管我並沒有結婚到準確的算法,「desired_output」字段就是我期望的輸出結果,子集由「strike_order」列,子集從1開始,而不是具有特定的最高值。從pandas df生成「最佳擬合」斜率梯度並填充新列b

「IV」是y值 「罷工」是x值

任何幫助,將不勝感激,因爲我不知道在哪裏具有此開始....

import pandas 
df = pandas.DataFrame([[1200,1,.4,0.005],[1210,2,.35,0.005],[1220,3,.3,0.005], 
[1230,4,.25,0.005],[1200,1,.4,0.003],[1210,2,.37,.003]],columns= 
["strike","strike_order","IV","desired_output"]) 
df 

    strike strike_order IV desired_output 
0 1200  1   0.40 0.005 
1 1210  2   0.35 0.005 
2 1220  3   0.30 0.005 
3 1230  4   0.25 0.005 
4 1200  1   0.40 0.003 
5 1210  2   0.37 0.003 

讓我知道這是不是一個很好的問題提出,我會盡量做到更好。

回答

0

您可以使用numpy's least square 我們可以重寫線方程y=mx+cy = Ap,其中A = [[x 1]]p = [[m], [c]]。然後使用lstsq解決了P,所以我們需要通過添加構成的列,共創的df,

import numpy as np 
df['ones']=1 
A = df[['strike','ones']] 
y = df['IV'] 
m, c = np.linalg.lstsq(A,y)[0] 

或者您可以使用scikit學習的linear_model迴歸模型

您可以通過繪製驗證結果數據作爲散點圖和線性方程爲曲線

import matplotlib.pyplot as plt 
plt.scatter(df['strike'],df['IV'],color='r',marker='d') 
x = df['strike'] 
#plug x in the equation y=mx+c 
y_line = c + m * x 
plt.plot(x,y) 
plt.xlabel('Strike') 
plt.ylabel('IV') 
plt.show() 

所得曲線表示下面 enter image description here

+0

非常感謝,因爲它讓我成爲那裏的一部分。 –

0

試試這個。

首先通過遍歷數據幀,使用strike_order值轉變創建一個子集柱爲1,子集之間的邊界

#create subset column 
subset_counter = 0 
for index, row in df.iterrows(): 
    if row["strike_order"] == 1: 
     df.loc[index,'subset'] = subset_counter 
     subset_counter += 1 
    else: 
     df.loc[index,'subset'] = df.loc[index-1,'subset'] 

df['subset'] = df['subset'].astype(int) 

然後,使用GROUPBY

# run linear regression on subsets of the dataframe using groupby 
from sklearn import linear_model 
model = linear_model.LinearRegression() 
for (group, df_gp) in df.groupby('subset'): 
    X=df_gp[['strike']] 
    y=df_gp.IV 
    model.fit(X,y) 
    df.loc[df.subset == df_gp.iloc[0].subset, 'slope'] = model.coef_ 

df 

    strike strike_order IV desired_output subset slope 
0 1200    1 0.40   0.005  0 -0.005 
1 1210    2 0.35   0.005  0 -0.005 
2 1220    3 0.30   0.005  0 -0.005 
3 1230    4 0.25   0.005  0 -0.005 
4 1200    1 0.40   0.003  1 -0.003 
5 1210    2 0.37   0.003  1 -0.003 
+0

你在煤礦開採中被浪費了。 –

0
輾過每個子集的線性迴歸

@ Scott除了子集值爲0,1以外,其他所有子集的值都是2.我在開頭添加了一個額外的條件,並且使用非常笨拙的種子「seed」值來停止查找第-1行。

import scipy 
    seed=df.loc[0,"date_exp"] 
    #seed ="08/11/200015/06/2001C" 
    #print(seed) 
    subset_counter = 0 
    for index, row in df.iterrows(): 
     #if index['strike_order']==0: 
     if row['date_exp'] ==seed: 
     df.loc[index,'subset']=0 

     elif row["strike_order"] == 1: 
     df.loc[index,'subset'] = subset_counter 
     subset_counter = 1 + df.loc[index-1,'subset'] 
     else: 
      df.loc[index,'subset'] = df.loc[index-1,'subset'] 

    df['subset'] = df['subset'].astype(int) 

現在,這不正是我想要的東西,雖然我認爲使用該種子值是笨重的,寧願如果row == 0等使用,但它是星期五和工作原理。

乾杯