Hey! First off thanks for providing all this data. I did find an issue when looking over the pbp data for 2017. It looks like some pass plays were labeled as pass attempts and sacks. Most of them tend to be plays that were challenges. Not sure if it's an issue with the NFL API or with how you are parsing the data, but I thought you should be aware of the problem. Below is a full list of the plays from the 2017 season, including data frame index (they are 0-based), game id and play description.
index: 800
GameID: 2017091005
play: (1:18) (No Huddle, Shotgun) T.Savage sacked at HOU 38 for -9 yards (M.Jackson). FUMBLES (M.Jackson), RECOVERED by JAX-T.Smith at HOU 46. T.Smith for 46 yards, TOUCHDOWN. The Replay Official reviewed the fumble ruling, and the play was REVERSED. (No Huddle, Shotgun) T.Savage pass incomplete short left to D.Hopkins (M.Jackson).
index: 5154
GameID: 2017091713
play: (14:17) (Shotgun) A.Rodgers sacked at GB 21 for -9 yards (V.Beasley). FUMBLES (V.Beasley) [V.Beasley], RECOVERED by ATL-D.Trufant at GB 15. D.Trufant for 15 yards, TOUCHDOWN. The Replay Official reviewed the backward pass ruling, and the play was Upheld. The ruling on the field stands.
index: 9269
GameID: 2017100106
play: (3:08) (Shotgun) M.Stafford pass incomplete short middle to Z.Zenner. Minnesota challenged the incomplete pass ruling, and the play was REVERSED. (Shotgun) M.Stafford sacked at DET 26 for -9 yards. FUMBLES, recovered by DET-Z.Zenner at DET 11. Z.Zenner to DET 11 for no gain (E.Kendricks).
index: 9997
GameID: 2017100104
play: (11:12) (Shotgun) D.Prescott sacked at DAL 18 for -4 yards (M.Brockers). FUMBLES (M.Brockers) [M.Brockers], RECOVERED by LA-M.Barron at DAL 29. M.Barron to DAL 29 for no gain (C.Beasley). The Replay Official reviewed the fumble ruling, and the play was REVERSED. (Shotgun) D.Prescott pass short middle intended for C.Beasley INTERCEPTED by M.Barron [M.Brockers] at DAL 33. M.Barron to DAL 29 for 4 yards (C.Beasley).
index: 10820
GameID: 2017100113
play: (3:38) (Shotgun) R.Wilson pass incomplete short middle to J.McKissic [N.Hairston]. Indianapolis challenged the incomplete pass ruling, and the play was REVERSED. (Shotgun) R.Wilson sacked in End Zone for -6 yards, SAFETY (N.Hairston).
index: 10830
GameID: 2017100113
play: (:09) R.Wilson pass short left to L.Willson to IND 31 for 19 yards (V.Davis; M.Farley) [J.Sheard]. Indianapolis challenged the pass completion ruling, and the play was REVERSED. R.Wilson sacked at SEA 47 for -3 yards (J.Sheard).
index: 11305
GameID: 2017100500
play: (2:39) (Shotgun) J.Winston FUMBLES (Aborted) at NE 45, and recovers at NE 48. J.Winston pass incomplete short left to A.Humphries. New England challenged the runner was not down by contact ruling, and the play was REVERSED. (Shotgun) J.Winston FUMBLES (Aborted) at NE 45, and recovers at NE 48. J.Winston sacked at NE 47 for -10 yards (D.Wise).
index: 14995
GameID: 2017101506
play: (1:52) B.Hoyer sacked at SF 6 for -7 yards (M.Foster). FUMBLES (M.Foster) [M.Foster], RECOVERED by WAS-D.Swearinger at SF 8. D.Swearinger for 8 yards, TOUCHDOWN. The Replay Official reviewed the fumble ruling, and the play was REVERSED. B.Hoyer pass incomplete short right [M.Foster].
index: 17219
GameID: 2017102204
play: (14:27) (No Huddle, Shotgun) J.Brissett pass incomplete short left to M.Mack [Y.Ngakoue]. Jacksonville challenged the incomplete pass ruling, and the play was REVERSED. (No Huddle, Shotgun) J.Brissett sacked at IND 9 for -14 yards (M.Jackson). FUMBLES (M.Jackson) [Y.Ngakoue], recovered by IND-A.Castonzo at IND 12. A.Castonzo to IND 12 for no gain (T.Smith). Credit a sack for minus-11 yards
index: 20434
GameID: 2017102908
play: (3:15) (Shotgun) R.Wilson pass incomplete short right to L.Willson (J.Clowney) [D.Reader]. Seattle challenged the incomplete pass ruling, and the play was REVERSED. (Shotgun) R.Wilson sacked at HOU 41 for -10 yards (J.Clowney). FUMBLES (J.Clowney) [D.Reader], recovered by SEA-L.Willson at HOU 20. L.Willson to HOU 20 for no gain (A.Hal).
index: 22630
GameID: 2017110507
play: (12:26) C.Beathard sacked at ARI 43 for -7 yards (K.Martin). FUMBLES (K.Martin), recovered by SF-K.Juszczyk at ARI 49. K.Juszczyk to ARI 49 for no gain (K.Martin). San Francisco challenged the fumble ruling, and the play was REVERSED. C.Beathard pass incomplete short right to M.Goodwin (K.Martin).
index: 24154
GameID: 2017111204
play: (3:44) B.Bortles pass short left to L.Fournette to JAX 43 for 20 yards (T.Boston). Los Angeles Chargers challenged the runner was not down by contact ruling, and the play was REVERSED. B.Bortles sacked at JAX 19 for -4 yards (K.Emanuel).
index: 35452
GameID: 2017121001
play: (1:41) (No Huddle, Shotgun) C.Keenum pass incomplete short left to J.McKinnon [J.Peppers]. The Replay Official reviewed the incomplete pass ruling, and the play was REVERSED. (No Huddle, Shotgun) C.Keenum sacked at MIN 37 for -6 yards (J.Peppers).
index: 37358
GameID: 2017121703
play: (13:21) (Shotgun) T.Yates sacked at HOU 12 for -6 yards (M.Jackson). FUMBLES (M.Jackson), RECOVERED by JAX-M.Jack at HOU 19. M.Jack for 19 yards, TOUCHDOWN. The Replay Official reviewed the fumble ruling, and the play was REVERSED. (Shotgun) T.Yates pass incomplete short middle to S.Anderson.
index: 41615
GameID: 2017122409
play: (7:54) B.Bortles sacked at 50 for -8 yards (D.Buckner). FUMBLES (D.Buckner) [D.Buckner], RECOVERED by SF-R.Foster at SF 33. The Replay Official reviewed the fumble ruling, and the play was REVERSED. B.Bortles pass incomplete short middle to K.Cole [D.Buckner].
index: 44082
GameID: 2017123112
play: (1:18) (Shotgun) P.Lynch sacked at DEN 30 for -7 yards (T.Kpassagnon).
index: 44100
GameID: 2017123112
play: (8:35) (No Huddle, Shotgun) P.Lynch sacked at KC 21 for -10 yards (T.Kpassagnon).