içinden çıkamadığım bir sorunum var umarım çözüm üretebiliriz.
alis_tarihi alis_fiyati miktar guncel satis_fiyati \
0 10-06-2022 1.1900 83.00 1.62 1.38
1 27-06-2022 4.5600 21.00 5.13 5.05
2 04-07-2022 19.4100 5.00 19.80 NaN
3 05-07-2022 47.7000 2.00 49.70 50.15
4 06-07-2022 11.2000 10.00 11.04 11.90
5 07-07-2022 18.5000 5.00 19.80 NaN
6 21-07-2022 35.2000 3.00 36.32 NaN
7 22-07-2022 32.4200 3.00 34.96 35.06
8 22-07-2022 36.1200 3.00 36.20 NaN
9 26-07-2022 14.1000 7.00 14.17 NaN
10 27-07-2022 166.5000 1.00 166.50 NaN
11 27-07-2022 4.7500 12.00 4.81 NaN
12 26-07-2022 18.0228 0.91 17.88 NaN
13 27-07-2022 18.0429 0.20 17.88 NaN
satis_tarihi
0 22-07-2022
1 25-07-2022
2 NaN
3 19-07-2022
4 19-07-2022
5 NaN
6 NaN
7 27-07-2022
8 NaN
9 NaN
10 NaN
11 NaN
12 NaN
13 NaN
şeklinde bir dataframe’im var. Buna arada işlem yaptırıp yeni bir sütun eklemek istiyorum.
sf=df['satis_tarihi']
for i in sf:
if sf is not None:
yuzde=round((((df['satis_fiyati']/df['alis_fiyati'])*100)-100),2)
else:
yuzde=round((((df['guncel']/df['alis_fiyati'])*100)-100),2)
print(yuzde)
Amacım satis_tarihi sütununda veri varsa yuzde’yi hesaplaması eğer yoksa da başka türlü bir hesaplama yöntemine gitmesi.
0 15.97
1 10.75
2 NaN
3 5.14
4 6.25
5 NaN
6 NaN
7 8.14
8 NaN
9 NaN
10 NaN
11 NaN
12 NaN
13 NaN
döngüden böyle bir sonuç geliyor (ayrıca her nedense 14 kez geliyor (toplam satır sayısı kadar döndürüyor halbuki 1 kez döndürmesi gerekmez mi?))
if ile yaptığı işlem doğru ama neden else 'den NaN veriyor? ve bu durumu nasıl çözebilirim?
sf=df['satis_tarihi']
for i in sf:
if pd.isnull(sf):
yuzde=round(((([df['satis_fiyati']/df['alis_fiyati'])*100)-100),2)
else:
yuzde=round(((([df['guncel']/df['alis_fiyati'])*100)-100),2)
df.insert(6, 'kar', yuzde)
if pd.isnull(sf): kullanınca
raise ValueError(
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
şimdi dediğin gibi all() kullanmak mantıklı gibi geliyor.
sf=df['satis_tarihi']
for i in sf:
if pd.notnull(sf).all():
yuzde=round((((df['satis_fiyati']/df['alis_fiyati'])*100)-100),2)
else:
yuzde=round((((df['guncel']/df['alis_fiyati'])*100)-100),2)
print(yuzde)
df.insert(6, 'kar', yuzde)
şeklinde yani eğer sf boş değilse ilk işlemi yap (satis/alis) değilse (guncel/alis)
sf boş da olsa dolu da olsa ikinci işlemi yapıyor. halbuki “var-var-yok-var-var-yok-yok” şeklinde devam ediyor.
denemek için if pd.notnull(sf).all(): kullandığımda bu kez if’in ilk satırındaki işlemi doğru yapıyor. diğerlerini nan veriyor.
0 15.97
1 10.75
2 NaN
3 5.14
4 6.25
5 NaN
6 NaN
7 8.14
8 NaN
9 NaN
10 NaN
11 NaN
12 NaN
13 NaN
Yani aslında basit birşey yapmaya çalıştığımı düşünüyorum nasıl bu kadar komplike bişey oldu anlamadım. Bir df var eger satis_tarihi sütünu boşsa (guncel/alis) değilse (satis/alis) işlemini yap ve bundan kar adında yeni bi sütun oluştur bu kadar zor olmamalıydı
Elimizde calistirilabilir bir kod olmadigi icin kendimiz deneyemiyoruz. Denesek bile,
Nasil bir cikti istedigini bilmiyoruz.
Tam olarak yapilmasi istenen seyi (satis varsa satis/alis, satis yoksa guncel/alis) cozum olarak isaretlenen cevaba kadar bilmedik. Eger oyleyse, su dedigim de asagi yukari esdeger:
Bu arada cozumde satis’in NaN’larini guncel’le dolduruyoruz. Benim soyledigim de satis/alis’in NaN’larini guncel/alis ile oldurmakti. Duzgun ifade edemedim, benim hatam.
for döngüsü kurarak çözüme ulaşmak, yaptığın şekilde kodlamayı gerektiriyordu, ben de aynı yolu izlerdim ancak Data Frame’de NaN ve NaT değerlerini bir türlü döngü koşullarına uyduramadığım için farklı bir çözüm yöntemi denedim.