Soru sorçoklu veri içinde aynı özellikleri sağlayan verileri bulma
Aykut tarafından 3 yıl önce soruldu

10 yıllık bir süreçte seçilen yıllara göre aynı ay-gün-saat değerlerine karşılık gelen sıcaklık verilerini bulup ortalamalarını almam gerekiyor. Bu şekilde 10 yıllık veri ortalamasını bulmalıyım. Elimde 10 yıllık sıcaklık verileri mevcut. Örneğin 2008 yılı 1. ay 1. gün 1. saat sıcaklığı -12 C; 2009 için 1. ay a. gün 1. saat sıcaklığı -8C; bunun gibi 10 yıl için sıcaklıkları bulup 10 a bölüp ortalama bulmalıyım. Tabi bunu tüm ay-gün ve saatler için ayrı ayrı yapacağım. Sizden ricam seçilen yıllar için aynı ay-gün-saate karşılık gelen, mesela her yılın 1. ay 1. gün ve 1. saatine karşılık gelen sıcaklık değerlerini bulup veren bir kod. Find komutunu araştırdım fakat çok basit örnekler bulabildim, 3 farklı değere bağlı bir değeri(sıcaklık) bulma durumu daha karışık.

32 Cevap
En iyi cevap
Aykut tarafından 3 yıl önce cevaplandı

içi boş görünüyor
tablo_hepsi
https://hizliresim.com/I8Ipxa
[url=https://hizliresim.com/I8Ipxa][img]https://i.hizliresim.com/I8Ipxa.jpg[/img][/url]
[url=https://hizliresim.com/I8Ipxa][img]https://i.hizliresim.com/I8Ipxa.jpg[/img][/url]
 

Caglar Yönetici tarafından 3 yıl önce cevaplandı

Elinizdeki veri zaten saat başı raporlama yapmış mı? Üç farklı değere bağlı bulma dediğiniz ay, gün ve saat mi?

Aykut tarafından 3 yıl önce cevaplandı

Elimdeki veri 2008 den 2017 yılları arasında 10 yıllık her gün için olan sıcaklık değerleri. mesela 2008 yılının 1. ayının 1. günün 1. saati -12 C, bu değerlerin aynısı 10 yıl için mevcut fakat sıcaklık değerleri farklı. Bunların ortalamasını alacam. fakat Verilerde bazen sorunlar olabiliyor mesela her veri her yıl için olmayabiliyor mesela 2010 için 1. ayın 1. günün 1. saatinin verisi atlanmış olabiliyor. Bu  nedenle her yıl için 365 günx24 =8760 veri yok. bu nedenle exceldeki veri sütunları yıl-ay-gün-saat-sıcaklık şeklinde olduğu için yılları seçerek örneğin 1-1-1 için sıcaklık değeri şudur şeklinde olmalı. 1-1-1 yoksa o yıl için atlayacak hangi yılda varsa onları bulup, toplayıp, bulunan yıl sayısına bölüp 1-1-1 için sıcaklık ortalamasını alacak (8760 civarı veri için)

Caglar Yönetici tarafından 3 yıl önce cevaplandı

Tarih su an hangi formatta ifade edilmis?

Aykut tarafından 3 yıl önce cevaplandı

excell örneğini ekliyorum. 2005 ten başlayıp 2017 ye kadar veri var fakat ben 2008-2017 verilerini kullanacağım. Dediğim gibi her yıl için her veri yok. 
SICAKLIK VERİ ÖRNEĞİ

Aykut tarafından 3 yıl önce cevaplandı

excell örneğini ekliyorum. 2005 ten başlayıp 2017 ye kadar veri var fakat ben 2008-2017 verilerini kullanacağım. Dediğim gibi her yıl için her veri yok. 
SICAKLIK VERİ ÖRNEĞİ

Aykut tarafından 3 yıl önce cevaplandı
Aykut tarafından 3 yıl önce cevaplandı

o saatteki veri olan yılların verilerini alıp kullanacak. örnekte 0. saatten başlıyor saat 24:00 daki sıcaklık değeri

Caglar Yönetici tarafından 3 yıl önce cevaplandı

Aklıma gelen en pratik süreç şu şekilde, her bir yıl dosyanızı matlabe aktaracaksınız. Her bir yıl için bir timetable oluşturulacak. Timetable'ların bir sutunu zamani, bir sutunu o zamana karsilik gelen sıcaklıgı gosterecek. (Eğer veriler saat başı olmasaydı onları retime fonksiyonu ile saatlik yapmak gerekirdi.). Bunu yaparken datetime'ın yılı hepsinde aynı yıl yapmak gerekecek, ki az sonra kullanılacak synchronise calissin. (Şubatın 29 gün oldugu bir yıl secilmeli)
https://www.mathworks.com/help/matlab/ref/timetable.html
synchronise(tablo_2011, tablo_2012…) seklinde tum tablolarınızı birlestireceksiniz. synchronise sayesinde satır sayıları aynı olmasa da zaman sutunu tutanlar yanyana gelecek (yılları bu yuzden aynı yaptık).
Sonuc olarak elinizdeki tablonun zaman sutunu ve her yıl o zamana denk gelen sıcaklık degeri sutunları olacak. Bu olusan tablo ya da bir sutun daha ekleyip o sutuna, bulundugu satırın sıcaklık ortalaması eklenebilir.

Caglar Yönetici tarafından 3 yıl önce cevaplandı

Yukarıda süreçte tam hangi asamalarda takılabileceğinizi bilmediğim için detaya girmedim. Daha basit bir yöntem olarak da, timetablelara falan bulasmadan ortalamalar adında yeni bir matris olusturup, ic ice 3 for dongusuyle (ay, gun, saat) uc sutunun da tuttugu degerler secilip ortalamasi alinabilir. Exceldeki sirayla ikinci sutunda ay, ucuncude gun, dorduncude saat ve besincide sicaklik varsa:

 

g = 0;
for i_ay = 1:1:12
for i_gun = 1:1:31
for i_saat = 0:1:23
mevcut_veriler = tablo_hepsi((tablo_hepsi(:,2)==i_ay) & (tablo_hepsi(:,3)==i_gun)& (tablo_hepsi(:,4)==i_saat),:);
ortalama = mean(mevcut_veriler(:,5));
if ~isnan(ortalama)
g = g+1;
tablo_ortalamalar(g,:)=[i_ay, i_gun, i_saat, ortalama];
end
end
end
end
Caglar Yönetici tarafından 3 yıl önce cevaplandı

Kodları denemedim ve büyük ihtimalle daha temiz çözümler vardır ama en azından bir fikir vermiştir umarım.

Aykut tarafından 3 yıl önce cevaplandı

Çok teşekkür ederim. Bu konu hakkında bilgim olmadığı için çözüm önerinizi çalışacağım, ozaman anlatmak istediğinizi daha iyi anlayacağımı düşünüyorum. Takılırsam tekrar yardımınız yazarım. 

Aykut tarafından 3 yıl önce cevaplandı

Merhaba, for döngüsü ile verdiğiniz kodu yazdım fakat ekteki hatayı aldım. Sanırım for döngüsü sabit ve eşit sayıda veriler için düzgün çalışıyor. tablo_hepsi için kullandığım veriler tüm yılların arka arkaya sıralandığı excel dosyası. Bunu da xlsread komutuyla okuttum önce. timetable için verdiğiniz örneği okudum fakat daha fazla örnek ve konu anlatımı bulamadım. "Timetable'ların bir sutunu zamani, bir sutunu o zamana karsilik gelen sıcaklıgı gosterecek." şeklinde belirttiğiniz kısmı tam anlayamadım. Zaman verileri(ay-gün-saat) hepsi ayrı kolonda, bunları nasıl birleştirip tek veri haline çevireceğim? 
https://hizliresim.com/TsGXrF
https://hizliresim.com/Ij4uBi       

Caglar Yönetici tarafından 3 yıl önce cevaplandı

For'un farklı sayıda satir icerenlerde de calismasi lazımdı aslında am dedigim gibi deneme sansım olmadı. Hatayı içeren resim link açılmıyor maalesef.
3 ayrı veriden tek seferde ifade edilebilen datetime turune gecebilirsiniz, 
 
>> datetime(2020,8,23,12,00,00)
ans =
datetime
23-Aug-2020 12:00:00

Aykut tarafından 3 yıl önce cevaplandı

program linkleri:
https://hizliresim.com/ULUA0x
[url=https://hizliresim.com/ULUA0x][img]https://i.hizliresim.com/ULUA0x.jpg[/img][/url]
[url=https://hizliresim.com/ULUA0x][img]https://i.hizliresim.com/ULUA0x.jpg[/img][/url]
hata linkleri:
https://hizliresim.com/V6UcYW
[url=https://hizliresim.com/V6UcYW][img]https://i.hizliresim.com/V6UcYW.jpg[/img][/url]
[url=https://hizliresim.com/V6UcYW][img]https://i.hizliresim.com/V6UcYW.jpg[/img][/url]

Aykut tarafından 3 yıl önce cevaplandı

umarım açılır gönderdiğim linklerle. Dediğim gibi buradaki verileri aldığım excel dosyasında yılların hepsi birlikte, arka arkaya. Timetable için yılları ayrı ayrı excell dosyası yapacam.