2012-08-02 55 views
1

我正在做我認爲對我的數據的一個簡單迴歸,但有些事情是錯誤的。我使用csv2rec來讀取我的數據,但然後我打印迴歸參數m和b我得到nan nan。csv2rec和polyfit的問題

如果要預覽CSV文件這裏是它的一些:

"Oxide","ooh","oh", 
"MoO",3.06,0.01, 
"IrO",2.79,-0.23, 

我要的是對兩行的迴歸。 x = a.ohy = a.ooh

這裏是我使用

import matplotlib 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 
from pylab import polyfit 

a = mlab.csv2rec('rutilecsv.csv') 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.set_xlabel('E_OH/eV', fontsize=12) 
ax.set_ylabel('E_OOH/eV', fontsize=12) 

(m, b) = polyfit(a.oh, a.ooh, 1) 

print m, b 

ax.plot(a.oh, a.ooh, 'go') 

plt.axis([-2, 3, 1, 6]) 
plt.show() 
+0

是否有可能csv2rec沒有將您的第一行解釋爲列名,因此不能轉換其他數值? – Edmon 2012-08-02 14:01:58

+0

FWIW我無法複製此內容。用你的示例數據文件,我得到了'(m,b)= 1.125,3.04875'和一個有兩個綠色圓圈的圖。 [mpl 1.1.1rc。]你確定沒有列出的數據的所有部分都可以,特別是:最後? 「any(numpy.isnan(a.ooh))」和「any(numpy.isnan(a.oh))'返回什麼? – DSM 2012-08-02 14:02:51

+0

如果我在修改了csv文件後才運行腳本,那麼我就會發現它。在情節中,如果你有空的元素,但在polyfit中卻沒有關係。謝謝。 – user1488097 2012-08-02 14:14:06

回答

1

好了,只是把這個上牀,這正是是否有缺失,你會得到的症狀數據:

"Oxide","ooh","oh", 
"MoO",3.06,0.01, 
"IrO",2.79,-0.23, 
"ZZ",2.79,, 

結果

In [7]: a.ooh 
Out[7]: array([ 3.06, 2.79, 2.79]) 

In [8]: a.oh 
Out[8]: array([ 0.01, -0.23, nan]) 

In [9]: polyfit(a.oh, a.ooh, 1) 
Out[9]: array([ nan, nan]) 

如果你想簡單地忽略丟失的數據,那麼你可以簡單地傳遞polyfit只有點在那裏都存在:

In [15]: good_data = ~(numpy.isnan(a.oh) | numpy.isnan(a.ooh)) 

In [16]: good_data 
Out[16]: array([ True, True, False], dtype=bool) 

In [17]: a.oh[good_data] 
Out[17]: array([ 0.01, -0.23]) 

In [18]: a.ooh[good_data] 
Out[18]: array([ 3.06, 2.79]) 

In [19]: polyfit(a.oh[good_data], a.ooh[good_data], 1) 
Out[19]: array([ 1.125 , 3.04875]) 
0

兩件事情檢查腳本:

  1. 是價值觀轉換屬性格式

  2. 嘗試[ '哦']和一個['ooh']訪問載體

,也許使用選項名稱在閱讀文件時,指定列名

+0

帝斯曼正確。但非常感謝你的幫助。 – user1488097 2012-08-02 14:14:37