Erstellen Sie eine Heatmap im Kalenderstil mit Feiertagen, z.
Übrigens wird für die Daten das mit der Qiita-API erfasste Artikelveröffentlichungsdatum von @yaotti als 1 Beitrag = 1 Ereignis verwendet.
Obwohl es unter verschiedenen Namen aufgerufen wird, ist die folgende Abbildung auf GitHub auch einfach und gut.
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.
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()
Quelle: RPubs Plotten mit Openair
Jedoch,
Ich konnte nichts finden, was sich traf ...
Also habe ich den Code selbst geschrieben!
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
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.
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(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()
Hier ist "Woche" die Wochennummer und "Wochentag" der Tag.
Beachten Sie, dass auf den `Wochentag``` hier``` `0``` am Sonntag,`
1``` am Montag usw. folgt.
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
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
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
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.
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()
das ist alles!
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()
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