我有很多具有以下格式的.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.csv
,A2.csv
打印A,A3.csv
,B1.csv
,B2.csv
假设(或预测)打印B3.csv
和B
,C1.csv
和C2.csv
应该(或预测)打印C,......等。我们怎样才能自动从多个C3.csv
文件创建一个混淆矩阵,例如使用.csv
?
如下所示,矩阵的彩色块(行标签)将向我们显示A的Python
(A的真值的计数),B(b的真值的计数)和C(来自C的真值的计数),来自我们函数number of counts
的控制逻辑的..etc - 如上所述。我们在if-else语句(A,B,C,D和E)中的控制逻辑中的列标签。
答案 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]]
有关更多提示 - 请查看以下链接: