[PYTHON] Afficher le statut de l'infection COVID 19 au Japon avec Splunk (version GitHub)

J'ai recréé la requête en utilisant les données de Toyo Keizai Online.

Publié sur GitHub.

Ce sont les données du «2020/03/11». Par conséquent, Bubble Chart, etc. remplit les données manquantes avec la dernière valeur. : sweat: Que dois-je faire si je refuse d'utiliser les données NHK publiquement?

De plus, comme la forme des données avait changé avant que je ne le sache, le texte et le github ont également été révisés (2020/05/29).

Obtenez des données

Obtenir par 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))

Un script simple qui affiche simplement les données récupérées depuis github Cette fois, j'ai essayé de le traiter au moment de la recherche. : sueur: le résultat est dur 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

Cette fois toutes les 12 heures CRON doit également être utilisable

Pour vérifier s'il a été exécuté

Confirmer l'exécution du script


index=_internal dl_toyo.py sourcetype=splunkd

Résultat d'exécution


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

Concernant l'heure, j'ai essayé d'utiliser la date de mise à jour des données au lieu de la date d'acquisition. Cependant, c'est bon ou mauvais car j'ai dû utiliser "all time" lors de la recherche.

Je pense que vous pouvez également dire DATETIME_CONFIG = CURRENT. J'ai essayé de mettre ʻINDEXED_EXTRACTIONS, mais je ne l'utilise pas après tout, donc il n'y a pas de problème avec aucunavecKV_MODE`.

Obtention et traitement des données pour Chropleth Map

Veuillez vous préparer en vous référant à Article précédent.

Création d'un tableau de bord (corrigé le 29/05)

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 "Ici, il est créé une fois dans le champ du nom de la préfecture. Trié d'ici par ordre de Hokkaido"
</query>
  </search>
  <row>
    <panel>
      <html>Ce tableau de bord est Toyo Keizai Online(<a href="https://toyokeizai.net/sp/visual/tko/covid19/">https://toyokeizai.net/sp/visual/tko/covid19/</a>)J'utilise les données de.</html>
    </panel>
  </row>
  <row>
    <panel>
      <title>dernière mise à jour: $lastUpdate$</title>
      <single>
        <title>Nombre de personnes infectées</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 "Temps ici+Tableau des noms de préfecture" 
| 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>Augmentation du taux de personnes infectées</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Jusque-là, le nom de la préfecture et les données cumulées quotidiennes sont créés, et les requêtes NHK peuvent enfin être utilisées ici."
| 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éfectures", daily_incr as "Taux d'augmentation", daily_count as "Nombre de personnes infectées quotidiennement"
|préfecture de table*Augmentation du taux d'infections quotidiennes</query>
        </search>
        <option name="drilldown">none</option>
        <option name="refresh.display">progressbar</option>
        <format type="number" field="Taux d'augmentation">
          <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>Taux d'infection quotidien</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 des personnes infectées Nombre de personnes infectées quotidiennement dans les préfectures * 2020/3/3 avant 11/Interpoler avec un nombre de 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 "Jusque-là, le nom de la préfecture et les données cumulées quotidiennes sont créés, et les requêtes NHK peuvent enfin être utilisées ici."
| 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 "Cela se fait depuis le jour où la première personne infectée est sortie."
| append [|makeresults
| eval _time = strptime("2020-01-16","%F")]
| makecontinuous _time span=1d
| reverse
| streamstats count(eval(isnull('Tokyo'))) 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 "Le blanc est la première valeur, 2020/3/Il est rempli avec la valeur calculée à partir de la valeur 11."
| 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>
Le format des données a changé, donc il a été corrigé. Cliquez ici pour le précédent 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 "Ici, il est créé une fois dans le champ du nom de la préfecture. Trié d'ici par ordre de Hokkaido"
</query>
  </search>
  <row>
    <panel>
      <html>Ce tableau de bord est Toyo Keizai Online(<a href="https://toyokeizai.net/sp/visual/tko/covid19/">https://toyokeizai.net/sp/visual/tko/covid19/</a>)J'utilise les données de.</html>
    </panel>
  </row>
  <row>
    <panel>
      <title>dernière mise à jour: $lastUpdate$</title>
      <single>
        <title>Nombre de personnes infectées</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 "Temps ici+Tableau des noms de préfecture" 
| 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>Augmentation du taux de personnes infectées</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Jusque-là, le nom de la préfecture et les données cumulées quotidiennes sont créés, et les requêtes NHK peuvent enfin être utilisées ici."
| 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éfectures", daily_incr as "Taux d'augmentation", daily_count as "Nombre de personnes infectées quotidiennement"
|préfecture de table*Augmentation du taux d'infections quotidiennes</query>
        </search>
        <option name="drilldown">none</option>
        <option name="refresh.display">progressbar</option>
        <format type="number" field="Taux d'augmentation">
          <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>Taux d'infection quotidien</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 des personnes infectées Nombre de personnes infectées quotidiennement dans les préfectures * 2020/3/3 avant 11/Interpoler avec un nombre de 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 "Jusque-là, le nom de la préfecture et les données cumulées quotidiennes sont créés, et les requêtes NHK peuvent enfin être utilisées ici."
| 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 "Cela se fait depuis le jour où la première personne infectée est sortie."
| append [|makeresults
| eval _time = strptime("2020-01-16","%F")]
| makecontinuous _time span=1d
| reverse
| streamstats count(eval(isnull('Tokyo'))) 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 "Le blanc est la première valeur, 2020/3/Il est rempli avec la valeur calculée à partir de la valeur 11."
| 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

À propos des données

JSON avec une hiérarchie profonde du point de vue de Splunk. Ce serait facile à gérer dans le monde du javascript qui récupère à l'aide d'un tableau, mais c'est presque un cauchemar de Splunk.

Liste des noms de préfecture


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

Je peux toujours le sortir docilement. D'autres données sont assez difficiles.

Voici une requête qui a la même forme que utilisant les données NHK

Statistiques quotidiennes (valeur cumulée)

Statistiques quotidiennes(Valeur cumulée)


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 "Ici, il est créé une fois dans le champ du nom de la préfecture. Trié d'ici par ordre de Hokkaido"
| rename COMMENT as "Ceci est la recherche de base pour les autres panneaux "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

Commentaire

--Spécifiez uniquement les dernières données avec head 1

  • Afin d'extraire le nombre de personnes infectées, prefectures-data est extrait une fois, puis carriers est extrait avec une expression régulière.
    Le format des données correspond aux trois premières dates et aux données de valeur cumulée de chaque préfecture.

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]
  • Ces données et le nom de la préfecture découpé par spath sont extraits par stats.
  • Puisque les données de date ont disparu, j'ai ajouté un numéro pour le tri.
  • Extraire uniquement les champs obligatoires avec stats ――A ce stade, pref est à valeurs multiples, donc après mvexpand, il est converti en données de 47 préfectures avec xyseries. ..
  • Puisque pref est également JSON, je vais spath et le numéroter pour le trier plus tard.
  • La forme est formée au stade de la «série xy». Cependant, la commande est en panne ――Répétant transpose, l'ordre vient d'Hokkaido. Ce sera la requête de base pour le moment.

Explication des composants du tableau de bord

De là, j'expliquerai chaque panneau du tableau de bord
La recherche de base est omise.

Nombre de personnes infectées et date de mise à jour

Nombre de personnes infectées et date de mise à jour


    <panel>
      <title>dernière mise à jour: $lastUpdate$</title>
      <single>
        <title>Nombre de personnes infectées</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 "Temps ici+Tableau des noms de préfecture" 
| 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>

La valeur de Total est affichée J'ai créé un autre champ pour afficher time sur le panneau. Lorsque vous traitez avec l'heure d'époque, utilisez max`` min au lieu de ʻearliest`` latest` car l'opération est stable. Je l'ai vérifié avant.

Augmentation du taux de personnes infectées

Augmentation du taux de personnes infectées


      <table>
        <title>Augmentation du taux de personnes infectées</title>
        <search base="base1">
          <query>| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Jusque-là, le nom de la préfecture et les données cumulées quotidiennes sont créés, et les requêtes NHK peuvent enfin être utilisées ici."
| 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éfectures", daily_incr as "Taux d'augmentation", daily_count as "Nombre de personnes infectées quotidiennement"
|préfecture de table*Augmentation du taux d'infections quotidiennes</query>
        </search>
        <option name="drilldown">none</option>
        <option name="refresh.display">progressbar</option>
        <format type="number" field="Taux d'augmentation">
          <option name="unit">%</option>
        </format>
      </table>

Explication du taux d'augmentation du nombre de personnes infectées

: sueur: J'ai laissé un commentaire. Pour plus de détails, voir Article précédent. L'affichage est magnifique car le nom de champ japonais et «%» sont utilisés comme unité.

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

Cela peut être clairement affiché car les données contiennent les noms des préfectures en anglais et en japonais.

Daily Infection Rate

DailyInfectionRate


    <panel>
      <chart>
        <title>Taux d'infection quotidien</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>

Taux d'infection quotidien affiché dans Honke Fondamentalement, Area Chart superpose la valeur de Total Cases avec Line Chart.

Bubble Chart

BubbleChart


      <chart>
        <title>Top 10 des personnes infectées Nombre de personnes infectées quotidiennement dans les préfectures * 2020/3/3 avant 11/Interpoler avec un nombre de 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 "Jusque-là, le nom de la préfecture et les données cumulées quotidiennes sont créés, et les requêtes NHK peuvent enfin être utilisées ici."
| 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 "Cela se fait depuis le jour où la première personne infectée est sortie."
| append [|makeresults
| eval _time = strptime("2020-01-16","%F")]
| makecontinuous _time span=1d
| reverse
| streamstats count(eval(isnull('Tokyo'))) 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 "Le blanc est la première valeur, 2020/3/Il est rempli avec la valeur calculée à partir de la valeur 11."
| 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>

Une fois créée avec seulement certaines données, la sensation de montée soudaine a disparu. Par conséquent, nous avons créé une date à partir de «2020/01/16» où le nombre de personnes infectées a été confirmé, et avons progressivement réduit le blanc à partir de la dernière valeur (pas: transpiration :). La taille du cercle correspond au nombre de personnes infectées par jour.

Autre

Ce que j'ai essayé de faire mais arrêté en termes de mise en page Area Chart

Top 10 des préfectures en statistiques quotidiennes(Valeur cumulée)


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 "Ici, il est créé une fois dans le champ du nom de la préfecture. Trié d'ici par ordre de Hokkaido"
| transpose 0 header_field=_time column_name=pref
| sort pref
| eval pref = mvindex(split(pref,"_"),1)
| rename COMMENT as "Jusque-là, le nom de la préfecture et les données cumulées quotidiennes sont créés, et les requêtes NHK peuvent enfin être utilisées ici."
| rename pref as _pref
| foreach * [eval Check=max('<<FIELD>>')]
| sort 10 - Check
| fields - Check
| transpose 0 header_field=_pref column_name=_time
| sort _time

Ce serait bien de l'afficher en mode Pile du graphique en aires.

Publié sur GitHub

La structure des répertoires est la suivante

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 J'ai créé un référentiel et poussé tous les fichiers pour créer README.md.

: sueur: j'espère qu'il bouge sans aucun problème.

Résumé

J'ai pu le faire pour le moment. Créer des applications et créer un dossier de recherche

dossier Fichier
$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
(Fichier de tableau de bord)

Cela devrait fonctionner lorsque vous placez. De plus, veuillez mettre japansimple.kml en premier.

En ce qui concerne JSON, j'utilise Splunk jusqu'à présent, donc c'était plutôt bien, mais je pense qu'il est plus facile de le traiter du côté Python.

Celui publié sur GitHub est entouré de japansimple.kml. Puisque je suis macosx, je ne travaille pas sous Windows. Au moins la description dans le répertoire dans ʻinputs.conf` devra être modifiée. : sueur: Que dois-je faire ici?

Recommended Posts