[PYTHON] Zeigen Sie den Status der COVID 19-Infektion in Japan mit Splunk an (GitHub-Version).

Ich habe die Abfrage mit den Daten von Toyo Keizai Online neu erstellt.

Veröffentlicht auf GitHub.

Es sind die Daten von "2020/03/11". Daher füllt Blasendiagramm usw. die fehlenden Daten mit dem neuesten Wert. : Schweiß: Was soll ich tun, wenn ich mich weigere, NHK-Daten öffentlich zu verwenden?

Da sich die Form der Daten geändert hat, bevor ich es wusste, habe ich auch den Text und den Github (2020/05/29) überarbeitet.

Daten bekommen

Holen Sie sich mit Python

dl_toyo.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json

headers={'accept': 'application/json', 'content-type': 'application/json'}

response = json.loads(requests.get('https://raw.githubusercontent.com/kaz-ogiwara/covid19/master/data/data.json', headers=headers).text)

print(json.dumps(response))

Ein einfaches Skript, das einfach anzeigt, was Sie von Github erhalten Diesmal habe ich versucht, es zum Zeitpunkt der Suche zu verarbeiten. : Schweiß: Das Ergebnis ist hart inputs.conf

inputs.conf


[script://$SPLUNK_HOME/etc/apps/covid19_japan/bin/dl_toyo.py]
disabled = false
python.version = python3
interval = 43200
sourcetype = toyo_json
source = toyodata.json

Diesmal einmal alle 12 Stunden CRON sollte auch verwendbar sein

Um zu überprüfen, ob es ausgeführt wurde

Bestätigen Sie die Skriptausführung


index=_internal dl_toyo.py sourcetype=splunkd

Ausführungsergebnis


04-26-2020 06:38:33.161 +0900 INFO  ExecProcessor - New scheduled exec process: /Applications/Splunk/bin/python3.7 /Applications/Splunk/etc/apps/covid19_japan/bin/dl_toyo.py

props.conf

props.conf


[toyo_json]
TIME_PREFIX = Last\supdated:\s
TIME_FORMAT = %d %B %Y
INDEXED_EXTRACTIONS = json
KV_MODE = none
LINE_BREAKER = ([\r\n]+)
NO_BINARY_CHECK = true
category = Structured
description = json
disabled = false
pulldown_type = true
SHOULD_LINEMERGE = false
TRUNCATE = 0

In Bezug auf die Uhrzeit habe ich versucht, das Datenaktualisierungsdatum anstelle des Erfassungsdatums zu verwenden. Es ist jedoch gut oder schlecht, weil ich bei der Suche "all time" verwenden musste.

Ich denke, Sie können auch "DATETIME_CONFIG = CURRENT" sagen. Ich habe versucht, "INDEXED_EXTRACTIONS" zu setzen, aber ich benutze es doch nicht, daher gibt es kein Problem mit "none" zusammen mit "KV_MODE".

Abrufen und Verarbeiten von Daten für Chropleth Map

Bitte bereiten Sie sich unter Bezugnahme auf [Vorheriger Artikel] vor (https://qiita.com/toshikawa/items/d7c6f43016fd440508ed#choropleth-map).

Erstellen eines Dashboards (korrigiert 5/29)

covid19_in_japan.xml


<dashboard theme="dark">
  <label>COVID-19 in Japan</label>
  <search id="base">
    <query>sourcetype=toyo_json
| head 1</query>
    <earliest>0</earliest>
    <latest></latest>
  </search>
  <search base="base" id="base1">
    <query>
| rex "prefectures-data.*?(?&lt;data&gt;{.*?})"
| rex field=data "carriers.*?\[(?&lt;carriers&gt;\[.*?\])\]"
| rex max_match=0 field=carriers "(?&lt;daily&gt;\[[^\[\]]+\])"
| spath prefectures-map{} output=prefectures_map
| eval sorter=mvrange(0,mvcount(daily))
| eval daily=mvzip(sorter,daily)
| stats list(prefectures_map) as prefectures_map by daily
| mvexpand prefectures_map
| spath input=prefectures_map
| table daily code ja
| eval ja=code."_".ja
| xyseries daily ja code
| foreach *_* [ eval &lt;&lt;FIELD&gt;&gt; = mvindex(split(daily,","),'&lt;&lt;FIELD&gt;&gt;')]
| untable daily pref count
| eval daily=mvindex(split(daily,","),0)
| sort daily pref
| eval _time = if(daily=0,strptime("2020-03-11","%F"),relative_time(strptime("2020-03-11","%F"),("+".daily."d@d")))
| rex field=count "(?&lt;count&gt;\d+)"
| xyseries _time pref count
| rename COMMENT as "Hier wird es einmal im Feld des Präfekturnamens erstellt. Sortiert von hier in der Reihenfolge von Hokkaido"
</query>
  </search>
  <row>
    <panel>
      <html>Dieses Dashboard ist Toyo Keizai Online(<a href="https://toyokeizai.net/sp/visual/tko/covid19/">https://toyokeizai.net/sp/visual/tko/covid19/</a>)Ich benutze die Daten von.</html>
    </panel>
  </row>
  <row>
    <panel>
      <title>zuletzt aktualisiert: $lastUpdate$</title>
      <single>
        <title>Anzahl der infizierten Personen</title>
        <search base="base1" id="base2">
          <query>
| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| transpose 0 header_field=pref column_name=_time
| rename COMMENT as "Zeit hier+Tabelle der Präfekturnamen" 
| addtotals
| eventstats max(_time) as time
| eval time=strftime(time,"%F")
| fields _time Total time</query>
          <done>
            <set token="lastUpdate">$result.time$</set>
          </done>
        </search>
        <option name="drilldown">none</option>
      </single>
      <table>
        <title>Zunehmende Infektionsrate</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Bis zu diesem Zeitpunkt werden der Name der Präfektur und die täglichen kumulativen Daten erstellt, und NHK-Abfragen können hier endlich verwendet werden."
| rename pref as _pref
| transpose 0 header_field=_pref column_name=_time
| sort _time
| tail 2
| reverse
| eval _time=strftime(_time,"%F")
| transpose 0 header_field=_time column_name=_pref
| foreach * [eval tmp=mvappend(tmp,'&lt;&lt;FIELD&gt;&gt;'), first = max(tmp) , second = min(tmp)
| eval daily_incr = if(isnull(nullif(second,0)), round(first * 100.00,2), round((first -second) / second * 100,2))]
| eval daily_count = first - second
| sort - daily_incr
| fields - first second tmp
| rename _pref as "Präfekturen", daily_incr as "Zunahme", daily_count as "Anzahl der täglich infizierten Personen"
|Tischpräfektur*Zunehmende Rate an täglichen Infektionen</query>
        </search>
        <option name="drilldown">none</option>
        <option name="refresh.display">progressbar</option>
        <format type="number" field="Zunahme">
          <option name="unit">%</option>
        </format>
      </table>
    </panel>
    <panel>
      <map>
        <search>
          <query>sourcetype=toyo_json
| head 1
| spath prefectures-map{} output=prefectures_map
| stats count by prefectures_map
| spath input=prefectures_map
| table code ja en value
| sort - value
| geom japansimple featureIdField=en
| fields - code ja</query>
          <earliest>0</earliest>
          <latest></latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="drilldown">none</option>
        <option name="height">600</option>
        <option name="mapping.choroplethLayer.colorMode">categorical</option>
        <option name="mapping.map.center">(38.62,137.55)</option>
        <option name="mapping.map.zoom">5</option>
        <option name="mapping.type">choropleth</option>
      </map>
    </panel>
  </row>
  <row>
    <panel>
      <chart>
        <title>Tägliche Infektionsrate</title>
        <search base="base2">
          <query>
| streamstats count(_time) as days
| fields _time Total days
| rename "Total" as "Total Cases" 
| eval "Overall Infection Rate"='Total Cases'/days
| eventstats max("Overall Infection Rate") as "Maximum Infection Rate"
| rename "Total Cases" as "TotalCases"
| streamstats current=f window=2 last(TotalCases) as last 
| eval perc_incr=((TotalCases-last)/last)*100 
| rename TotalCases as "Total Cases", perc_incr as "Daily Infection Rate" 
| fields - last 
| fields _time "Total Cases"  "Daily Infection Rate"</query>
        </search>
        <option name="charting.axisY2.enabled">1</option>
        <option name="charting.chart">area</option>
        <option name="charting.chart.overlayFields">"Total Cases"</option>
        <option name="charting.drilldown">none</option>
        <option name="charting.legend.placement">bottom</option>
        <option name="height">600</option>
      </chart>
    </panel>
    <panel>
      <chart>
        <title>Top 10 Infizierte Anzahl der täglich Infizierten in Präfekturen * 2020/3/3 vor 11/Interpolieren Sie mit einer Zahl von 11</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Bis zu diesem Zeitpunkt werden der Name der Präfektur und die täglichen kumulativen Daten erstellt, und NHK-Abfragen können hier endlich verwendet werden."
| rename pref as _pref
| foreach * [eval Check=max('&lt;&lt;FIELD&gt;&gt;')]
| sort 10 - Check
| fields - Check
| transpose 0 header_field=_pref column_name=_time
| rename COMMENT as "Ich mache es seit dem Tag, als die erste infizierte Person herauskam."
| append [|makeresults
| eval _time = strptime("2020-01-16","%F")]
| makecontinuous _time span=1d
| reverse
| streamstats count(eval(isnull('Tokio'))) as _count
| filldown
| foreach * [eval &lt;&lt;FIELD&gt;&gt; = if(_count=0,'&lt;&lt;FIELD&gt;&gt;', round('&lt;&lt;FIELD&gt;&gt;' / _count))]
| reverse
| rename COMMENT as "Leer ist der erste Wert, 2020/3/Es wird mit dem berechneten Wert aus dem Wert 11 gefüllt."
| untable _time pref count
| sort _time
| streamstats count as days by pref
| streamstats current=f max(count) as prev by pref
| eval daily_count = count - prev
| table pref days count daily_count
| sort 0 - count</query>
        </search>
        <option name="charting.chart">bubble</option>
        <option name="charting.chart.bubbleMaximumSize">30</option>
        <option name="charting.chart.bubbleMinimumSize">5</option>
        <option name="charting.drilldown">none</option>
        <option name="charting.legend.placement">bottom</option>
        <option name="height">600</option>
        <option name="refresh.display">progressbar</option>
      </chart>
    </panel>
  </row>
</dashboard>
Das Datenformat wurde geändert, daher wurde es behoben. Klicken Sie hier für die vorherige SimpleXml

covid19_in_japan.xml


<dashboard theme="dark">
  <label>COVID-19 in Japan</label>
  <search id="base">
    <query>sourcetype=toyo_json
| head 1</query>
    <earliest>0</earliest>
    <latest></latest>
  </search>
  <search base="base" id="base1">
    <query>
| rex "prefectures-data.*?(?&lt;data&gt;{.*?})"
| rex field=data "carriers.*?\[(?&lt;carriers&gt;\[.*?\])\]"
| rex max_match=0 field=carriers "(?&lt;daily&gt;\[[^\[\]]+\])"
| spath prefectures-map{} output=prefectures_map
| stats count list(prefectures_map) as pref by daily
| eval date=mvindex(split(trim(daily,"[]"),","),0,2) , data=mvindex(split(trim(daily,"[]"),","),3,-1)
| eval _time=strptime(mvjoin(date,""),"%Y%m%d")
| mvexpand data
| table _time data count pref
| streamstats count  
| eval count = nullif(count % 47,0) | fillnull count value=47
| eval data=trim(data) ,pref=mvindex(pref,count-1)
| spath input=pref
| eval ja=code."_".ja
| table _time ja data
| sort 0 - _time data
| xyseries _time ja data
| rename COMMENT as "Hier wird es einmal im Feld des Präfekturnamens erstellt. Sortiert von hier in der Reihenfolge von Hokkaido"
</query>
  </search>
  <row>
    <panel>
      <html>Dieses Dashboard ist Toyo Keizai Online(<a href="https://toyokeizai.net/sp/visual/tko/covid19/">https://toyokeizai.net/sp/visual/tko/covid19/</a>)Ich benutze die Daten von.</html>
    </panel>
  </row>
  <row>
    <panel>
      <title>zuletzt aktualisiert: $lastUpdate$</title>
      <single>
        <title>Anzahl der infizierten Personen</title>
        <search base="base1" id="base2">
          <query>
| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| transpose 0 header_field=pref column_name=_time
| rename COMMENT as "Zeit hier+Tabelle der Präfekturnamen" 
| addtotals
| eventstats max(_time) as time
| eval time=strftime(time,"%F")
| fields _time Total time</query>
          <done>
            <set token="lastUpdate">$result.time$</set>
          </done>
        </search>
        <option name="drilldown">none</option>
      </single>
      <table>
        <title>Zunehmende Infektionsrate</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Bis zu diesem Zeitpunkt werden der Name der Präfektur und die täglichen kumulativen Daten erstellt, und NHK-Abfragen können hier endlich verwendet werden."
| rename pref as _pref
| transpose 0 header_field=_pref column_name=_time
| sort _time
| tail 2
| reverse
| eval _time=strftime(_time,"%F")
| transpose 0 header_field=_time column_name=_pref
| foreach * [eval tmp=mvappend(tmp,'&lt;&lt;FIELD&gt;&gt;'), first = max(tmp) , second = min(tmp)
| eval daily_incr = if(isnull(nullif(second,0)), round(first * 100.00,2), round((first -second) / second * 100,2))]
| eval daily_count = first - second
| sort - daily_incr
| fields - first second tmp
| rename _pref as "Präfekturen", daily_incr as "Zunahme", daily_count as "Anzahl der täglich infizierten Personen"
|Tischpräfektur*Zunehmende Rate an täglichen Infektionen</query>
        </search>
        <option name="drilldown">none</option>
        <option name="refresh.display">progressbar</option>
        <format type="number" field="Zunahme">
          <option name="unit">%</option>
        </format>
      </table>
    </panel>
    <panel>
      <map>
        <search>
          <query>sourcetype=toyo_json
| head 1
| spath prefectures-map{} output=prefectures_map
| stats count by prefectures_map
| spath input=prefectures_map
| table code ja en value
| sort - value
| geom japansimple featureIdField=en
| fields - code ja</query>
          <earliest>0</earliest>
          <latest></latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="drilldown">none</option>
        <option name="height">600</option>
        <option name="mapping.choroplethLayer.colorMode">categorical</option>
        <option name="mapping.map.center">(38.62,137.55)</option>
        <option name="mapping.map.zoom">5</option>
        <option name="mapping.type">choropleth</option>
      </map>
    </panel>
  </row>
  <row>
    <panel>
      <chart>
        <title>Tägliche Infektionsrate</title>
        <search base="base2">
          <query>
| streamstats count(_time) as days
| fields _time Total days
| rename "Total" as "Total Cases" 
| eval "Overall Infection Rate"='Total Cases'/days
| eventstats max("Overall Infection Rate") as "Maximum Infection Rate"
| rename "Total Cases" as "TotalCases"
| streamstats current=f window=2 last(TotalCases) as last 
| eval perc_incr=((TotalCases-last)/last)*100 
| rename TotalCases as "Total Cases", perc_incr as "Daily Infection Rate" 
| fields - last 
| fields _time "Total Cases"  "Daily Infection Rate"</query>
        </search>
        <option name="charting.axisY2.enabled">1</option>
        <option name="charting.chart">area</option>
        <option name="charting.chart.overlayFields">"Total Cases"</option>
        <option name="charting.drilldown">none</option>
        <option name="charting.legend.placement">bottom</option>
        <option name="height">600</option>
      </chart>
    </panel>
    <panel>
      <chart>
        <title>Top 10 Infizierte Anzahl der täglich Infizierten in Präfekturen * 2020/3/3 vor 11/Interpolieren Sie mit einer Zahl von 11</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Bis zu diesem Zeitpunkt werden der Name der Präfektur und die täglichen kumulativen Daten erstellt, und NHK-Abfragen können hier endlich verwendet werden."
| rename pref as _pref
| foreach * [eval Check=max('&lt;&lt;FIELD&gt;&gt;')]
| sort 10 - Check
| fields - Check
| transpose 0 header_field=_pref column_name=_time
| rename COMMENT as "Ich mache es seit dem Tag, als die erste infizierte Person herauskam."
| append [|makeresults
| eval _time = strptime("2020-01-16","%F")]
| makecontinuous _time span=1d
| reverse
| streamstats count(eval(isnull('Tokio'))) as _count
| filldown
| foreach * [eval &lt;&lt;FIELD&gt;&gt; = if(_count=0,'&lt;&lt;FIELD&gt;&gt;', round('&lt;&lt;FIELD&gt;&gt;' / _count))]
| reverse
| rename COMMENT as "Leer ist der erste Wert, 2020/3/Es wird mit dem berechneten Wert aus dem Wert 11 gefüllt."
| untable _time pref count
| sort _time
| streamstats count as days by pref
| streamstats current=f max(count) as prev by pref
| eval daily_count = count - prev
| table pref days count daily_count
| sort 0 - count</query>
        </search>
        <option name="charting.chart">bubble</option>
        <option name="charting.chart.bubbleMaximumSize">30</option>
        <option name="charting.chart.bubbleMinimumSize">5</option>
        <option name="charting.drilldown">none</option>
        <option name="charting.legend.placement">bottom</option>
        <option name="height">600</option>
        <option name="refresh.display">progressbar</option>
      </chart>
    </panel>
  </row>
</dashboard>

covid19_in_japan.png

Über Daten

JSON mit einer tiefen Hierarchie aus Splunks Sicht. In der Welt des Javascript, das mit einem Array abgerufen wird, wäre es leicht zu handhaben, aber es ist fast ein Albtraum von Splunk.

Liste der Präfekturnamen


sourcetype=toyo_json
| head 1
| spath prefectures-map{} output=prefectures_map
| stats count by prefectures_map
| spath input=prefectures_map
| table code ja en 
| sort code

Ich kann es immer noch gehorsam herausnehmen. Andere Daten sind ziemlich schwierig.

Hier ist eine Abfrage, die dieselbe Form hat wie unter Verwendung von NHK-Daten.

Tägliche Statistik (kumulierter Wert)

Tägliche Statistiken(Kumulativer Wert)


sourcetype=toyo_json
| head 1 |  rex "prefectures-data.*?(?<data>{.*?})"
| rex field=data "carriers.*?\[(?<carriers>\[.*?\])\]"
| rex max_match=0 field=carriers "(?<daily>\[[^\[\]]+\])"
| spath prefectures-map{} output=prefectures_map
| eval sorter=mvrange(0,mvcount(daily))
| eval daily=mvzip(sorter,daily)
| stats list(prefectures_map) as prefectures_map by daily
| mvexpand prefectures_map
| spath input=prefectures_map
| table daily code ja
| eval ja=code."_".ja
| xyseries daily ja code
| foreach *_* [ eval <<FIELD>> = mvindex(split(daily,","),'<<FIELD>>')]
| untable daily pref count
| eval daily=mvindex(split(daily,","),0)
| sort daily pref
| eval _time = if(daily=0,strptime("2020-03-11","%F"),relative_time(strptime("2020-03-11","%F"),("+".daily."d@d")))
| rex field=count "(?<count>\d+)"
| xyseries _time pref count
| rename COMMENT as "Hier wird es einmal im Feld des Präfekturnamens erstellt. Sortiert von hier in der Reihenfolge von Hokkaido"
| rename COMMENT as "Dies ist die Basissuche nach anderen Panels "base1""

| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| transpose 0 header_field=pref column_name=_time

qiita1.png

Kommentar

  • Geben Sie nur die neuesten Daten mit "Kopf 1" an
  • Um die Anzahl der infizierten Personen zu extrahieren, werden Präfekturdaten einmal extrahiert, und dann werden Träger mit einem regulären Ausdruck extrahiert.
    Das Datenformat sind die ersten drei Daten und die kumulierten Wertdaten jeder Präfektur.

data


[118, 0, 0, 1, 2, 0, 1, 0, 2, 1, 12, 25, 73, 43, 11, 0, 7, 0, 2, 3, 2, 2, 104, 2, 1, 15, 81, 35, 8, 14, 0, 0, 0, 1, 3, 1, 0, 2, 12, 3, 0, 0, 6, 1, 1, 0, 3]

--Diese Daten und der durch "spath" ausgeschnittene Präfekturname werden mit "stats" extrahiert.

  • Da die Datumsdaten nicht mehr vorhanden sind, habe ich eine Nummer zum Sortieren hinzugefügt.
  • Extrahieren Sie nur die erforderlichen Felder mit "Statistiken" ――In diesem Stadium ist pref mehrwertig, daher wird es nach mvexpand in Daten von 47 Präfekturen mit xyseries konvertiert. ..
  • Da pref auch JSON ist, werde ich "spath" und nummerieren, um es später zu sortieren.
  • Die Form wird im Stadium der "xy-Reihe" gebildet. Die Bestellung ist jedoch nicht in Ordnung ――Wiederholen von "transponieren", ist die Bestellung von Hokkaido. Es wird vorerst die Basisabfrage sein.

Erläuterung der Komponenten des Dashboards

Von hier aus erkläre ich jedes Panel des Dashboards
Die Basissuche entfällt.

Anzahl der infizierten Personen und Aktualisierungsdatum

Anzahl der infizierten Personen und Aktualisierungsdatum


    <panel>
      <title>zuletzt aktualisiert: $lastUpdate$</title>
      <single>
        <title>Anzahl der infizierten Personen</title>
        <search base="base1" id="base2">
          <query>
| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| transpose 0 header_field=pref column_name=_time
| rename COMMENT as "Zeit hier+Tabelle der Präfekturnamen" 
| addtotals
| eventstats max(_time) as time
| eval time=strftime(time,"%F")
| fields _time Total time</query>
          <done>
            <set token="lastUpdate">$result.time$</set>
          </done>
        </search>
        <option name="drilldown">none</option>
      </single>

Der Wert von Total wird angezeigt Ich habe ein weiteres Feld erstellt, um time im Bedienfeld anzuzeigen. Wenn Sie sich mit der Epochenzeit befassen, verwenden Sie "max" "min" anstelle von "frühestens" "spätestens", da der Betrieb stabil ist. Ich habe es vorher überprüft.

Zunehmende Infektionsrate

Zunehmende Infektionsrate


      <table>
        <title>Zunehmende Infektionsrate</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Bis zu diesem Zeitpunkt werden der Name der Präfektur und die täglichen kumulativen Daten erstellt, und NHK-Abfragen können hier endlich verwendet werden."
| rename pref as _pref
| transpose 0 header_field=_pref column_name=_time
| sort _time
| tail 2
| reverse
| eval _time=strftime(_time,"%F")
| transpose 0 header_field=_time column_name=_pref
| foreach * [eval tmp=mvappend(tmp,'&lt;&lt;FIELD&gt;&gt;'), first = max(tmp) , second = min(tmp)
| eval daily_incr = if(isnull(nullif(second,0)), round(first * 100.00,2), round((first -second) / second * 100,2))]
| eval daily_count = first - second
| sort - daily_incr
| fields - first second tmp
| rename _pref as "Präfekturen", daily_incr as "Zunahme", daily_count as "Anzahl der täglich infizierten Personen"
|Tischpräfektur*Zunehmende Rate an täglichen Infektionen</query>
        </search>
        <option name="drilldown">none</option>
        <option name="refresh.display">progressbar</option>
        <format type="number" field="Zunahme">
          <option name="unit">%</option>
        </format>
      </table>

Erläuterung der Steigerungsrate der Anzahl infizierter Personen

: Schweiß: Ich habe einen Kommentar hinterlassen. Weitere Informationen finden Sie unter Vorheriger Artikel. Die Anzeige ist wunderschön, da der japanische Feldname und "%" als Einheit verwendet werden.

Cholopreth Map

Choloprethmap


sourcetype=toyo_json
| head 1
| spath prefectures-map{} output=prefectures_map
| stats count by prefectures_map
| spath input=prefectures_map
| table code ja en value
| sort - value
| geom japansimple featureIdField=en
| fields - code ja

Dies kann übersichtlich angezeigt werden, da die Daten die Namen der Präfekturen in Englisch und Japanisch enthalten.

Daily Infection Rate

DailyInfectionRate


    <panel>
      <chart>
        <title>Tägliche Infektionsrate</title>
        <search base="base2">
          <query>
| streamstats count(_time) as days
| fields _time Total days
| rename "Total" as "Total Cases" 
| eval "Overall Infection Rate"='Total Cases'/days
| eventstats max("Overall Infection Rate") as "Maximum Infection Rate"
| rename "Total Cases" as "TotalCases"
| streamstats current=f window=2 last(TotalCases) as last 
| eval perc_incr=((TotalCases-last)/last)*100 
| rename TotalCases as "Total Cases", perc_incr as "Daily Infection Rate" 
| fields - last 
| fields _time "Total Cases"  "Daily Infection Rate"</query>
        </search>
        <option name="charting.axisY2.enabled">1</option>
        <option name="charting.chart">area</option>
        <option name="charting.chart.overlayFields">"Total Cases"</option>
        <option name="charting.drilldown">none</option>
        <option name="charting.legend.placement">bottom</option>
        <option name="height">600</option>
      </chart>
    </panel>

Tägliche Infektionsrate in Honke Grundsätzlich überlagert Area Chart den Wert von Total Cases mit Line Chart.

Bubble Chart

BubbleChart


      <chart>
        <title>Top 10 Infizierte Anzahl der täglich Infizierten in Präfekturen * 2020/3/3 vor 11/Interpolieren Sie mit einer Zahl von 11</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Bis zu diesem Zeitpunkt werden der Name der Präfektur und die täglichen kumulativen Daten erstellt, und NHK-Abfragen können hier endlich verwendet werden."
| rename pref as _pref
| foreach * [eval Check=max('&lt;&lt;FIELD&gt;&gt;')]
| sort 10 - Check
| fields - Check
| transpose 0 header_field=_pref column_name=_time
| rename COMMENT as "Ich mache es seit dem Tag, als die erste infizierte Person herauskam."
| append [|makeresults
| eval _time = strptime("2020-01-16","%F")]
| makecontinuous _time span=1d
| reverse
| streamstats count(eval(isnull('Tokio'))) as _count
| filldown
| foreach * [eval &lt;&lt;FIELD&gt;&gt; = if(_count=0,'&lt;&lt;FIELD&gt;&gt;', round('&lt;&lt;FIELD&gt;&gt;' / _count))]
| reverse
| rename COMMENT as "Leer ist der erste Wert, 2020/3/Es wird mit dem berechneten Wert aus dem Wert 11 gefüllt."
| untable _time pref count
| sort _time
| streamstats count as days by pref
| streamstats current=f max(count) as prev by pref
| eval daily_count = count - prev
| table pref days count daily_count
| sort 0 - count</query>
        </search>
        <option name="charting.chart">bubble</option>
        <option name="charting.chart.bubbleMaximumSize">30</option>
        <option name="charting.chart.bubbleMinimumSize">5</option>
        <option name="charting.drilldown">none</option>
        <option name="charting.legend.placement">bottom</option>
        <option name="height">600</option>
        <option name="refresh.display">progressbar</option>
      </chart>

Einmal mit nur bestimmten Daten erstellt, ist das Gefühl eines plötzlichen Anstiegs verschwunden. Aus diesem Grund haben wir ein Datum ab "2020/01/16" erstellt, an dem die Anzahl der infizierten Personen bestätigt wurde, und den Rohling schrittweise vom neuesten Wert (nicht: Schweiß :) gesenkt. Die Größe des Kreises ist die Anzahl der infizierten Personen pro Tag.

Andere

Was ich versucht habe zu machen, aber in Bezug auf das Layout gestoppt Area Chart

Top 10 Präfekturen in der täglichen Statistik(Kumulativer Wert)


sourcetype=toyo_json
| head 1
| rex "prefectures-data.*?(?<data>{.*?})"
| rex field=data "carriers.*?\[(?<carriers>\[.*?\])\]"
| rex max_match=0 field=carriers "(?<daily>\[[^\[\]]+\])"
| spath prefectures-map{} output=prefectures_map
| stats count list(prefectures_map) as pref by daily
| eval date=mvindex(split(trim(daily,"[]"),","),0,2) , data=mvindex(split(trim(daily,"[]"),","),3,-1)
| eval _time=strptime(mvjoin(date,""),"%Y%m%d")
| mvexpand data
| table _time data count pref
| streamstats count  
| eval count = nullif(count % 47,0) | fillnull count value=47
| eval data=trim(data) ,pref=mvindex(pref,count-1)
| spath input=pref
| eval ja=code."_".ja
| table _time ja data
| sort 0 - _time data
| xyseries _time ja data
| rename COMMENT as "Hier wird es einmal im Feld des Präfekturnamens erstellt. Sortiert von hier in der Reihenfolge von Hokkaido"
| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Bis zu diesem Zeitpunkt werden der Name der Präfektur und die täglichen kumulativen Daten erstellt, und NHK-Abfragen können hier endlich verwendet werden."
| rename pref as _pref
| foreach * [eval Check=max('<<FIELD>>')]
| sort 10 - Check
| fields - Check
| transpose 0 header_field=_pref column_name=_time
| sort _time

Es wäre schön, es im Stapelmodus des Flächendiagramms anzuzeigen.

Gepostet auf GitHub

Die Verzeichnisstruktur ist wie folgt

Covid19_in_japan


.
├── bin
│   ├── README
│   └── dl_toyo.py
├── default
│   ├── app.conf
│   └── data
│       └── ui
│           ├── nav
│           │   └── default.xml
│           └── views
│               └── README
├── local
│   ├── app.conf
│   ├── data
│   │   └── ui
│   │       └── views
│   │           └── covid19_in_japan.xml
│   ├── inputs.conf
│   ├── props.conf
│   └── transforms.conf
├── lookups
│   ├── japansimple
│   │   ├── grid.key
│   │   ├── grid.val
│   │   ├── ray.key
│   │   ├── ray.t.key
│   │   ├── ray.t.val
│   │   ├── ray.val
│   │   ├── seg.key
│   │   ├── seg.t.key
│   │   ├── seg.t.val
│   │   └── seg.val
│   └── japansimple.kml
└── metadata
    ├── default.meta
    └── local.meta

https://github.com/to4kawa/Covid19_in_japan Ich habe ein Repository erstellt und alle Dateien verschoben, um README.md zu erstellen.

: Schweiß: Ich hoffe es bewegt sich ohne Probleme.

Zusammenfassung

Ich konnte es vorerst tun. Erstellen Sie Apps und erstellen Sie einen Suchordner

Ordner Datei
$SPLUNK_HOME/etc/apps/{app_name}/local/ inputs.conf
props.conf
$SPLUNK_HOME/etc/apps/{app_name}/bin dl_toyo.py
$SPLUNK_HOME/etc/apps/{app_name}/lookups prefecture.csv
$SPLUNK_HOME/etc/apps/{app_name}/local/data/ui/views covid19_in_japan.xml
(Dashboard-Datei)

Es sollte funktionieren, wenn Sie platzieren. Bitte setzen Sie außerdem zuerst japansimple.kml.

Was JSON betrifft, habe ich Splunk bisher verwendet, es war also ziemlich gut, aber ich denke, dass es einfacher ist, es auf der Python-Seite zu verarbeiten.

Die auf GitHub veröffentlichte ist "japansimple.kml" beigefügt. Da ich Macosx bin, arbeite ich nicht unter Windows. Zumindest die Beschreibung im Verzeichnis "inputs.conf" muss geändert werden. : Schweiß: Was soll ich hier machen?

Recommended Posts