-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaapl_stock.py
313 lines (238 loc) · 8.55 KB
/
aapl_stock.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# -*- coding: utf-8 -*-
"""aapl_stock.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1aejdu6zB5fsVDqPe3Y5LG72GGYF7iSHS
"""
from google.colab import drive
drive.mount('/content/drive')
dosya_yolu = '/content/drive/MyDrive/Colab Notebooks/Veri Bilimi/AAPL.csv'
# gerekli kütüphaneler
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import plotly.graph_objects as go
import numpy as np
import seaborn as sns
import statsmodels.api as sm
from scipy.stats import shapiro, normaltest, anderson
# Veri setini yükleme
df = pd.read_csv(dosya_yolu)
# Veri setini görüntüleme - ilk 5 veri
df.head()
# Veri setini görüntüleme - son 5 veri
df.tail()
# Veri seti kolon isimleri
df.columns
# data type
df.dtypes
# Veri seti kolon veritipleri
df.info()
# satır ve sütun sayıları
df.shape
# veri seti matris boyutu
df.ndim
# toplam veri adeti
df.size
# 10, 100 ve 1000 sütunlar getirme - kontrol
df.loc[[10, 100, 1000]]
# tarih kolonun da unique olan verilerin kontrolü
df["Date"].unique()
# tarih kolonun da unique değerlerin sayısı
df["Date"].nunique()
# 2023'ten kaç tane veri var ?
len(df[df.Date > "2023-01-01"])
# kolonlarda boş değerler var mı
df.isnull().sum()
# ortalam
df.mean()
# medyan
df.median()
# mod
print(df['Open'].mode())
print("High: \n" + str(df['High'].mode()))
print("Low: \n" + str(df['Low'].mode()))
print("Close: \n" + str(df['Close'].mode()))
print("Adj Close: \n" + str(df['Adj Close'].mode()))
# standart sapma
df.std()
# varyans
df.var()
# aralık
print("Open: " + str(np.ptp(df["Open"])))
print("High: " + str(np.ptp(df["High"])))
print("Low: " + str(np.ptp(df["Low"])))
print("Close: " + str(np.ptp(df["Close"])))
print("Adj Close: " + str(np.ptp(df["Adj Close"])))
# çarpıklık
df.skew()
# basıklık
kurtosis_values = df.kurtosis()
# Basıklık değerlerini görselleştirelim
plt.bar(kurtosis_values.index, kurtosis_values)
plt.xlabel('Sütunlar')
plt.ylabel('Basıklık Değerleri')
plt.title('Basıklık Değerleri')
plt.xticks(rotation=45)
plt.show()
# yüzdelik %25, %50, %75
print("%25\n", df.quantile(0.25, numeric_only=True))
print("%50\n", df.quantile(0.50, numeric_only=True))
print("%75\n", df.quantile(0.75, numeric_only=True))
# veri tekrarı
df.duplicated()
# kolonlara ait istatistiki bilgiler
df.describe()
# veri setine ait korelasyon değerleri
df.corr()
# Korelasyon matrisi
correlation_matrix = df.corr()
# Korelasyon ısı haritası
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=.5)
plt.title('Korelasyon Isı Haritası')
plt.show()
# Shapiro-Wilk testini uygulayalım
statistic, p_value = shapiro(df['Volume'])
# Test istatistiği ve p değeri
print("Shapiro-Wilk Test İstatistiği:", statistic)
print("P Değeri:", p_value)
# P değerini alfa düzeyiyle karşılaştırarak hipotez testi
alpha = 0.05
if p_value > alpha:
print("H0 reddedilemez, örneklem normal dağılımdan gelmektedir.")
else:
print("H0 reddedilir, örneklem normal dağılımdan gelmemektedir.")
# normaltest() fonksiyonunu uygulayalım
statistic, p_value = normaltest(df['Volume'])
# Test istatistiği ve p değeri
print("Normaltest İstatistiği:", statistic)
print("P Değeri:", p_value)
# P değerini alfa düzeyiyle karşılaştırarak hipotez testi
alpha = 0.05
if p_value > alpha:
print("H0 reddedilemez, örneklem normal dağılımdan gelmektedir.")
else:
print("H0 reddedilir, örneklem normal dağılımdan gelmemektedir.")
# Anderson-Darling testini uygulayalım
result = anderson(df['Volume'])
# Test istatistiği ve eleştiri değeri
print("Anderson-Darling Test İstatistiği:", result.statistic)
print("Eleştiri Değerleri:", result.critical_values)
# P değerini alfa düzeyiyle karşılaştırarak hipotez testi
alpha = 0.05
if result.statistic < result.critical_values[2] and all(result.statistic < result.critical_values):
print("H0 reddedilemez, örneklem normal dağılımdan gelmektedir.")
else:
print("H0 reddedilir, örneklem normal dağılımdan gelmemektedir.")
# Son 5 gözlemin Open ve Close değerlerini kullanarak line plot çizme
plt.plot(df['Date'].tail(5), df['Open'].tail(5), marker='o', linestyle='-', color='red', label='Open')
plt.plot(df['Date'].tail(5), df['Close'].tail(5), marker='o', linestyle='-', color='blue', label='Close')
plt.title('Line Plot: Open vs Close (Son 5 Gözlem)')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid(True)
plt.show()
# Son 90 gözlemin High ve Low değerleri ile scatter plot çizme
plt.scatter(df['High'].tail(90), df['Low'].tail(90), color='green', marker='o')
plt.title('Scatter Plot: High vs Low (Son 90 Gözlem (3 Ay))')
plt.xlabel('High')
plt.ylabel('Low')
plt.grid(True)
plt.show()
# normal dağılım ve görsel normallik testleri (histogram)
for column in df.columns:
plt.figure(figsize=(8, 6))
plt.hist(df[column], bins=20, color='skyblue', edgecolor='black')
plt.title(f'Histogram - {column}')
plt.xlabel(column)
plt.ylabel('Frekans')
plt.show()
# belirli bir zaman diliminde açılış, kapanış, en yüksek ve en düşük fiyatlar
figure = go.Figure(data=[go.Candlestick(x=df["Date"],
open=df["Open"],
high=df["High"],
low=df["Low"],
close=df["Close"])])
figure.update_layout(title = "Apple Stock Price Analysis",
xaxis_rangeslider_visible=False)
figure.show()
# Volume için boxplot çizimi
plt.figure(figsize=(8, 6))
plt.boxplot(df['Volume'], vert=False, patch_artist=True)
plt.title('Volume Boxplot')
plt.xlabel('Volume')
plt.show()
# Aykırı değerleri belirleme
Q1 = df['Volume'].quantile(0.25)
Q3 = df['Volume'].quantile(0.75)
IQR = Q3 - Q1
lower_limit = Q1 - 1.5 * IQR
upper_limit = Q3 + 1.5 * IQR
outliers = df[(df['Volume'] < lower_limit) | (df['Volume'] > upper_limit)]['Volume']
print("Aykırı Değerler:", outliers.tolist())
# Aykırı değerleri silme
df_cleaned = df[(df['Volume'] >= lower_limit) & (df['Volume'] <= upper_limit)]
# Temizlenmiş DataFrame'i yazdırma
print("Temizlenmiş DataFrame:")
print(df_cleaned)
# Bağımlı değişken (Y)
y = df['Adj Close']
# Bağımsız değişkenler (X)
X = df[['Open', 'High', 'Low', 'Close', 'Volume']]
# Sabit (intercept) ekleyerek regresyon modelini oluşturalım
X = sm.add_constant(X)
# Regresyon modelini uygulayalım
model = sm.OLS(y, X).fit()
# Modelin özetini görüntüleyelim
print(model.summary())
# Tahminleri elde etme
predictions = model.predict(X)
# Tahminleri DataFrame'e ekleyerek inceleme
result_df = pd.DataFrame({'Gerçek Değerler': y, 'Tahmin Edilen Değerler': predictions})
print(result_df)
# kalıntılar
kalıntı = model.resid
fig = sm.qqplot(kalıntı, line="s")
plt.show()
# Ortalama Kare Hata (MSE)
mse = mean_squared_error(y, predictions)
# R-kare (R-squared)
r2 = r2_score(y, predictions)
# Ortalama Mutlak Hata (MAE)
mae = mean_absolute_error(y, predictions)
# Ortalama Mutlak Yüzde Hata (MAPE)
mape = np.mean(np.abs((y - predictions) / y)) * 100
print("\nPerformans Metrikleri:")
print("Ortalama Kare Hata (MSE):", mse)
print("Ortalama Mutlak Hata (MAE):", mae)
print("Ortalama Mutlak Yüzde Hata (MAPE):", mape)
print("R-kare (R-squared):", r2)
# Gerçek ve tahmin edilen değerleri alalım
y_actual = y
y_predicted = model.predict(X)
# Scatter plot çizimi
plt.figure(figsize=(8, 6))
plt.scatter(y_actual, y_predicted, alpha=0.5, color='blue', label='Gerçek vs Tahmin Edilen')
plt.plot([min(y_actual), max(y_actual)], [min(y_actual), max(y_actual)], color='red', linestyle='--', linewidth=2, label='Doğru Denklemi')
plt.title('Gerçek ve Tahmin Edilen Değerler Arasındaki Scatter Plot')
plt.xlabel('Gerçek Değerler')
plt.ylabel('Tahmin Edilen Değerler')
plt.legend()
plt.show()
# Örnek bir yeni veri seti oluşturalım (uygun veri yerine kendi verilerinizi eklemelisiniz)
# Adj Close: 194.71, 193.18, 195.71 166.67
new_data = {'Open': [193.08, 193.11 , 194.20, 170.37],
'High': [194.72, 193.49, 195.99, 171.38],
'Low': [191.72, 191.42, 193.67, 165.67],
'Close': [194.71, 193.18, 195.71, 166.89],
'Volume': [52.696, 60.943, 53.377, 70.625]}
new_df = pd.DataFrame(new_data)
# Sabit (intercept) ekleyerek yeni veri setini hazırlayalım
new_df = sm.add_constant(new_df)
# Modeli kullanarak tahminler yapalım
predictions_new = model.predict(new_df)
# Tahminleri ekrana yazdıralım
print("Yeni Veri Seti Tahminleri:")
print(predictions_new)