如何消除可疑条形码(如123456)数据

时间:2017-10-04 03:32:21

标签: python pandas numpy data-manipulation

这是来自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

我想删除可疑的数据(即有太多重复或连续的数字),例如123213132131311223344556671234567890123等。我非常容忍漏报,但是想尽可能避免误报(糟糕的条形码)。

2 个答案:

答案 0 :(得分:2)

如果您担心重复和连续的数字,可以取np.diff个数字,然后使用Kolmogorov Smirnov test与三角形分布进行比较。随机数的连续数字之间的差异应遵循-1010之间的三角分布,最大值为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