Kurs
Zaman serisi, kronolojik sırayla zamana göre indekslenmiş veri gözlemleri koleksiyonudur. Bu gözlemler genellikle (ama zorunlu olmaksızın) düzenli zaman aralıklarında kaydedilir. Zaman serileri; bankacılık, alım satım, pazarlama, bilim ve diğer sektörlerde sıklıkla kullanılır. Zaman serisi verilerinin en tipik görsel gösterimi, zamanın x eksenine ve ölçülen değerin y eksenine yerleştirildiği bir çizgi grafiktir.
Bu eğitimde, Python’un temel çizim kütüphanesi olan matplotlib ile zaman serisi çizgi grafikleri oluşturmayı ve özelleştirmeyi inceleyeceğiz.
Matplotlib ile zaman serisi çizimine başlangıç
Kitaplıkların içe aktarılması ve verinin yüklenmesi
Önce gerekli Python kitaplıklarını içe aktaracak ve veriyi yükleyeceğiz – bir Kaggle veri kümesi olan Daily Exchange Rates per Euro 1999-2023. Ayrıca bazı temel veri temizleme adımlarını uygulayacağız:
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
df = pd.read_csv('euro-daily-hist_1999_2022.csv')
df = df.iloc[:, [0, 4, 28, -2]]
df.columns = ['Date', 'CAD', 'NZD', 'USD']
for col in ['CAD', 'NZD', 'USD']:
df = df[df[col] != '-']
df[col] = pd.to_numeric(df[col])
df = df[df['Date'] >= '2022-12-01'].reset_index(drop=True)
print(df.head(3))
print(f'\nThe date range: {df.Date.min()}/{ df.Date.max()}')
Çıktı:
Date CAD NZD USD
0 2023-01-27 1.4479 1.6759 1.0865
1 2023-01-26 1.4568 1.6799 1.0895
2 2023-01-25 1.4544 1.6792 1.0878
The date range: 2022-12-01/2023-01-27
Tarih/zaman dizgelerini datetime nesnelerine dönüştürme
Zaman serileriyle verimli çalışmak için tarih veya zaman dizgelerini pandas.to_datetime işlevini kullanarak datetime nesnelerine dönüştürmemiz gerekir:
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dtypes)
Çıktı:
datetime64[ns]
Python’da zaman serileriyle çalışma konusunda kısa bir hatırlatmaya ihtiyacınız varsa, Manipulating Time Series Data in Python kursu faydalı olabilir.
Datetime sütununu dataframe indeksi olarak ayarlama
Şimdi, Date sütununu set_index yöntemiyle dataframe indeksi olarak ayarlayalım:
df = df.set_index('Date')
print(df.head(3))
Çıktı:
CAD NZD USD
Date
2023-01-27 1.4479 1.6759 1.0865
2023-01-26 1.4568 1.6799 1.0895
2023-01-25 1.4544 1.6792 1.0878
Temel tek çizgili matplotlib zaman serisi grafiği oluşturma
Basit bir zaman serisi çizgi grafiği oluşturmak için standart matplotlib.pyplot.plot(x, y) yöntemini kullanırız:
plt.plot(df.index, df['CAD'])
Çıktı:

Birden çok çizgili matplotlib zaman serisi grafiği oluşturma
Birden çok çizgili zaman serisi grafiği oluşturmak için matplotlib.pyplot.plot(x, y) yöntemini gerekli sayıda çalıştırmamız yeterlidir:
plt.plot(df.index, df['CAD'])
plt.plot(df.index, df['NZD'])
plt.plot(df.index, df['USD'])

Yukarıdaki kodu for döngüsü kullanarak optimize edebiliriz:
for col in ['CAD', 'NZD', 'USD']:
plt.plot(df.index, df[col])
Çıktı:

Matplotlib zaman serisi grafiklerini özelleştirme
Zaman serisi çizgi grafiğimizi daha okunabilir ve etkileyici kılmak için özelleştirmemiz gerekir. Şekil boyutunu ayarlama, grafik başlığı ve eksen etiketleri ekleme ve özelleştirme, çizgi özelliklerini değiştirme, işaretleyiciler ekleme ve özelleştirme gibi yaygın matplotlib ayarlamalarını uygulayabiliriz. Bazı ayarlar ise zaman serisi çizgi grafikleri için özeldir; örneğin zaman ekseni tiklerini ve etiketlerini özelleştirme veya belirli zaman aralıklarını vurgulama.
Şekli ve eksenleri özelleştirme
Standart matplotlib yöntemlerini kullanarak, aşağıdaki kod yorumlarında açıklandığı gibi, bir zaman serisi çizgi grafiğinin şeklini ve eksenlerini birçok yönden özelleştirebiliriz:
# Adjusting the figure size
fig = plt.subplots(figsize=(16, 5))
# Creating a plot
plt.plot(df.index, df['CAD'])
# Adding a plot title and customizing its font size
plt.title('EUR-CAD rate', fontsize=20)
# Adding axis labels and customizing their font size
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
# Rotaing axis ticks and customizing their font size
plt.xticks(rotation=30, fontsize=15)
# Changing the plot resolution - zooming in the period from 15.12.2022 till 15.01.2023
plt.xlim(pd.Timestamp('2022-12-15'), pd.Timestamp('2023-01-15'))
Çıktı:

Çizgi özelliklerini özelleştirme
Diğer çizgi grafiklerde olduğu gibi, zaman serisi çizgi grafiğinin çizgi rengi, stili veya kalınlığı gibi çizgi özelliklerini değiştirmek mümkündür:
plt.plot(df.index, df['CAD'], color='green', linestyle='dashed', linewidth=3)
Çıktı:

İşaretleyiciler ekleme ve özelleştirme
Her çizgi grafikte olduğu gibi, zaman serisi çizgi grafiğine işaretleyiciler yerleştirebilir ve simgesini, rengini, kenar rengini ve boyutunu özelleştirebiliriz:
plt.plot(df.index, df['CAD'], marker='o', markerfacecolor='yellow', markeredgecolor='red', markersize=8)

Zaman ekseni tiklerini özelleştirme
Önce, bazı temel özelleştirmelerle basit bir matplotlib zaman serisi çizgi grafiği oluşturalım:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
Çıktı:

Varsayılan olarak matplotlib’in, etiketleriyle birlikte bazı rastgele tikler gösterdiğini görüyoruz. Ancak zaman ekseninde hangi tiklerin görüneceğini kontrol etmek isteyebiliriz. Bu durumda, gerekli tarihleri (veya zamanları) dizge ya da pandas timestamp olarak matplotlib.pyplot.xticks yöntemine bir liste halinde sağlamamız gerekir:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying time axis ticks
ticks = ['2022-12-05', '2023-01-02', '2023-01-20']
plt.xticks(ticks)
Çıktı:

Yukarıda, matplotlib seçilen tikleri gösterdi ve bunları otomatik olarak etiketledi.
Eğer tüm tikleri göstermek istiyorsak, zaman serisinin indekslerinin bir listesini matplotlib.pyplot.xticks yöntemine sağlamalıyız:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying all time axis ticks
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
Çıktı:

Zaman ekseni tik etiketlerini özelleştirme
Yukarıdaki çizgi grafikte zaman ekseni tik etiketleri göz yorucu görünebilir. Daha okunabilir olmaları için biçimlendirmek isteyebiliriz. Bunun için matplotlib.dates.DateFormatter sınıfını kullanarak, tarihleri/zamanları nasıl görmek istediğimizi yansıtan bir strftime biçim dizgesi geçiririz. Ardından bu biçimlendiriciyi matplotlib.axis.XAxis.set_major_formatter yöntemine veririz:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
# Formatting time axis tick labels
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
Çıktı:

Bu dokümantasyon sayfası tüm olası strftime biçim kodlarının kapsamlı bir listesini sunar.
Belirli zaman aralıklarını vurgulama
Bazen, zaman serisi çizgi grafiğinde belirli zaman aralıklarını gölgelendirmek isteyebiliriz. Bunun için matplotlib.pyplot.axvspan yöntemini kullanabiliriz. Bu yöntem, ilgi duyulan dönemin başlangıç ve bitiş zaman noktalarını datetime biçiminde alan iki zorunlu argüman kabul eder. Ayrıca vurgulanan alanın görünümünü özelleştirmek için renk, kenar rengi, saydamlık, çizgi kalınlığı veya tarama deseni gibi bazı isteğe bağlı parametreler de alabilir.
Bu tekniği önceki bölümdeki grafiğe uygulayalım:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
# Highlighting the time period from 15.12.2022 to 1.01.2023 and customizing the shaded area
plt.axvspan(datetime(2022, 12, 15), datetime(2023, 1, 1), facecolor='yellow', alpha=0.5, hatch='/', edgecolor='red', linewidth=5)
Çıktı:

Bir matplotlib zaman serisi çizgi grafiğini dosyaya kaydetme
Bir zaman serisi çizgi grafiğini yalnızca görüntülemek yerine bir görsel dosyasına kaydetmeyi tercih edebiliriz. Bunu yapmak için, dosya adını geçirerek matplotlib.pyplot.savefig yöntemini kullanırız. Örneğin, ilk temel grafiğimize dönelim:
plt.plot(df.index, df['CAD'])
# Saving the resulting plot to a file
plt.savefig('time series line plot.png')

Yukarıda, grafiği time series line plot.png adlı ve mevcut programımızla aynı konumda bulunan bir dosyaya kaydettik.
Sonuç
Özetle, bu eğitimde zaman serisi çizgi grafiklerini matplotlib ile nasıl oluşturup özelleştireceğimizi; hem genel matplotlib yöntemlerini hem de yalnızca zaman serisi görselleştirmelerine özgü daha gelişmiş yöntemleri kullanarak ele aldık.
Bu temel teknikleri öğrendikten sonra, Python’da zaman serisi verileriyle çalışma ve görselleştirme konusuna daha derinlemesine dalmak isteyebilirsiniz. Bu durumda, aşağıdaki kapsamlı, yeni başlayan dostu ve uçtan uca kaynakları incelemeyi düşünün:
- Time Series with Python öğrenim yolu
- Time Series Analysis in Python kursu
- Visualizing Time Series Data in Python kursu
