Satır ve sütunları tek tek tanımlamak yerine onlara da döngüyle ulaşabilirsiniz.
İşte aradığım cevap bu :))
Açıkcası kodu nasıl yollayacağımı bilemedim isterseniz upload edebilirim. Onu hangi kodla nasıl yapacağımı gösterirseniz belki ben de halledebilirim. Düzgün bir bilgiye ulaşamadım internette excelde loop ile ilgili. Aslında çok bilgi var ama işime tam olarak yarayanı bulamadım. Aklımda yukardaki kısmı bir fonksiyon olarak tanımlayarak istediğim yerde loop ile kullanma mantığında.
Dostum size zaten hangi satıra, hangi sütuna nasıl gidebileceğinizi yukarıdaki kod örneklerinde gösterdim aslında. Belki class
yapısını görmemiş olabilirsiniz. Ama geri kalan her şeyin ne anlama geldiğini biliyor olmanızda fayda var. Neyse ben yukarıdaki kodları class
yapısından çıkarttım ve fonksiyon haline getirdim. Fonksiyonlara ve ilgili yerlere açıklamalar yazdım, umarım yardımı olur. Kodları iyice bir inceleyin, bazı yerlerini değiştirin tekrar çalıştırın. Döngü kurmak zor bir iş değil. Yeterince odaklanırsanız, aşağıdaki kodları anlayacağınızı tahmin ediyorum.
from xlsxwriter.workbook import Workbook, Worksheet
def frmt(
wb: Workbook = None,
bold: bool = False,
align: str = "",
font_name: str = "Arial",
font_size: int = 11
) -> None:
"""
Bu fonksiyon hücre içini biçimlendirmek için kullanılıyor.
:param wb: Tipi 'Workbook' olan argüman
:param bold: Tipi 'bool' olan argüman
:param align: Tipi 'str' olan argüman
:param font_name: Tipi 'str' olan argüman
:param font_size: Tipi 'int' olan argüman
:return: Geri dönen bir değer yok.
"""
wb.add_format(
{
"bold": bold,
"align": align,
"valign": "vcenter",
"font_name": font_name,
"font_size": font_size
}
)
def olasilik(raw_data: list = [], cols: int = 0, i: int = 0) -> float:
"""
Ham veriyle işlem yapan alelade bir fonksiyon. Bu fonksiyon
sırası gelen ham veri eklendikten sonra çalışacak. Ve bu fonksiyon
sayesinde işlenmiş olan yeni veri, ham veride bulunan bir sütunda
toplam kaç tane satır verisi varsa o kadar satır boş bırakılarak
eklenecek. Yani ilk sütunun ilk ham verisi 2. satıra yazılmışsa ve
bu sütuna ait toplamda 3 tane satır verisi varsa, işlenen veri 5.
satıra yazılır.
:param raw_data: Tipi 'list' olan ham verilere ait argüman
:param cols: Tipi 'int' olan sırası gelen veriye ait argüman
:param i: Tipi 'int' olan sıra numarasına ait argüman
:return: Tipi 'float' olan ve işlem sonucunda oluşacak olan veri.
"""
return cols / sum(raw_data[i])
def write(
wb: Workbook = None,
ws: Worksheet = None,
raw_data: list = [],
columns: list = []
) -> None:
"""
Yazma işlemi için kullanılacak olan fonksiyon. Döngüleri
burada kuracağız. İlk döngü ham verideki sütunları tarayacak.
İkinci döngü bir sütuna ait bütün ham verilere ulaşacak.
Son döngü ise hem ham verimizi hem de bu ham veri ile yapılacak
işlem için kullanılacak.
:param wb: Tipi 'Workbook' olan argüman
:param ws: Tipi 'Worksheet' olan argüman
:param raw_data: Tipi 'list' olan ham verilere ait argüman
:param columns: Tipi 'list' olan ve sütun isimleriyle ilgili argüman
:return: Geri dönen bir değer yok.
"""
# raw_data'daki her bir sütun boyunca
for i in range(len(raw_data)):
# Sütunları 0'ıncı satıra ve i'ninci sütuna yazıyoruz.
# Aşağıda toplam iki tane sütun tanımlandı. O halde i
# önce 0 olacak sonra 1 olacak.
ws.write(
0, i,
columns[i],
frmt(wb=wb, align="center", bold=True)
)
# Bir sütun verisindeki her satır verisi için:
for index, cols in enumerate(raw_data[i], 1):
# intvar isimli bir değişken tanımlıyoruz.
# Bu değişken üstteki for döngüsü başa her
# sardığında tekrar tanımlanacak.
intvar = 0
# Ve yapacağımız her işlem için de bir döngüye
# ihtiyacımız var. Bu işlemlerden bir tanesi
# dışarıdan alacağımız veriyi excel tablosuna
# eklemek, diğer işlem her bir ham veri için
# basit bir işlem yapmak. Bu işlem bir sütundaki
# bütün ham veriler için olasılık değerini hesaplamak olsun.
for data in [
cols,
olasilik(raw_data=raw_data, cols=cols, i=i),
]:
# Burada da verileri index + intvar satırına ve
# i sütununa ekliyoruz.
ws.write(
index + intvar, i,
data,
frmt(wb=wb, align="center")
)
# Döngü başa sarmadan, intvar değişkenini bir sütunda
# kaç tane veri varsa o kadar artırıyoruz.
intvar += len(raw_data[i])
def main():
"""
Ana programımız. Yukarıdaki fonksiyonları tanımladıktan
sonra bu fonksiyonla programı çalıştıracağız.
:return: Geri dönen bir değer yok.
"""
# Çalışma kitaplığını tanımlıyoruz.
workbook = Workbook(filename="test.xlsx")
# Bir tane çalışma sayfası ekliyoruz.
sheet = workbook.add_worksheet()
# Yazdırma fonksiyonunu parametrelerini doldurarak çağırıyoruz.
write(
wb=workbook,
ws=sheet,
raw_data=[[11, 21, 32], [10, 12, 27]],
columns=["A", "B"]
)
# Çalışma kitaplığını kapatıyoruz.
workbook.close()
# İşlemleri başlatacak olan fonksiyonumuzu çağırıyoruz.
main()
Örnekler:
- Aşağıdaki kodlar 1. satırın A sütununa
merhaba
, B sütununa isedünya
yazısını ekler.
from xlsxwriter.workbook import Workbook, Worksheet
def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
for column in range(len(data)):
ws.write(0, column, data[column])
def main():
workbook = Workbook(filename="test.xlsx")
sheet = workbook.add_worksheet()
write(wb=workbook, ws=sheet, data=["merhaba", "dünya"])
workbook.close()
main()
- Aşağıdaki kodlar 1. satıra
merhaba
ikinci satıra isedünya
yazısını ekler.
from xlsxwriter.workbook import Workbook, Worksheet
def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
for row in range(len(data)):
ws.write(row, 0, data[row])
def main():
workbook = Workbook(filename="test.xlsx")
sheet = workbook.add_worksheet()
write(wb=workbook, ws=sheet, data=["merhaba", "dünya"])
workbook.close()
main()
- Aşağıdaki kodlar 1. satırın A sütununa
merhaba
, B sütununadünya
yazılarını ve 2. satırın A sütununamerhaba
ve B sütununaevren
yazılarını ekler.
from xlsxwriter.workbook import Workbook, Worksheet
def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
for row in range(len(data)):
for column in range(len(data[row])):
ws.write(row, column, data[row][column])
def main():
workbook = Workbook(filename="test.xlsx")
sheet = workbook.add_worksheet()
write(
wb=workbook,
ws=sheet,
data=[["merhaba", "dünya"], ["merhaba", "evren"]]
)
workbook.close()
main()
- Aşağıdaki kodlar A sütunun 1. satırına
merhaba
, 2. satırınadünya
yazılarını ve B sütunun 1. satırınamerhaba
, 2. satırınaevren
yazılarını ekler.
from xlsxwriter.workbook import Workbook, Worksheet
def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
for column in range(len(data)):
for row in range(len(data[column])):
ws.write(row, column, data[column][row])
def main():
workbook = Workbook(filename="test.xlsx")
sheet = workbook.add_worksheet()
write(
wb=workbook,
ws=sheet,
data=[["merhaba", "dünya"], ["merhaba", "evren"]]
)
workbook.close()
main()
- Aşağıdaki kodlar 0’dan 99’a kadar olan sayıları her bir satırda ve sütunda 10 adet sayı olacak şekilde ekler. Sayılar satır boyunca birer birer, sütun boyunca onar onar artar.
from xlsxwriter.workbook import Workbook, Worksheet
def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
row = 0
column = 0
for i in range(len(data)):
if i != 0 and i % 10 == 0:
column = 0
row += 1
ws.write(row, column, data[i])
column += 1
def main():
workbook = Workbook(filename="test.xlsx")
sheet = workbook.add_worksheet()
write(
wb=workbook,
ws=sheet,
data=range(100)
)
workbook.close()
main()
- Aşağıdaki kodlarda ise 5. örnekteki tablonun tam tersi bir tablo oluşturulur. 0’dan 100’e kadar olan sayılar sütunlar boyunca birer birer, satırlar boyunca da onar onar artar.
from xlsxwriter.workbook import Workbook, Worksheet
def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
row = 0
column = 0
for i in range(len(data)):
if i != 0 and i % 10 == 0:
row = 0
column += 1
ws.write(row, column, data[i])
row += 1
def main():
workbook = Workbook(filename="test.xlsx")
sheet = workbook.add_worksheet()
write(
wb=workbook,
ws=sheet,
data=range(100)
)
workbook.close()
main()
Umuyorum döngü kullanarak bir veri çerçevesi (dataframe) oluşturmak için bu örnekler size yardımcı olabilir. Bu örnekleri siz çeşitlendirebilirsiniz. Bazı durumlarda döngü sayısını arttırmanız gerekebilir. Karşınızda nasıl bir veri var ona göre döngü miktarını belirleyebilirsiniz. Umarım bu örnekler ve bir önceki mesajda açıklamalı olarak yazmaya çalıştığım kodların faydası olur.
Gerekli linki atmıştım, okudunuz mu acaba? :
Arkadaşlar özürlerimi iletiyorum, bu kodu buraya yazmayı beceremedim bir türlü nedense. Link olarak yükledim kodu bu; https://www.dosyaupload.com/7cyl
Örnek çoklu nokta dosyası bu;https://dosya.co/w3pbga0aqbhq/deneme.xlsx.html
Döngüyü beceremediğim için kod ile çalışan tek noktalık bir excel dosyası ürettim o da bu; https://www.dosyaupload.com/7cym
Çoklu nokta dosyası ile yapamadığım için tek noktalık excel dosyası üzerinde çalışmaya başladım. Yani bu gönderdiğim kod tek noktalık excel dosyası üzerinde çalışıyor sadece fakat kodun kaldığı yer tam olarak şu an döngüye sokmam gereken ve beceremediğim yer. Bir türlü yapamadım şunu. Sanırım mantığını tam kapamadım maalesef.
Önce deneme.xlsx
dosyasındaki sütunlara birer isim verin. Hangi sütun ne anlama geliyor bilinmesi gerekiyor. Yoksa pandas
ilk satırınızdaki değerleri sütun
isimleriymiş gibi kullanacak.
import pandas as pd
df = pd.read_excel("deneme.xlsx")
print(df)
Çıktı:
PDK662 425310.181 4199219.5672 627.1923 Unnamed: 4
0 M4610021 425261.18110 4.199373e+06 629.7863 NaN
1 M4610021 0.00000 0.000000e+00 0.0000 0.241
2 PDK662 0.00000 1.005374e+02 161.3440 1.500
3 PDK664 211.42755 9.966593e+01 112.4381 1.500
4 PDK664 0.00000 0.000000e+00 0.0000 1.436
.. ... ... ... ... ...
211 PDK734 0.00000 0.000000e+00 0.0000 1.509
212 PDK733 0.00000 1.000749e+02 143.9119 1.500
213 M4610024 180.45019 9.988460e+01 180.3346 0.284
214 M4610024 429390.42810 4.206900e+06 722.0615 NaN
215 PDK736 429398.74970 4.207006e+06 720.7790 NaN
[216 rows x 5 columns]
Yukarıdaki tablonun düzeltilmiş hali şöyle oluyor.
A B C D E
0 PDK662 425310.18100 4.199220e+06 627.1923 NaN
1 M4610021 425261.18110 4.199373e+06 629.7863 NaN
2 M4610021 0.00000 0.000000e+00 0.0000 0.241
3 PDK662 0.00000 1.005374e+02 161.3440 1.500
4 PDK664 211.42755 9.966593e+01 112.4381 1.500
.. ... ... ... ... ...
212 PDK734 0.00000 0.000000e+00 0.0000 1.509
213 PDK733 0.00000 1.000749e+02 143.9119 1.500
214 M4610024 180.45019 9.988460e+01 180.3346 0.284
215 M4610024 429390.42810 4.206900e+06 722.0615 NaN
216 PDK736 429398.74970 4.207006e+06 720.7790 NaN
[217 rows x 5 columns]
Bir döngü oluşturmak istediğinizi söylediniz. Bunu öyle bir şekilde anlatmalısınız ki, biz şöyle düşünebilelim:
Döngünün her bir adımı 3 veya 4 artık ne kadarsa o kadarlık bir satır aralığı ile çalışıyor. Her satır aralığının şu şu satırlarının şu şu sütunlarını almak gerekiyor. Bu aldığımız değerlerler ile şöyle şöyle işlemler yapacağız.
Döngü kurarak hücrelere ulaşmakta sıkıntı yok. Siz sadece her bir döngü adımında hangi hücrelerdeki verilerin alınması gerekiyor onu söyleyin.
Bunu yapmadığınız takdirde, size çok yardımcı olamayız.
https://www.youtube.com/watch?v=pglP-Q50PjQ Hocam şurda açıkladım video ile. İnşallah tam olarak anlatabilmişimdir.
Bu arada deneme.xlsx
dosyasının ilk satırına sütun isimlerini temsil eden bir şeyler yazdım. Siz de böyle yapın.
1.py
dosyasında gördüğüm kadarıyla oluşturmak istediğiniz döngünün 1. adımında 6 tane satır kullanıyorsunuz ve bu satırlardan belirli hücreleri kullanıyorsunuz. Buna dayanarak şöyle bir kod yazdım.
Not: “A” sütunu 0., “B” sütunu ise 1. sütun anlamına geliyor.
import pandas as pd
def get(values, rows, column):
return [values[i - 1][column] for i in rows]
def value_range(df, start, end):
values = df.values[start: end]
return {
"nn": get(values, [3, 4, 5, 6], 0),
"daci": get(values, [4, 5], 2),
"u": get(values, [4, 5], 3),
"yaci": get(values, [5], 1),
"y": get(values, [1, 2, 6], 1),
"x": get(values, [1, 2, 6], 2)
}
def main():
df = pd.read_excel("deneme.xlsx")
print(value_range(df, 0, 6))
main()
Bu koddaki value_range(df, 0, 6)
ifadesi 0
ile 6
. satır arasındaki değerleri alıyor ve get
fonksiyonunun parametrelerine verilen değerler ile de ilgili satır ve sütunlardaki değerleri alıyoruz.
Paylaştığınız python dosyasında, bir kereye mahsus almış olduğunuz değerleri ekrana yazdırdım ve onların hangi sütun ve satırlarda olduğunu buldum.
Lütfen Dosya Yolunu Giriniz:deneme.xlsx
M4610021 PDK662 PDK664 PDK664
100.53741 99.66593
161.344 112.4381
211.42755
4199219.5672 4199373.2563 0
Yukarıdaki kodlar da bu düzene göre oluşturuldu. Siz print(value_range(df, 0, 6))
yazdığınız zaman bu değerleri içeren bir sözlük alacaksınız. Yani yukarıdaki kodları çalıştırırsanız alacağınız çıktı şöyle olacak:
{
'nn': ['M4610021', 'PDK662', 'PDK664', 'PDK664'],
'daci': [100.53741, 99.66593],
'u': [161.344, 112.4381],
'yaci': [211.42755],
'y': [425310.181, 425261.1811, 0.0],
'x': [4199219.5672, 4199373.2563, 0.0]
}
Eğer o ifadeyi print(value_range(df, 6, 12))
şeklinde değiştirirseniz bu sefer alacağınız çıktı şöyle olur.
{
'nn': ['PDK666', 'PDK664', 'PDK667', 'PDK667'],
'daci': [100.25794, 98.95513],
'u': [276.2369, 142.3544],
'yaci': [232.89788],
'y': [0.0, 218.7435, 0.0],
'x': [100.27239, 99.66487, 0.0]
}
ihtiyacınız olan değerleri value_range
fonksiyonundan dönen sözlük verisinin anahtar sözcüklerini kullanarak alabilirsiniz. Bu value_range
fonksiyonu bir döngü içerisine sokulabilir ve her seferinde parametreleri altışar altışar arttırılabilir. Bir bakın bakalım, bir hata var mı?
Ancak print(value_range(df, 0, 6))
ifadesi ile elde edilen verilerle yapılacak işlemlerle x
ve y
değerlerini oluşturuyor ve bu değerleri bir sonraki aşamanın x
ve y
değerleri olarak kullanıyorsak, bu print(value_range(df, 6, 12))
bize istenen değerleri vermeyebilir.
Maalesef hocam bu şekilde olmadı. 3. satırdan sonra her 3 satır için döngüye sokmam gerekli. Verdiğim örnekteki nn1=sheet[‘A3’] satırının her döngüde 3 satır artması gerekli ve en son bulduğu değerden devam etmesi gerekli. Yani 1. döngüde A3 iken ikinci döngüde A6, 3. döngüde A9 olarak ilerlemesi lazım. Ha keza diğer spesifik veriler için de aynısı olması gerekli. Mesela daci2=sheet[“c5”] değerinin de 2. döngüde C8 ve 3. döngüde C11 olarak ilerlemesi gerekli. Hepsinin 3’er artarak ilerlemesi lazım. Halen beceremedim, bilgisayara kafa atacam
Birinci döngüden elde edilen ve 2. döngüde kullanılacak olan değerler 1.py
dosyasındaki x4
ve y4
değerleri mi?
Kodunuzu çalıştırmayı deneyince bu hatayı alıyorum:
Warning (from warnings module):
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 53
return _prepare_from_string(" ".join(pjargs))
FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
Warning (from warnings module):
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 294
projstring = _prepare_from_string(" ".join((projstring, projkwargs)))
FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
Traceback (most recent call last):
File "C:\Users\Dinçel\Desktop\Projects\voyager\1.py", line 144, in <module>
inProj = Proj(init='epsg:5258')
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\proj.py", line 126, in __init__
self.crs = CRS.from_user_input(projparams, **kwargs)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 440, in from_user_input
return CRS(value, **kwargs)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 296, in __init__
super().__init__(projstring)
File "pyproj\_crs.pyx", line 2338, in pyproj._crs._CRS.__init__
pyproj.exceptions.CRSError: Invalid projection: +init=epsg:5258 +type=crs: (Internal Proj Error: proj_create: no database context specified)
Sanırım pyproj eksik sizde. Pyproj koorinat çevrimi için kullanılan bir kütüphane. Ondan ötürü hata vermiş olabilir.
Aynen öyle hocam. x4 ve y4 sürekli döngüye girmesi gereken.
Tamam, bir daha bakarım.
Gerekli bütün kütüphaneleri indirdim, zaten dikkat ederseniz yükseltilen hata ModuleNotFoundError
değil.
Benim anlamadığım bir durum var. Siz her seferinde üç satırın kullanıldığını söylemiştiniz. Ama kodlarınıza bakıyorum, 6 satır kullanmışsınız. Bu değerlerin döngünün ikinci adımına geçtiğinde nasıl değişeceğini bir yazar mısınız?
nn1=sheet['a3']
nn2=sheet["a4"]
nn3=sheet["a5"]
nn4=sheet["a6"]
daci1=sheet["c4"]
daci2=sheet["c5"]
u1=sheet["d4"]
u2_1=sheet["d5"]
yaci1=sheet["b5"]
y1=sheet["b1"]
y2=sheet["b2"]
y3=sheet["b6"]
x1=sheet["c1"]
x2=sheet["c2"]
x3=sheet["c6"]
Şu linkteki dosyalardan birini indirince sorun devam ediyor mu?