2015-06-14 54 views
0

乳膠表格式:字符串轉換爲在Python

>>> from sklearn.metrics import classification_report 
>>> y_true = [0, 1, 2, 2, 2] 
>>> y_pred = [0, 0, 2, 2, 1] 
>>> target_names = ['class 0', 'class 1', 'class 2'] 
>>> print(classification_report(y_true, y_pred, target_names=target_names)) 
      precision recall f1-score support 

    class 0  0.50  1.00  0.67   1 
    class 1  0.00  0.00  0.00   1 
    class 2  1.00  0.67  0.80   3 

avg/total  0.70  0.60  0.61   5 

我使用file.write(report)保存classification_report爲文本文件,但我想將它保存如TEX表格格式如下:

\begin{table}[htbp] 
    \centering 
    \caption{Add caption} 
    \begin{tabular}{rrrrr} 
    \toprule 
      & precision & recall & f1-score & support \\ 
    \midrule 
      &  &  &  & \\ 
    class 0 & 0.5 & 1  & 0.67 & 1 \\ 
    class 1 & 0  & 0  & 0  & 1 \\ 
    class 2 & 1  & 0.67 & 0.8 & 3 \\ 
      &  &  &  & \\ 
    avg/total & 0.7 & 0.6 & 0.61 & 5 \\ 
    \bottomrule 
    \end{tabular}% 
    \label{tab:addlabel}% 
\end{table}% 

有關如何實現此目的的任何建議?謝謝!

回答

0

表頭和頁腳只是文本,所以我會跳過這些。

取出classification_report的輸出,並將其與str.splitlines()分成幾行。

In [7]: rep = """    precision recall f1-score support 
    ...: 
    ...:  class 0  0.50  1.00  0.67   1 
    ...:  class 1  0.00  0.00  0.00   1 
    ...:  class 2  1.00  0.67  0.80   3 
    ...: 
    ...: avg/total  0.70  0.60  0.61   5""" 

In [8]: rep.splitlines() 
Out[8]: 
['    precision recall f1-score support', 
'', 
' class 0  0.50  1.00  0.67   1', 
' class 1  0.00  0.00  0.00   1', 
' class 2  1.00  0.67  0.80   3', 
'', 
'avg/total  0.70  0.60  0.61   5'] 

既然你知道什麼第一和最後兩行包含,可以專心您的格式努力在剩餘的線。

In [9]: lines = rep.splitlines() 

In [10]: lines[2:-2] 
Out[10]: 
[' class 0  0.50  1.00  0.67   1', 
' class 1  0.00  0.00  0.00   1', 
' class 2  1.00  0.67  0.80   3'] 

In [11]: cl = lines[2:-2] 

In [19]: [ln.replace('class ', '').split() for ln in cl] 
Out[19]: 
[['0', '0.50', '1.00', '0.67', '1'], 
['1', '0.00', '0.00', '0.00', '1'], 
['2', '1.00', '0.67', '0.80', '3']] 

In [20]: cl = [ln.replace('class ', '').split() for ln in cl] 

In [23]: for ln in cl: 
    print('class ' + ' & '.join(ln) + r'\\') 
    ....:  
class 0 & 0.50 & 1.00 & 0.67 & 1\\ 
class 1 & 0.00 & 0.00 & 0.00 & 1\\ 
class 2 & 1.00 & 0.67 & 0.80 & 3\\ 

avg行處理方式大致相同。

In [25]: last = lines[-1] 

In [29]: last[11:].split() 
Out[29]: ['0.70', '0.60', '0.61', '5'] 

In [30]: numbers = last[11:].split() 

In [31]: print('avg/total & ' + ' & '.join(numbers) + r'\\') 
avg/total & 0.70 & 0.60 & 0.61 & 5\\ 

我建議跳過特別是因爲你已經在使用的統治者從booktabs包的空行。


替代

如果按行獲取數據出來sklearn的一種方式,你可能會想看看我寫的簡單latable Python模塊。

+0

非常感謝,明天我會實施這個! – user3025898