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)
Ich denke, dass es tat, @wpercy. Danke, dass du mich bei diesem Thema begleitet hast. – OnlyDean
Ich bin jedoch verwirrt durch das Verhalten von 'Timedelta'. Warum kann ich nicht einfach sagen: "Wenn Delta <= 3"? – OnlyDean
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