[Python] Heatmap im Kalenderstil (mit Feiertagsanzeige)

Zweck dieses Artikels

Erstellen Sie eine Heatmap im Kalenderstil mit Feiertagen, z.

calendar.png

Übrigens wird für die Daten das mit der Qiita-API erfasste Artikelveröffentlichungsdatum von @yaotti als 1 Beitrag = 1 Ereignis verwendet.

Ähnliche Visualisierungsmethode

Obwohl es unter verschiedenen Namen aufgerufen wird, ist die folgende Abbildung auf GitHub auch einfach und gut.

contributions_graph.png Quelle: [Beiträge im GitHub-Hilfeprofil anzeigen](https://help.github.com/de/github/setting-up-and-managing-your-github-profile/viewing-contributions-on-your -Profil # Beitragskalender)

In Python scheint es, dass ein ähnliches Diagramm mit einer Bibliothek namens `` `peaceap``` erstellt werden kann.

image02.png

GitHub:martijnvermaat/calmap

Ich konnte es auch nicht in Python finden, aber in R können Sie den Monatskalender mit der Bibliothek `` `openair``` anzeigen. openair:calendarPlot()

image03.png Quelle: RPubs Plotten mit Openair

Jedoch,

Ich konnte nichts finden, was sich traf ...

Kommentar

Also habe ich den Code selbst geschrieben!

Vorbereitung

Bereiten Sie zuerst die Bibliothek vor.

!pip install jpholiday #Urlaubsinformationen erhalten
!pip install japanize_matplotlib #Zur Japanisierung von plt
import numpy as np
import pandas as pd
import requests
import json
from pandas.io.json import json_normalize
import datetime
import jpholiday

import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
import matplotlib.patches as patches #Zeichne ein Rechteck

Vorbereitung der Daten

Bereiten Sie die entsprechenden Ereignisdaten vor. Ich habe kürzlich versucht, die Qiita-API zu verwenden, daher denke ich, dass das Veröffentlichen eines Qiita-Artikels ein Ereignis ist, und das Veröffentlichungsdatum Visualisieren.

Die abgerufenen Post-Daten haben das folgende Format: Alle anderen Daten sind in Ordnung, solange eine Zeitstempelspalte vorhanden ist. Dieses Mal sind die Zeitstempelinformationen in der Spalte `` `created_at``` enthalten. image04.jpg

Konvertieren Sie zunächst den Wert, der als Zeichenfolge in der Zeitstempelspalte enthalten ist, in einen Wert namens "datetime.datetime type".

Format muss entsprechend geändert werden.



```python
df["created_at"] = pd.to_datetime(df["created_at"], format='%Y-%m-%dT%H:%M:%S+09:00')

Von hier aus werden dann Informationen wie Jahr und Monat extrahiert.

df["year"] = df["created_at"].dt.year
df["month"] = df["created_at"].dt.month
df["day"] = df["created_at"].dt.day

Zusätzlich erhält die selbst erstellte Funktion `` `american_calendar``` die amerikanischen Wochen- und Tagesinformationen. Klicken Sie hier für Details: Get American Week Number

def american_calendar
def american_calendar(year, month, day):
    #Datumszeit des Eingabejahres.Erstellen Sie Datumsarten
    inp = datetime.date(year=year, month=month, day=day)
    #Datetime am ersten Tag des Eingabejahres.Erstellen Sie Datumsarten
    first = datetime.date(year=year, month=1, day=1)

    #Berechnen Sie zunächst den Tag
    inp_how = (inp.weekday()+1) % 7 #+1 ist, den Tag zu ändern, um am Sonntag zu beginnen
    first_how = (first.weekday()+1)%7
    
    #Weniger als,Berechnung der Wochennummer
    #Oben links im Kalender(Erster Sonntag)Holen Sie sich das Datum von
    upper_left = first - datetime.timedelta(days=first_how)

    #Ermitteln Sie die Wochennummer, indem Sie die Differenz zwischen der Anzahl der Tage und dem Basisdatum berechnen
    inp_week = (inp - upper_left).days // 7
    
    return year, inp_week, inp_how
cal = np.array([american_calendar(ymd[0], ymd[1], ymd[2]) for ymd in df.loc[:,["year","month","day"]].values])

df["week"] = cal[:,1]
df["dayofweek"] = cal[:,2]

Zu diesem Zeitpunkt sollten die Daten folgendermaßen aussehen:

df.loc[:,["created_at", "year", "month", "day", "week", "dayofweek"]].head()

image06.png

Hier ist "Woche" die Wochennummer und "Wochentag" der Tag. Beachten Sie, dass auf den `Wochentag``` hier``` `0``` am Sonntag,` 1``` am Montag usw. folgt.

Ereignisaggregation

Geben Sie hier `year``` an und verwenden Sie` pivot_table```, um die Daten zu filtern und nach Datum zu aggregieren.

year = 2012

idx_name = "week"
col_name = "dayofweek"

tmp_df = df[df["year"]==year]
pv = tmp_df.pivot_table(index=idx_name, columns=col_name, values="body", aggfunc="count") #Jeder Körper ist in Ordnung
pv = pd.DataFrame(pv.values, columns=pv.columns.values ,index=pv.index.values)
pv

image07.png

Dieser Datenrahmen `pv``` zeigt keine Woche an, in der kein Ereignis auftritt, und kann nicht so verwendet werden, wie er ist. Erstellen Sie daher im Voraus einen 54 × 7-Quadrat-Datenrahmen `mat``` wie einen Kalender und formatieren Sie ihn, indem Sie einen Wert hinzufügen.

pv.columns = [int(num) for num in pv.columns]
pv.index = [int(num) for num in pv.index]
pv = pv.fillna(0)

mat = pd.DataFrame(index=list(range(54)), columns=list(range(7)))
mat = mat.fillna(0)

mat = mat.add(pv, fill_value=0)
mat = mat.applymap(lambda x: int(x))
mat

image08.png

Es ist wunderschön. (Eigentlich gibt es bis zu 54 Zeilen)

Bereiten Sie als Nächstes das Datum vor, das im Kalender angezeigt werden soll.

mat_date = pd.DataFrame(index=list(range(54)), columns=list(range(7)))
mat_date = mat_date.fillna("")

tmp = datetime.date(year=year, month=1, day=1)

for i in range(366):
    if tmp.year==year:
        y,week,how = american_calendar(tmp.year, tmp.month, tmp.day)
        mat_date.loc[week,how] = str(tmp.month) +"/"+ str(tmp.day)
    tmp+=datetime.timedelta(days=1)
    
lab = mat_date.values
lab

image09.png Sie können ein 54x7-Array mit der Datumszeichenfolge als Element erstellen, wie oben gezeigt. Da die ersten beiden Elemente leere Buchstaben sind, beginnt dieses Jahr am Dienstag.

Visualisierung

Zum Schluss zeichnen Sie einen Kalender mit `sns.heatmap```. In Bezug auf die Feiertagsanzeige enthält jpholiday.year_holidays (year) eine Liste von Feiertagen für ein bestimmtes Jahr. Aus diesen Informationen wird `patches.Rectangle``` verwendet, um jedes rote Quadrat einzeln zu markieren. Ich male.

plt.figure(figsize=(10,30))
ax = sns.heatmap(mat, annot=lab, square=True, fmt="", cmap="Greens", cbar=False, linewidths=0.1, linecolor="silver")
ax.set_xticklabels(["Tag","Mond","Feuer","Wasser","Holz","Geld","Boden"])

for holiday in jpholiday.year_holidays(year):
    tmp = holiday[0]
    y,week,how = american_calendar(tmp.year, tmp.month, tmp.day)

    r = patches.Rectangle(xy=(how, week), width=1, height=1, edgecolor='red', fill=False, linewidth=1)
    ax.add_patch(r)

ax.tick_params(right=False, top=True, labelright=False, labeltop=True)
plt.xlim((-0.1,7.1))
plt.title("Calendar Heatmap (year:{0})".format(year))
plt.show()

image11.jpg

das ist alles!

Codeliste

Liste anzeigen
import numpy as np
import pandas as pd
import requests
import json
from pandas.io.json import json_normalize
import datetime
import jpholiday

import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
import matplotlib.patches as patches #Zeichne ein Rechteck

#Datenaufbereitung
df["created_at"] = pd.to_datetime(df["created_at"], format='%Y-%m-%dT%H:%M:%S+09:00')
df["year"] = df["created_at"].dt.year
df["month"] = df["created_at"].dt.month
df["day"] = df["created_at"].dt.day

cal = np.array([american_calendar(ymd[0], ymd[1], ymd[2]) for ymd in df.loc[:,["year","month","day"]].values])
df["week"] = cal[:,1]
df["dayofweek"] = cal[:,2]

#Datenaggregation
year = 2012
idx_name = "week"
col_name = "dayofweek"

tmp_df = df[df["year"]==year]
pv = tmp_df.pivot_table(index=idx_name, columns=col_name, values="body", aggfunc="count") #Jeder Körper ist in Ordnung
pv = pd.DataFrame(pv.values, columns=pv.columns.values ,index=pv.index.values)

#Aggregierte Daten formatieren
pv.columns = [int(num) for num in pv.columns]
pv.index = [int(num) for num in pv.index]
pv = pv.fillna(0)
mat = pd.DataFrame(index=list(range(54)), columns=list(range(7)))
mat = mat.fillna(0)
mat = mat.add(pv, fill_value=0)
mat = mat.applymap(lambda x: int(x))

#Erstellung des Datumsetiketts
mat_date = pd.DataFrame(index=list(range(54)), columns=list(range(7)))
mat_date = mat_date.fillna("")

tmp = datetime.date(year=year, month=1, day=1)

for i in range(366):
    if tmp.year==year:
        y,week,how = american_calendar(tmp.year, tmp.month, tmp.day)
        mat_date.loc[week,how] = str(tmp.month) +"/"+ str(tmp.day)
    tmp+=datetime.timedelta(days=1)

lab = mat_date.values


#Visualisierung
plt.figure(figsize=(10,30))
ax = sns.heatmap(mat, annot=lab, square=True, fmt="", cmap="Greens", cbar=False, linewidths=0.1, linecolor="silver")
ax.set_xticklabels(["Tag","Mond","Feuer","Wasser","Holz","Geld","Boden"])

for holiday in jpholiday.year_holidays(year):
    tmp = holiday[0]
    y,week,how = american_calendar(tmp.year, tmp.month, tmp.day)

    r = patches.Rectangle(xy=(how, week), width=1, height=1, edgecolor="red", fill=False, linewidth=1)
    ax.add_patch(r)

ax.tick_params(right=False, top=True, labelright=False, labeltop=True)
plt.xlim((-0.1,7.1))
plt.title("Calendar Heatmap (year:{0})".format(year))
plt.show()

Referenz

GitHub-Hilfe: Beiträge im Profil anzeigen (https://help.github.com/de/github/setting-up-and-managing-your-github-profile/viewing-contributions-on-your- Profil # Beitragskalender) GitHub:martijnvermaat/calmap openair:calendarPlot() RPubs:Plotting with openair GitHub: Bibliothek für japanische Feiertage jpholiday stack overflow:How to Add Text plus Value in Python Seaborn Heatmap

Recommended Posts

[Python] Heatmap im Kalenderstil (mit Feiertagsanzeige)
COVID-19-Simulation mit Python (SIR-Modell) ~~ mit Präfektur-Wärmekarte ~~
Versuchen Sie, Google Map und Geography Map mit Python anzuzeigen
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Zeigen Sie Python 3 im Browser mit MAMP an
Kartenmietinformationen auf einer Karte mit Python
[Python] Listenelemente mit Argumenten variabler Länge anzeigen
Heat Map für die Rastersuche mit Matplotlib
So zeigen Sie Python-Japanisch mit Lolipop an
Ich habe mit Python eine Hex-Map erstellt
Zweidimensionale instationäre Wärmeleitungsanalyse mit Python
Versuchen Sie, eine Karte mit Python + Cartopy 0.18.0 zu zeichnen
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Interaktive Anzeige algebraischer Kurven in Python, Jupyter
Twilio mit Python
In Python integrieren
[Mit Plotly auf die Karte schreiben] Dynamische Visualisierung mit Plotly [Python]
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
Folium: Visualisieren Sie Daten auf einer Karte mit Python
mit Syntax (Python)
Anzeige von Positionsinformationsdaten in Python - Versuchen Sie, mit der Kartenanzeigebibliothek (Folium) zu zeichnen -
Bingo mit Python
Zundokokiyoshi mit Python
Visualisiere grib2 auf einer Karte mit Python (matplotlib)
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Es ist zu mühsam, Japanisch in Vims Python3 anzuzeigen.
[Python] So erstellen Sie eine Korrelationsmatrix und eine Heatmap
Anzeigen und Aufnehmen von Webkamerabildern mit Python Kivy [GUI]
Erklärender Text, der mit Python> Funktion> Docstrings> help () / .__ doc__ angezeigt werden soll
Zeigen Sie das Bild der USB-Kamera mit OpenCV von Python mit Raspeye an
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
1.1 Erste Schritte mit Python
Tweets mit Python sammeln
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python