Python ile excel veri eklerken ilk satırı değiştirememe

Merhaba, iş yatırım sitesine istek gönderip yayınlanan bilançoların çekilmesi ile ilgili araştırma yapıyorum. İşlemin sonuna geldim ve verileri excel dosyasına gönderiyorum. Tek sorun excel sayfasının 1. satırında bilanço tarihlerinin yazması gerekli fakat ekleyemiyorum. Bilanço tarihlerinin olduğu bir listem mevcut fakat ekleyemedim.

import requests
from bs4 import BeautifulSoup
import pandas as pd
import json

hisseler = ["THYAO"]

user_agent = 'Mozilla/..........'
headers = {'User-Agent': user_agent}
url = "https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=ACSEL"
r = requests.get(url, headers=headers)

    donemler = []
    user_agent = 'Mozilla.........'
    headers = {'User-Agent': user
s = BeautifulSoup(r.text, "html.parser")  
s1 = s.find("select", id="ddlAddCompare")
c1 = s1.findChild("optgroup").findAll("option")

for i in hisseler:
    hisse = i
    tarihler = []
    yillar = []
    donemler = []
    user_agent = 'Mozilla.........'
    headers = {'User-Agent': user_agent}
    url1 = "https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=" + hisse
    r1 = requests.get(url1, headers=headers)
    soup = BeautifulSoup(r1.text, "html.parser")
    secim = soup.find("select", id="ddlMaliTabloFirst")
    secim2 = soup.find("select", id="ddlMaliTabloGroup")

    try:

        cocuklar = secim.findChildren("option")
        grup = secim2.find("option")["value"]
        
        for i in cocuklar:
            tarihler.append(i.string.rsplit("/"))
        

        for j in tarihler:
            yillar.append(j[0])
            donemler.append(j[1])
        
        if len(tarihler) >= 4:
            parametreler = (
                ("companyCode", hisse),
                ("exchange", "TRY"),
                ("financialGroup", grup),
                ("year1", yillar[0]),
                ("period1", donemler[0]),
                ("year2", yillar[1]),
                ("period2", donemler[1]),
                ("year3", yillar[2]),
                ("period3", donemler[2]),
                ("year4", yillar[3]),
                ("period4", donemler[3]))
            user_agent = 'Mozilla..........'
            headers = {'User-Agent': user_agent}
            url2 = "https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo"
            r22 = requests.get(url2, headers=headers, params=parametreler)
            r2 = requests.get(url2, headers=headers, params=parametreler).json()["value"]
            veri = pd.DataFrame.from_dict(r2)
            veri.drop(columns=["itemCode", "itemDescEng"], inplace=True)
            
        else:
            continue

    except AttributeError:
        continue

    del tarihler[0:4] 
    tumveri = [veri] 

    for _ in range(0,int(len(tarihler)+1)):

        if len (tarihler)==len(yillar):
            del tarihler[0:4]
        else:
            yillar=[]
            donemler=[]

            for j in tarihler:
                yillar.append(j[0])
                donemler.append(j[1])

            if len (tarihler)>=4:
                parametreler2 = (
                    ("companyCode", hisse),
                    ("exchange", "TRY"),
                    ("financialGroup", grup),
                    ("year1", yillar[0]),
                    ("period1", donemler[0]),
                    ("year2", yillar[1]),
                    ("period2", donemler[1]),
                    ("year3", yillar[2]),
                    ("period3", donemler[2]),
                    ("year4", yillar[3]),
                    ("period4", donemler[3]))

                user_agent = 'Mozilla..........'
                headers = {'User-Agent': user_agent}
                r3 = requests.get(url2, headers=headers, params=parametreler2).json()["value"]
                veri2 = pd.DataFrame.from_dict(r3)

                try:
                    veri2.drop(columns=["itemCode", "itemDescTr","itemDescEng"], inplace=True) 
                    tumveri.append(veri2) 

                except KeyError:
                    continue

        veri3=pd.concat(tumveri,axis=1)
        baslik = ["Bilanço"]

        for i in cocuklar:
            baslik.append(i.string)

        baslikfark=len(baslik)-len(veri3.columns)

        if baslikfark !=0:
            del baslik[-baslikfark:]

    print(baslik) # excelde 1. satırda yazılacak başlıklar bunlar 1. satıra yazdıramıyorum

veri3.set_axis(baslik, axis=1)
veri3.fillna(0, inplace=True)

with pd.ExcelWriter("C:/Users/Documents/bilançolar/{}.xlsx".format(hisse)) as writer:
    veri3.to_excel(writer, sheet_name="BİLANÇOLAR", index=False)

Baslıklar bu satıra gelmesi gerekiyor ama yazdıramıyorum.

Teşekkürler.

Merhaba,

kodunuz bu haliyle hata veriyor çalışmıyor. Eğer eksik veri yapıştırdıysanız ve sizdeki kodlar doğru çalışıyorsa aşağıdaki bilgileri okuyabilirsiniz. Sadece mport requests kısmındaki eksik i harfinden bahsetmiyorum.

ChatGP’de aynı fikirde ve şöyle diyor; :slight_smile:

  1. headers değişkeniyle kullanılan user_agent değeri eksik veya hatalı. user_agent değerini uygun bir şekilde tanımlamak için bir değer atamanız gerekiyor.
  2. Kodunuzda bir döngü içinde bir döngü var (for _ in range(0,int(len(tarihler)+1)): for j in tarihler:). İlk döngüde tarihler listesi üzerinde dönerken, içteki döngüde bu listenin elemanlarını kullanıyorsunuz. Ancak içteki döngüde tarihler listesini değiştiriyorsunuz. Bu, beklenmedik davranışlara yol açabilir. İç içe döngüler yerine daha düzgün bir yaklaşım kullanmanız gerekebilir.
  3. veri3.set_axis(baslik, axis=1) satırında veri3 .set_axis(baslik, axis=1)satırındaset_axisyöntemini çağırırken,veri3değişkeninin üzerine güncellenmiş bir sürümü döndürmezsiniz. Bu nedenle,veri3üzerinde yapılan değişiklikler kalıcı olmaz. Bunun yerine,set_axis yöntemini kullanarak döndürülen DataFrame’i bir değişkene atayarak güncellenmiş sürümü elde edebilirsiniz:
veri3 = veri3.set_axis(baslik, axis=1)

Benim cevabım ise şöyle ;

Bilanço tarihlerinin olduğu bir listem mevcut fakat ekleyemedim.

header ve names Parametrelerini kullanabilirsiniz. Aslında sizin sorunuzda direkt names parametresi yeterli.

Başlık olarak kullanmak istediğiniz liste verilerini, pandas kodlarının içinde names parametresi olarak belitmeniz yeterli olur diye düşünüyorum.

with pd.ExcelWriter("C:/Users/Documents/bilançolar/{}.xlsx".format(hisse)) as writer:
    veri3.to_excel(writer, sheet_name="BİLANÇOLAR", index=False, names = baslik)

Kullanım detayları için buradaki bağlantıyı inceleyebilirsiniz.

header ve names Parametreleri

read_excel () fonksiyonu, Excel’deki ilk satırı varsayılan olarak bir başlık kabul eder ve bunu Veri Çerçevesi (DataFrame) sütun adları olarak kullanır. Excel dosyasındaki ilk satırın başlık değil, bir veri olduğu düşünüldüğünde, yani sadece verilerden oluşan excel dosyası ile çalıştığımızda, header=None parametresi kullanılmalıdır. Bu durumda Başlık (sütun adlarını) belirtmek için names parametresi kullanılır.

Başlık (sütun adlarını) belirtmek için names parametresi kullanılır. names parametresi, tablo ile eşit sayıda sütundan oluşan liste veri tipi olmalı.
Ör. baslık tanımla; baslik = ["Birler", "Onlar", "Yüzler"]
ardından;
df = pd.read_excel("Veri.ods", header = None, names = baslik)

Yanıtınız ve yardımlarınız için teşekkürler. Kopyalarken i harfini almamışım kusura bakmayın.

User agent bilgisi her bilgisayarda farklı olduğu için; user_agent = 'Mozilla/..........'
şeklinde belirtmiştim bu sebepten ChatGP hata olarak algılamış olmalı kaçmamış :slight_smile:

veri3.set_axis(baslik, axis=1) kodu yerine ChatGP’nin önerdiği veri3 = veri3.set_axis(baslik, axis=1) kodunu yazınca başlıklar değişti.

ChatGP’ye nasıl soru sordunuz ? Nereyi kullandınız? Bu konuda bilgi verebilir misiniz?

1 Beğeni