Checking a user's emails using an ID
Some thoughts:


You should strongly consider using appropriate datetime, timestamp, etc. column types when storing date and/or time information in your DB. Unix timestamps may seem simple for working with in PHP, but at some point you will have to query on those fields and having to convert to date/time entities in a query will disallow indexing on that field.
I am concerned that you don't store a flag to indicate if password reset has actually been used (i.e. user clicks on link in email).  Why would you care if a user reset their password 10 times in an hour if they actually completed the whole process each time (something a probing attacker would presumably not be able to do without access to email account)? I would be worried about the number of unused reset attempts.  I would actually also be more concerned with frequent activity coming from a single IP trying to submit different email addresses, but that may require more network-layer security controls.
I think you could simplify your approach by only looking for X number of unused requests within a given time frame. Perhaps 12 per week.  An automated attacker would violate this constraint potentially within seconds anyway, so I don't see why having different thresholds for different periods of time makes much sense, it only adds to complexity. You could possibly remove time threshold altogether and just limit it to X unused attempts total.  At that point you probably either have a legitimate attacker (not likely) or you have a user experience/confusion problem in your process where you might need to give the user more specific guidance, or put them in touch with support, or whatever.
You also may have need to mark a record as expired, that is if there are 10 unsuccessful requests, only the most recent one would actually still work.
I don't like fluent style when performing prepared statements used here, as I think you need to be able to try the prepare first and validate that it worked before trying to execute it.
Consider better name than $num_rows.  You are storing a database record (in this case an array with one element) there, not a row count.