2017-01-27 1 views
1

Ich habe physische Geräte, die Teil eines Spiels sind. Die Spieler erhalten Punkte für die Aktivierung eines dieser Geräte. Ich versuche Logik einzubauen, um "Betrüger" zu markieren. Alle Aktivierungen eines Geräts zählen als ein Ereignis, wenn sie innerhalb von 2,5 Sekunden auftreten. Ich versuche, die Spanne eines "betrügerischen" Spielers zu identifizieren (jemand, der den Knopf nur schnell wieder und wieder knackt). In der Datenbank würde dies wie mehrere Zeilen mit den gleichen deviceAddress aussehen, mit eventValues von 3 oder 4 und mit eventTimes innerhalb von 3 Sekunden voneinander.Python & MySQL - finde alle Zeilen innerhalb von 3 Sekunden

Ich habe eine sehr harte Zeit zu versuchen, herauszufinden, wie Ereignisse innerhalb von 3 Sekunden zueinander passend finden. Hier ist die Fehlermeldung, die ich gerade erhalte:

if delta <= (timePreviousRow - timedelta(seconds=3)) and devPreviousRow == devThisRow: 
TypeError: can't compare datetime.timedelta to datetime.datetime 

Jede Hilfe würde sehr geschätzt werden.

Hier ist meine MySQL-Abfrage, auf die Variable cheatFinder:

SELECT 
eventTime, 
deviceAddress, 
node_id, 
eventType, 
eventValue, 
sequence 
FROM device_data 
WHERE eventTime >= DATE_SUB(NOW(), INTERVAL 1 DAY) 
AND eventType = 1 
AND eventValue BETWEEN 3 AND 4 
ORDER BY deviceAddress, eventTime; 

Hier sind die ersten 10 Ergebnisse:

+---------------------+------------------+------------+-----------+------------+----------+ 
| eventTime   | deviceAddress | node_id | eventType | eventValue | sequence | 
+---------------------+------------------+------------+-----------+------------+----------+ 
| 2017-01-26 21:19:03 |   776128 |  221 |   1 | 03   |  3 | 
| 2017-01-26 21:48:19 |   776128 |  221 |   1 | 03   |  4 | 
| 2017-01-27 06:45:50 |   776128 |  221 |   1 | 04   |  18 | 
| 2017-01-27 12:41:03 |   776128 |  221 |   1 | 03   |  24 | 
| 2017-01-26 23:03:18 |   6096372 |  301 |   1 | 03   |  119 | 
| 2017-01-27 00:21:47 |   6096372 |  301 |   1 | 03   |  120 | 
| 2017-01-26 23:50:27 |   27038894 |  157 |   1 | 03   |  139 | 
| 2017-01-27 01:19:42 |   29641083 |  275 |   1 | 03   |  185 | 
| 2017-01-27 00:10:13 |   30371381 |  261 |   1 | 03   |  82 | 
| 2017-01-27 00:53:45 |   30371381 |  261 |   1 | 03   |  87 | 
+---------------------+------------------+------------+-----------+------------+----------+ 

Hier ist die Python-Methode in Frage:

import mysql.connector 
import pandas 
from datetime import datetime,timedelta 

. . .  

def findBloodyCheaters(self): 
    self.cursor.execute(cheatFinder) 
    resultSet = self.cursor.fetchall() 
    targetDF = pandas.DataFrame(columns=['eventTime', 'deviceAddress', 'gateway_id', 'eventType', 'eventValue', 
             'sequence']) 
    timePreviousRow = None 
    devPreviousRow = None 
    for row in resultSetRaw: 
     if timePreviousRow is None and devPreviousRow is None: 
      timePreviousRow = row[0] 
      devPreviousRow = row[1] 
     elif timePreviousRow is not None and devPreviousRow is not None: 
      timeThisRow = row[0] 
      devThisRow = row[1] 
      delta = timePreviousRow - timeThisRow 
      print(delta) 
      if delta <= (timePreviousRow - timedelta(seconds=3)) and devPreviousRow == devThisRow: 
       targetDF.append(row) 
      timePreviousRow = timeThisRow 
      devPreviousRow = devThisRow 
      print(targetDF) 

Antwort

2

Dies passiert, weil Sie versuchen, delta zu vergleichen, die eineistObjekt zu (timePreviousRow - timedelta(seconds=3)) das ist ein datetime Objekt. Ich würde versuchen, delta zu vergleichen, um nur timedelta(seconds=3) so Ihr Code würde wie folgt aussehen:

if delta <= timedelta(seconds=3) and devPreviousRow == devThisRow: 
+0

Ich denke, dass es tat, @wpercy. Danke, dass du mich bei diesem Thema begleitet hast. – OnlyDean

+0

Ich bin jedoch verwirrt durch das Verhalten von 'Timedelta'. Warum kann ich nicht einfach sagen: "Wenn Delta <= 3"? – OnlyDean

+1

Weil 'delta' ein 'timedelta'-Objekt ist und' 3' eine ganze Zahl ist. Python ist nicht schlau genug, um zu wissen, dass "3" 3 Sekunden bedeuten soll. Es könnte 3 Stunden oder 3 Tage oder 3 Jahre bedeuten, also müssen Sie ihm genau sagen, was es zu vergleichen braucht (in diesem Fall ein 'timedelta'-Objekt mit einem Wert von 3 Sekunden – wpercy

Verwandte Themen