Skip to content

Instantly share code, notes, and snippets.

@Luzifer
Last active June 4, 2020 19:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Luzifer/62d3943ea2a081b7223356c2c373736a to your computer and use it in GitHub Desktop.
Save Luzifer/62d3943ea2a081b7223356c2c373736a to your computer and use it in GitHub Desktop.
Example code to read R from #RKI Nowcasting XLSX sheet
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
)
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