2017-08-14 43 views
0

我有一个样本数据框(df)应用功能:如何在数据帧

       Time    Price 
Equity(231 [IBM]) 2016-05-10 00:00:00+00:00 150.04 
Equity(2574 [TSLA]) 2016-04-29 00:00:00+00:00 248.43 

我想使用其他变量在数据帧值和值的每一行应用功能findy()和存储这些值在新栏目Predicted中。

我有这些变量的值(从输出复制):

high_1 = Equity(231 [IBM])  151.676 
     Equity(2574 [TSLA]) 258.310 
     Equity(0 [AAPL])  111.710 

idx_1 = Equity(231 [IBM])  2016-04-18 00:00:00+00:00 
     Equity(2574 [TSLA]) 2016-04-18 00:00:00+00:00 
     Equity(0 [AAPL])  2016-04-14 00:00:00+00:00 

我想申请这个功能:

def findy(s,Time,Price,idx_1, high_1, idx_last): 
    idx = [idx_1.loc[s.index], Time] 
    x = matplotlib.dates.date2num(idx) 
    y = [high_1.loc[s.index], Price] 
    coefficients = np.polyfit(x, y, 1) 
    polynomial = np.poly1d(coefficients) 
    x_axis = np.linspace(x[0], idx_last + 1, 3) # linspace(start, end, num) 
    y_axis = polynomial(x_axis) 
    return Predicted_Value 

我使用此代码尝试:

df["Predicted"] = df.apply(lambda s: 
          findy(s,s['Time'],s['Price'],idx_1,high_1,idx_last)) 

lambda函数中,我试图获取index,Time,Price并插入到函数中,并将这些值用于findy()内部的操作。 但是我得到的错误,如KeyError: ('Time', 'occurred at index Time') 主要问题是坐在lambda里面,以及如何从行中访问值。

如果你想要更多的澄清随时问。

+0

我认为你只需要添加一个额外的参数来应用你的调用。 ''df [“Predicted”] = df.apply(lambda s:findy(s,s ['Time'],s ['Price'],idx_1,high_1,idx_last),1)'会告诉它应用row by行。现在,它正试图逐列。 – JCVanHamme

+0

你的意思是'axis = 1'?我尝试过,但我仍然得到错误。 – ArJuN

+0

错误是相同还是不同? – JCVanHamme

回答

1

问题出在您的findy函数中。第一行尝试做idx_1.loc[s.index]s.index的值类似Index(['Time', 'Price'], dtype='object')。然后在idx_1的索引中查找['Time','Price'],该索引不存在。

我认为你必须重新评估你的findy函数。即使第一条线路正常工作,您也可以转向并将该结果传递给matplotlib.dates.date2num,该期望值为datetimedatetimes的序列。这不会是idx包含的内容。

+0

感谢您的回答,但'时间','价格'是列名,索引是'Equity(231 [IBM])',请您多看看,我真的很感谢。 – ArJuN

+1

是的, '时间'和'价格'是数据框的列名,但是当你传入表示该帧的一行的系列对象时,它们将成为索引值。你应该仔细检查你的's.index'是什么样子'findy'功能 – JCVanHamme

+0

嗯,有道理,我会发现它。谢谢:) – ArJuN