2017-12-20 5 views
1

Ich habe ein Problem, ein paar Skripte miteinander zu kombinieren. Ich habe versucht, writer.writerow an ein paar verschiedenen Orten zu platzieren, aber mir sind die Ideen ausgegangen. Wie Sie aus der Ausgabe sehen können, durchläuft es die letzte Schleife und wiederholt die ersten beiden Schleifen, bis die dritte abgeschlossen ist, als auf die zweite. Vielen Dank für einen Blick!Schreiben mehrerer Anfragen an eine Csv mit Python

import csv 
import requests 
import os 

outfile = open("NHL_Home_Skater.csv","a",newline='') 
writer = csv.writer(outfile) 
writer.writerow(["Date","Player","PlayerId","Pos","TM","Opp","GameId","GP","G","A","Points","Shots","Spctg","PPG","PPP","SHG","SHP","TOI","Shifts","PIM","Player","GameId","BS","Give Aways","Take Aways","Missed Shots","Player","GameId","EvTOI","PpTOI","ShTOI"]) 

req = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=skatersummary&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data = req.json()['data'] 
for item in data: 
    Player = item['playerName'] 
    date = item['gameDate'] 
    Pos = item['playerPositionCode'] 
    TM = item['teamAbbrev'] 
    Opp = item['opponentTeamAbbrev'] 
    GameId = item['gameId'] 
    GP = item['gamesPlayed'] 
    G = item['goals'] 
    A = item['assists'] 
    Shots = item['shots'] 
    PIM = item['penaltyMinutes'] 
    PlayerId = item['playerId'] 
    Points = item['points'] 
    PPG = item['ppGoals'] 
    PPP = item['ppPoints'] 
    SHG = item['shGoals'] 
    SHP = item['shPoints'] 
    Shifts = item['shiftsPerGame'] 
    Spctg = item['shootingPctg'] 
    TOI = item['timeOnIcePerGame'] 

    writer.writerow([date,Player,PlayerId,Pos,TM,Opp,GameId,GP,G,A,Points,Shots,Spctg,PPG,PPP,SHG,SHP,TOI,Shifts,PIM]) 

    req2 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=realtime&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
    data2 = req2.json()['data'] 
    for item in data2: 
     Player2 = item['playerName'] 
     GameId2 = item['gameId'] 
     BS = item['blockedShots'] 
     GiveAways = item['giveaways'] 
     TakeAways = item['takeaways'] 
     MissedShots = item['missedShots'] 

     writer.writerow([Player,GameId,BS,GiveAways,TakeAways,MissedShots]) 

     req3 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=timeonice&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
     data3 = req3.json()['data'] 
     for item in data3: 
      Player3 = item['playerName'] 
      GameId3 = item['gameId'] 
      EvTOI = item['evTimeOnIce'] 
      PpTOI = item['ppTimeOnIce'] 
      ShTOI = item['shTimeOnIce'] 

      writer.writerow([Player, GameId, EvTOI, PpTOI, ShTOI]) 
outfile.close() 

Ouput:

2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 A.J. Greer 2017020165 373 0 0 
2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 A.J. Greer 2017020194 486 0 0 
2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 A.J. Greer 2017020134 498 4 0 
2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 Aaron Ekblad 2017020190 1035 88 126 

Neue Ausgabe:

Date Player PlayerId Pos TM Opp GameId GP G A Points Shots Spctg PPG PPP SHG SHP TOI Shifts PIM 

2017-11-02T23:00:00Z A.J. Greer 8478421 L COL CAR 2017020194 1 0 1 1 0 0 0 0 0 0 486 12 0 

2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0 0 0 0 0 373 10 2 

2017-10-24T23:00:00Z A.J. Greer 8478421 L COL DAL 2017020134 1 0 0 0 2 0 0 0 0 0 502 13 0 

Antwort

1

Dieses Problem aufgrund der Komplexität nicht schwer ist, sondern weil die Datenmenge groß ist (fast 10.000 Zeilen Daten), plus jede Zeile hat etwa 30 Spalten. Nachdem ich Ihren Code gelesen habe, glaube ich, dass ich verstehe, was Sie für Ihre Ausgabe wünschen: eine Kombination der 3 Datensätze. Hier ist mein Versuch:

import csv 
import os 
import requests 

outfile = open("NHL_Home_Skater.csv", 'a', newline='') 
writer = csv.writer(outfile) 
header=[ 
    "Date","Player","PlayerId","Pos","TM", 
    "Opp","GameId","GP","G","A", 
    "Points","Shots","Spctg","PPG","PPP", 
    "SHG","SHP","TOI", "Shifts", "PIM", 

    "Player2","GameId","BS","Give Aways","Take Aways", "Missed Shots", 
    "Player3","GameId","EvTOI","PpTOI","ShTOI"] 
writer.writerow(header) 

req = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=skatersummary&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data = req.json()['data'] 

req2 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=realtime&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data2 = req2.json()['data'] 

req3 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=timeonice&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data3 = req3.json()['data'] 

for item, item2, item3 in zip(data, data2, data3): 
    row = (
     item['gameDate'], 
     item['playerName'], 
     item['playerId'], 
     item['playerPositionCode'], 
     item['teamAbbrev'], 
     item['opponentTeamAbbrev'], 
     item['gameId'], 
     item['gamesPlayed'], 
     item['goals'], 
     item['assists'], 
     item['points'], 
     item['shots'], 
     item['shootingPctg'], 
     item['ppGoals'], 
     item['ppPoints'], 
     item['shGoals'], 
     item['shPoints'], 
     item['timeOnIcePerGame'], 
     item['shiftsPerGame'], 
     item['penaltyMinutes'], 

     item2['playerName'], 
     item2['gameId'], 
     item2['blockedShots'], 
     item2['giveaways'], 
     item2['takeaways'], 
     item2['missedShots'], 

     item3['playerName'], 
     item3['gameId'], 
     item3['evTimeOnIce'], 
     item3['ppTimeOnIce'], 
     item3['shTimeOnIce'], 
     ) 
    writer.writerow(row) 

Hinweise

  • Diese Lösung macht nur 3 Anfragen im Gegensatz zu mehreren zehn Millionen Anfragen
  • Basierend auf Ihren Code, gehe ich davon aus, dass die Zeilen in den drei Datensätze sind in der gleichen Reihenfolge, dh sie beziehen sich auf die gleiche Spieler-ID und Spiel-ID.
  • Für jede Zeile in den 3 Datensätzen habe ich eine Zeile mit 31 Spalten für die Ausgabe erstellt und schreibe es nur einmal pro Schleife aus.
  • Es gibt nur 1 Schleife, nicht 3 verschachtelte.
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, darüber zu schauen. Alles sieht gut aus, mit Ausnahme der leeren Zeile zwischen jeder Datenzeile. Ich habe oben mein New Ouput bearbeitet und ich habe mich gefragt, ob es einen Weg gibt, diese leeren Zeilen zu entfernen? –

+0

Jetzt verstehe ich, warum Sie 'newline = ''' in der 'open()' Anweisung haben. Lege es zurück und du bist fertig. –

+0

Jetzt mache ich auch, danke Hai! –