Last active
June 4, 2020 19:38
-
-
Save Luzifer/62d3943ea2a081b7223356c2c373736a to your computer and use it in GitHub Desktop.
Example code to read R from #RKI Nowcasting XLSX sheet
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module github.com/Luzifer/rkiR | |
go 1.14 | |
require ( | |
github.com/pkg/errors v0.9.1 | |
github.com/sirupsen/logrus v1.6.0 | |
github.com/tealeg/xlsx v1.0.5 | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bytes" | |
"io" | |
"net/http" | |
"time" | |
"github.com/pkg/errors" | |
log "github.com/sirupsen/logrus" | |
"github.com/tealeg/xlsx" | |
) | |
const sourceURL = "https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Projekte_RKI/Nowcasting_Zahlen.xlsx?__blob=publicationFile" | |
const ( | |
colDateOfInfection = iota // Datum des Erkrankungsbeginns | |
colNewlyInfected // Punktschätzer der Anzahl Neuerkrankungen (ohne Glättung) | |
colNewlyInfectedLower // Untere Grenze des 95%-Prädiktionsintervalls der Anzahl Neuerkrankungen (ohne Glättung) | |
colNewlyInfectedUpper // Obere Grenze des 95%-Prädiktionsintervalls der Anzahl Neuerkrankungen (ohne Glättung) | |
colNewlyInfectedSmoothed // Punktschätzer der Anzahl Neuerkrankungen | |
colNewlyInfectedSmoothedLower // Untere Grenze des 95%-Prädiktionsintervalls der Anzahl Neuerkrankungen | |
colNewlyInfectedSmoothedUpper // Obere Grenze des 95%-Prädiktionsintervalls der Anzahl Neuerkrankungen | |
colR4 // Punktschätzer der Reproduktionszahl R | |
colR4Lower // Untere Grenze des 95%-Prädiktionsintervalls der Reproduktionszahl R | |
colR4Upper // Obere Grenze des 95%-Prädiktionsintervalls der Reproduktionszahl R | |
colR7 // Punktschätzer des 7-Tage-R Wertes | |
colR7Lower // Untere Grenze des 95%-Prädiktionsintervalls des 7-Tage-R Wertes | |
colR7Upper // Obere Grenze des 95%-Prädiktionsintervalls des 7-Tage-R Wertes | |
) | |
func main() { | |
t, r4, err := getRKIValue(colR4) | |
if err != nil { | |
log.WithError(err).Fatal("Unable to get R4") | |
} | |
log.Printf("%s R4=%.2f", t, r4) | |
} | |
func getRKIValue(col int) (time.Time, float64, error) { | |
resp, err := http.Get(sourceURL) | |
if err != nil { | |
return time.Time{}, 0, errors.Wrap(err, "Unable to request XLSX") | |
} | |
defer resp.Body.Close() | |
var buf = new(bytes.Buffer) | |
if _, err = io.Copy(buf, resp.Body); err != nil { | |
return time.Time{}, 0, errors.Wrap(err, "Unable to download XLSX") | |
} | |
f, err := xlsx.OpenBinary(buf.Bytes()) | |
if err != nil { | |
return time.Time{}, 0, errors.Wrap(err, "Unable to open XLSX") | |
} | |
var sheet = f.Sheet["Nowcast_R"] | |
if sheet == nil { | |
return time.Time{}, 0, errors.New("Nowcast_R sheet missing in file") | |
} | |
var mostRecentRow = sheet.Row(sheet.MaxRow - 1) | |
t, err := mostRecentRow.Cells[colDateOfInfection].GetTime(false) | |
if err != nil { | |
return time.Time{}, 0, errors.Wrap(err, "Unable to get entry date") | |
} | |
v, err := mostRecentRow.Cells[col].Float() | |
if err != nil { | |
return time.Time{}, 0, errors.Wrap(err, "Unable to get get value") | |
} | |
return t, v, nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment