这是来自pandas
数据库
737318 Sikat Botol Pigeon 4902508045506 75170
737379 Natur Manual Breast Pump 8850851860016 75170
738753 Sunlight 1232131321313 75261
739287 Bodymist bodyshop 1122334455667 75296
739677 Bodymist ale 1234567890123 75367
我想删除可疑的数据(即有太多重复或连续的数字),例如1232131321313
,1122334455667
,1234567890123
等。我非常容忍漏报,但是想尽可能避免误报(糟糕的条形码)。
答案 0 :(得分:2)
如果您担心重复和连续的数字,可以取np.diff
个数字,然后使用Kolmogorov Smirnov test与三角形分布进行比较。随机数的连续数字之间的差异应遵循-10
和10
之间的三角分布,最大值为0
import scipy.stats as stat
t = stat.triang(.5, loc = -10, scale = 20)
将条形码转换为数组:
a = np.array(list(map(list, map(str, a))), dtype = int) # however you get `a` out of your dataframe
然后使用
构建一个掩码np.array[stat.kstest(i, t.cdf).pvalue > .5 for i in np.diff(a, axis = 1)]
测试:
np.array([stat.kstest(j, t.cdf).pvalue > .5 for j in np.diff(np.random.randint(0, 10, (1000, 13)), axis = 1)]).sum()
Out: 720
您的假阴性率约为30%,但p值阈值.5
几乎可以保证您保留的值不会有太多连续或重复的数字。如果你想确定你已经消除了任何可疑的东西,你可能还需要KS测试stat.uniform(scale = 10)
的实际数字(以消除1213141516171
和类似情况)。
答案 1 :(得分:2)
作为第一步,我将使用内置验证机制的条形码,即校验和。由于您的条形码似乎是GTIN条形码(特别是GTIN-13),您可以使用http://camel.apache.org/simple.html:
>>> import math
>>> def CheckBarcode(s):
sum = 0
for i in range(len(s[:-1])):
sum += int(s[i]) * ((i%2)*2+1)
return math.ceil(sum/10)*10-sum == int(s[-1])
>>> CheckBarcode("4902508045506")
True
>>> CheckBarcode("8850851860016")
True
>>> CheckBarcode("1232131321313")
True
>>> CheckBarcode("1122334455667")
False
>>> CheckBarcode("1234567890123")
False