从多个.csv文件

时间:2017-05-27 10:10:10

标签: python csv confusion-matrix

我有很多具有以下格式的.csv文件。

338,800
338,550
339,670
340,600 
327,500
301,430
299,350
284,339
284,338
283,335
283,330
283,310
282,310
282,300
282,300
283,290

从第1列开始,我想读取当前行并将其与前一行的值进行比较。如果它大于或等于,则继续比较,如果当前单元格的值小于前一行 - 那么我将当前值除以前一个值并继续。例如,在上面给出的表格中:根据我对第1列的要求,我们得到的值越小是327(因为327小于前一个值340) - 然后我们将327除以340得到值0.96。我们打印条件后,我的python脚本应该立即退出( A ),如下所示。

from __future__ import division
import csv

def category(val):
    if 0.8 < val <= 0.9:
        return "A"
    if abs(val - 0.7) < 1e-10:
        return "B"
    if 0.5 < val < 0.7:
        return "C"
    if abs(val - 0.5) < 1e-10:
        return "E"
    return "D"

    with open("test.csv", "r") as csvfile:
    ff = csv.reader(csvfile)

    results = []
    previous_value = 0
    for col1, col2 in ff:
        if not col1.isdigit():
            continue
        value = int(col1)
        if value >= previous_value:
            previous_value = value
            continue
        else:
            result =  int(col1)/ int(previous_value)
            results.append(result)
            print category(result)
            previous_value = value
    print (results)
    print (sum(results))
    print (category(sum(results) / len(results)))

最后,我想为当前目录中的所有.csv文件运行我的脚本,并构建如下所示的混淆矩阵。让我们假设({1}},A1.csvA2.csv打印A,A3.csvB1.csvB2.csv假设(或预测)打印B3.csvBC1.csvC2.csv应该(或预测)打印C,......等。我们怎样才能自动从多个C3.csv文件创建一个混淆矩阵,例如使用.csv

,如下所示

如下所示,矩阵的彩色块(行标签)将向我们显示A的Python(A的真值​​的计数),B(b的真值的计数)和C(来自C的真值的计数),来自我们函数number of counts的控制逻辑的..etc - 如上所述。我们在if-else语句(A,B,C,D和E)中的控制逻辑中的列标签。

enter image description here

2 个答案:

答案 0 :(得分:3)

添加def get_predict(filename)

def get_predict(filename):
    if 'Alex' in filename:
        return 'Alexander'
    else:
        return filename [0]

读取n个文件,使用pandas crosstab计算混淆矩阵:

import os
import pandas as pd

def get_category(filepath):
    def category(val):
        print('predict({}; abs({})'.format(val, abs(val)))
        if 0.8 < val <= 0.9:
            return "A"
        if abs(val - 0.7) < 1e-10:
            return "B"
        if 0.5 < val < 0.7:
            return "C"
        if abs(val - 0.5) < 1e-10:
            return "E"
        return "D"

    with open(filepath, "r") as csvfile:
        ff = csv.reader(csvfile)

        results = []
        previous_value = 0
        for col1, col2 in ff:
            value = int(col1)
            if value >= previous_value:
                previous_value = value
            else:
                results.append(value / previous_value)
                previous_value = value

    return category(sum(results) / len(results))

matrix = {'actual':[], 'predict':[]}
path = 'test/confusion'
for filename in os.listdir( path ):
    # The first Char in filename is Predict Key
    matrix['predict'].append(filename[0])
    matrix['actual'].append(get_category(os.path.join(path, filename)))

df = pd.crosstab(pd.Series(matrix['actual'], name='Actual'),
                 pd.Series(matrix['predict'], name='Predicted')
                 )
print(df)
  

输出 :(阅读&#34; A.csv,B.csv,C.csv&#34;给定的示例数据三次)

Predicted  A  B  C
Actual            
A          3  0  0
B          0  3  0
C          0  0  3

使用Python测试:3.4.2 - pandas:0.19.2

答案 1 :(得分:1)

使用Scikit-Learn是您提供confusion_matrix功能的最佳选择。这是一种您可以轻松扩展的方法。

from sklearn.metrics import confusion_matrix

# Read your csv files
with open('A1.csv', 'r') as readFile:
    true_values = [int(ff) for ff in readFile]
with open('B1.csv', 'r') as readFile:
    predictions = [int(ff) for ff in readFile]

# Produce the confusion matrix
confusionMatrix = confusion_matrix(true_values, predictions)

print(confusionMatrix)

这是您期望的输出。

[[0 2]
 [0 2]]

有关更多提示 - 请查看以下链接:

How to write a confusion matrix in Python?