2017-10-04 1 views
0

Hier einige Strichcodedaten aus einer pandas DatenbankWie verdächtige Barcode (wie 123456) Daten

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    123456789

Ich mag zu beseitigen Daten löschen, die verdächtig ist (dh hat zu viele wiederholt oder aufeinanderfolgende Ziffern) wie 1232131321313, 1122334455667, 1234567890123, etc. Ich bin sehr tolerant gegenüber falsch negativen, aber ich möchte so viel wie möglich falsch positive (schlechte Barcodes) vermeiden.

+0

Sorry, das für Pandas kein Job ist. –

+0

Ich denke, ich brauche etwas maschinelles Lernen, aber ich habe keine Ahnung –

+0

Es scheint mir, dass Sie Zahlen identifizieren möchten, die sehr "nicht zufällig" sind oder die sich irgendwie von den anderen in dieser Spalte unterscheiden. Sie könnten besser einen vorläufigen Rat von einer der statistischen Quellen wie https://stats.stackexchange.com/ erhalten. –

Antwort

2

Wenn Sie sich über wiederholte und aufeinander folgende Ziffern sorgen, können Sie np.diff der Ziffern nehmen und dann mit einer Kolmogorov Smirnov test gegen eine Dreiecksverteilung vergleichen.

a = np.array(list(map(list, map(str, a))), dtype = int) # however you get `a` out of your dataframe 

dann bauen eine Maske: Der Unterschied zwischen den aufeinanderfolgenden Ziffern für eine Zufallszahl sollte bei 0

import scipy.stats as stat 
t = stat.triang(.5, loc = -10, scale = 20) 

Drehen der Strichcodes in ein Array eine Dreiecksverteilung zwischen -10 und 10, mit einem Maximum folgen mit

np.array[stat.kstest(i, t.cdf).pvalue > .5 for i in np.diff(a, axis = 1)] 

Prüfung:

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 

Sie haben etwa 30% falsch negative Rate, aber ein p-Wert-Schwellenwert von .5 sollte so ziemlich garantieren, dass die Werte, die Sie behalten, nicht zu viele aufeinanderfolgende oder wiederholte Ziffern haben. Wenn Sie wirklich sicher sein wollen, dass Sie etwas verdächtiges beseitigen, möchten Sie vielleicht auch KS die tatsächlichen Ziffern gegen stat.uniform(scale = 10) testen (um 1213141516171 und ähnliches zu beseitigen).

+0

Wenn ein 'Pandas' Zauberer meine beheben könnte Datenextraktion ('a = np.array...' ') Algorithmus um die Frage zu stellen, die ich ewig dankbar wäre. –

2

Als ersten Schritt würde ich die Barcodes in Validierungsmechanismus, die Prüfsumme eingebaut verwenden. Wie Ihre Barcodes erscheinen GTIN-Barcodes sein (insbesondere GTIN-13), können Sie this method verwenden:

>>> 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 
+0

Ausgezeichneter Punkt. Sie können wahrscheinlich den p-Wert in meiner Methode verringern, um falsche negative Ergebnisse zu reduzieren, wenn Sie zuerst die integrierte Fehlerprüfung in den Barcodes selbst verwenden. –

Verwandte Themen