Maak Matplotlib Visualisaties met Geavanceerde Tijdsreeksenanalyse
description
Met deze prompt kan de gebruiker complexe tijdsreeksen effectief visualiseren, wat helpt bij het identificeren van trends en patronen die met standaardgrafieken moeilijk te zien zijn. Het biedt duidelijke, aanpasbare Python-code, waardoor tijdsreeksanalyse toegankelijker wordt zonder dat de gebruiker diepgaande statistische kennis nodig heeft.
prompt
Help me een Matplotlib-visualisatie te maken die geavanceerde tijdsreeksenanalyse omvat voor mijn dataset: <beschrijf je dataset>. Ik wil functies zoals voortschrijdende gemiddelden, seizoensgebonden trends ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van Python-code met Matplotlib voor het visualiseren van je dataset met geavanceerde tijdsreeksanalyses:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
from pandas.plotting import autocorrelation_plot
from matplotlib.dates import DateFormatter
register_matplotlib_converters()
# Voorbeeld: laad je dataset
# Data moet een DataFrame zijn met kolom 'Datum' en 'Verkoop'
# Bijvoorbeeld:
# df = pd.read_csv('verkoop_data.csv', parse_dates=['Datum'])
# Voor nu maken we een mock dataset
dates = pd.date_range(start='2022-01-01', end='2023-12-31', freq='D')
np.random.seed(0)
verkoop = np.random.poisson(lam=100, size=len(dates))
df = pd.DataFrame({'Datum': dates, 'Verkoop': verkoop})
# Zet Datum als index
df.set_index('Datum', inplace=True)
# Bereken voortschrijdend gemiddelde (bijv. 7-dagen)
df['Voortschrijdend_Gemiddelde'] = df['Verkoop'].rolling(window=7).mean()
# Seizoensgebonden trend via de STL-decomposition (optioneel, met statsmodels)
import statsmodels.api as sm
decomposition = sm.tsa.seasonal_decompose(df['Verkoop'], model='additive', period=365)
df['Seizoensgebonden_trend'] = decomposition.seasonal
# Plot setup
plt.figure(figsize=(14, 8))
plt.plot(df.index, df['Verkoop'], color='steelblue', label='Dagelijkse verkoop')
plt.plot(df.index, df['Voortschrijdend_Gemiddelde'], color='orange', linewidth=2, label='7-daags voortschrijdend gemiddelde')
plt.plot(df.index, df['Seizoensgebonden_trend'], color='green', linewidth=2, linestyle='--', label='Seizoensgebonden trend')
# Annotaties voor pieken en dalen
# Bijvoorbeeld: top 3 pieken en dalen
top_pieken = df['Verkoop'].nlargest(3)
top_dalen = df['Verkoop'].nsmallest(3)
for datum, waarde in top_pieken.items():
plt.annotate(f'Piek: {waarde}', xy=(datum, waarde),
xytext=(datum, waarde + 15),
arrowprops=dict(facecolor='red', shrink=0.05),
fontsize=9, color='red')
for datum, waarde in top_dalen.items():
plt.annotate(f'Dal: {waarde}', xy=(datum, waarde),
xytext=(datum, waarde - 20),
arrowprops=dict(facecolor='blue', shrink=0.05),
fontsize=9, color='blue')
# Aangepaste labels en titel
plt.title('Tijdsreeksanalyse van online winkel verkoop', fontsize=16)
plt.xlabel('Datum', fontsize=14)
plt.ylabel('Verkoopaantallen', fontsize=14)
# Legenda en grid
plt.legend(loc='upper left', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.5)
# Datum formatter voor x-as
plt.gca().xaxis.set_major_formatter(DateFormatter('%Y-%m'))
# Opties voor interactie of aanpassen
plt.tight_layout()
plt.show()
```
Deze code toont:
- De dagelijkse verkoop
- Een 7-dagen voortschrijdend gemiddelde met felle oranje lijn
- Seizoensgebonden trend (via STL-decomposition) met groene stippellijn
- Annotaties voor de top 3 piek- en dalwaarden
- Duidelijke kleuren, labels, legenda en datumformatering
Je kunt de parameters aanpassen naar wens (bijvoorbeeld de window size, kleurtjes, annotatieposities).
provider: deepseek
model: deepseek-chat
Hier is een geavanceerde Python-code voor tijdsreeksanalyse met Matplotlib:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, MonthLocator
import matplotlib.dates as mdates
from statsmodels.tsa.seasonal import seasonal_decompose
# AANPASBARE PARAMETERS (pas deze aan naar wens)
KLEUREN = {
'hoofdlijn': '#FF6B6B', # Fel rood
'voortschrijdend_gemiddelde': '#4ECDC4', # Turkoois
'trendlijn': '#45B7D1', # Blauw
'seizoenscomponent': '#FFE66D', # Geel
'piek_marker': '#FF0000', # Rood
'dal_marker': '#0000FF', # Blauw
'achtergrond': '#F7F7F7' # Lichtgrijs
}
TIJDSINTERVAL = 'W' # 'D' voor dagelijks, 'W' voor wekelijks, 'M' voor maandelijks
VOORTSCHRIJDEND_GEMIDDELDE = 30 # Dagen voor voortschrijdend gemiddelde
def maak_tijdsreeks_visualisatie(data, datum_col, verkoop_col):
"""
Maak een geavanceerde tijdsreeksvisualisatie met verschillende analyses
"""
# Data voorbereiden
df = data.copy()
df[datum_col] = pd.to_datetime(df[datum_col])
df = df.set_index(datum_col)
df = df.asfreq('D') # Zorg voor dagelijkse frequentie
# Voortschrijdend gemiddelde berekenen
df['voortschrijdend_gem'] = df[verkoop_col].rolling(
window=VOORTSCHRIJDEND_GEMIDDELDE,
min_periods=1
).mean()
# Seizoensontleding
try:
result = seasonal_decompose(df[verkoop_col], model='additive', period=365)
df['trend'] = result.trend
df['seizoen'] = result.seasonal
except:
print("Seizoensontleding niet mogelijk met huidige data")
df['trend'] = np.nan
df['seizoen'] = np.nan
# Piek- en daldetectie
df['pieken'] = df[verkoop_col][(df[verkoop_col].shift(1) < df[verkoop_col]) &
(df[verkoop_col].shift(-1) < df[verkoop_col])]
df['dalen'] = df[verkoop_col][(df[verkoop_col].shift(1) > df[verkoop_col]) &
(df[verkoop_col].shift(-1) > df[verkoop_col])]
# Resample naar gewenst interval
df_resampled = df.resample(TIJDSINTERVAL).mean()
# Plot opzetten
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(20, 12))
fig.patch.set_facecolor(KLEUREN['achtergrond'])
# Hoofdplot - Verkoopcijfers met voortschrijdend gemiddelde
ax1.plot(df_resampled.index, df_resampled[verkoop_col],
color=KLEUREN['hoofdlijn'], linewidth=2, label='Dagelijkse Verkoop')
ax1.plot(df_resampled.index, df_resampled['voortschrijdend_gem'],
color=KLEUREN['voortschrijdend_gemiddelde'], linewidth=3,
label=f'Voortschrijdend Gemiddelde ({VOORTSCHRIJDEND_GEMIDDELDE}d)')
# Markeer pieken en dalen
pieken = df_resampled[df_resampled['pieken'].notna()]
dalen = df_resampled[df_resampled['dalen'].notna()]
ax1.scatter(pieken.index, pieken['pieken'], color=KLEUREN['piek_marker'],
s=100, zorder=5, label='Pieken', alpha=0.7)
ax1.scatter(dalen.index, dalen['dalen'], color=KLEUREN['dal_marker'],
s=100, zorder=5, label='Dalen', alpha=0.7)
ax1.set_title('Dagelijkse Verkoopcijfers met Analyse', fontsize=16, fontweight='bold')
ax1.set_xlabel('Datum', fontsize=12)
ax1.set_ylabel('Verkoopbedrag', fontsize=12)
ax1.legend()
ax1.grid(True, alpha=0.3)
# Trendanalyse
if not df_resampled['trend'].isna().all():
ax2.plot(df_resampled.index, df_resampled['trend'],
color=KLEUREN['trendlijn'], linewidth=3, label='Trendlijn')
ax2.set_title('Trendanalyse', fontsize=16, fontweight='bold')
ax2.set_xlabel('Datum', fontsize=12)
ax2.set_ylabel('Trend', fontsize=12)
ax2.legend()
ax2.grid(True, alpha=0.3)
# Seizoenscomponent
if not df_resampled['seizoen'].isna().all():
ax3.plot(df_resampled.index, df_resampled['seizoen'],
color=KLEUREN['seizoenscomponent'], linewidth=2)
ax3.set_title('Seizoensgebonden Component', fontsize=16, fontweight='bold')
ax3.set_xlabel('Datum', fontsize=12)
ax3.set_ylabel('Seizoenseffect', fontsize=12)
ax3.grid(True, alpha=0.3)
# Boxplot per maand voor seizoensanalyse
df['maand'] = df.index.month
maand_data = [df[df['maand'] == maand][verkoop_col] for maand in range(1, 13)]
ax4.boxplot(maand_data, labels=['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'])
ax4.set_title('Maandelijkse Verdeling van Verkoop', fontsize=16, fontweight='bold')
ax4.set_xlabel('Maand', fontsize=12)
ax4.set_ylabel('Verkoopbedrag', fontsize=12)
ax4.grid(True, alpha=0.3)
# Datumformattering
for ax in [ax1, ax2, ax3]:
ax.xaxis.set_major_formatter(DateFormatter('%Y-%m'))
ax.xaxis.set_major_locator(MonthLocator(interval=3))
plt.setp(ax.xaxis.get_majorticklabels(), rotation=45)
plt.tight_layout()
return fig, df
# VOORBEELD GEBRUIK:
# Veronderstel dat je een DataFrame hebt met kolommen 'datum' en 'verkoop'
# df = pd.read_csv('jouw_data.csv')
# fig, analyzed_df = maak_tijdsreeks_visualisatie(df, 'datum', 'verkoop')
# plt.show()
# Extra functie voor gedetailleerde piekannotaties
def annotatie_pieken_dalen(ax, df, verkoop_col):
"""
Voeg gedetailleerde annotaties toe voor pieken en dalen
"""
pieken = df[df['pieken'].notna()]
dalen = df[df['dalen'].notna()]
for datum, waarde in pieken['pieken'].items():
ax.annotate(f'Piek: {waarde:.0f}',
xy=(datum, waarde),
xytext=(10, 30),
textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='red'),
fontsize=9,
bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="red", alpha=0.7))
for datum, waarde in dalen['dalen'].items():
ax.annotate(f'Dal: {waarde:.0f}',
xy=(datum, waarde),
xytext=(10, -40),
textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='blue'),
fontsize=9,
bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="blue", alpha=0.7))
# Om annotaties toe te voegen aan de hoofdplot:
# annotatie_pieken_dalen(ax1, df_resampled, 'verkoop')
```
**Installatievereisten:**
```bash
pip install pandas matplotlib numpy statsmodels
```
**Belangrijke aanpassingsopties:**
1. Wijzig `KLEUREN` dictionary voor kleuraanpassingen
2. Pas `TIJDSINTERVAL` aan voor aggregatieniveau
3. Verander `VOORTSCHRIJDEND_GEMIDDELDE` voor rolling window grootte
4. Pas de subplot-indeling aan in de `subplots()` functie
Deze code biedt een complete analyse met visuele weergave van trends, seizoenspatronen, en markeert automatisch pieken en dalen in je verkoopdata!