urazakgul / isyatirimhisse

https://pypi.org/project/isyatirimhisse/
MIT License
101 stars 14 forks source link

3.0.1 keyerror: value hatası #14

Closed ErcanYaman closed 1 year ago

ErcanYaman commented 1 year ago

Selam,

Aşağıda toplam 400 sembolün olduğu script yaklaşık 2 dk çalıştıktan sonra keyError: value hatası aldı.

İnceleyebilir misiniz?

from isyatirimhisse import fetch_data from datetime import date, timedelta, datetime import asyncio

async def main(): symbol = ['AEFES','AFYON','AGESA','AGHOL','AHGAZ','AKCNS','AKFGY','AKFYE','AKGRT','AKSA','ALCTL','ALFAS','ALKIM','ANGEN','ANHYT','ANSGR', 'ARASE','ARCLK','ARDYZ','ARENA','ARSAN','ASUZU','AYDEM','AYEN','AYGAZ','AZTEK','BARMA','BERA','BIOEN','BLCYT','BOBET','BRISA', 'BRKVY','BRLSM','BRSAN','BRYAT','BTCIM','BUCIM','BVSAN','CANTE','CCOLA','CEMAS','CEMTS','CIMSA','CLEBI','CONSE','CVKMD','CWENE', 'DAPGM','DESA','DEVA','DGNMO','DOAS','DOHOL','DYOBY','ECILC','ECZYT','EGEEN','EGEPO','EGGUB','EGPRO','EGSER','EKSUN','ELITE','ENJSA', 'ENKAI','ERBOS','ERCB','EREGL','ESCAR','ESCOM','ESEN','EUREN','FROTO','GEDIK','GENIL','GENTS','GESAN','GLCVY','GLYHO','GOKNR', 'GOLTS','GOODY','GRSEL','GRTRK','GSDHO','GUBRF','GWIND','HEDEF','HEKTS','HKTM','HTTBT','HUNER','IMASM','INDES','INFO','INVEO', 'INVES','IPEKE','ISDMR','ISFIN','ISMEN','ISSEN','IZMDC','JANTS','KAREL','KARSN','KARTN','KATMR','KAYSE','KCAER','KCHOL','KERVT', 'KLKIM','KLMSN','KLRHO','KLSYN','KMPUR','KNFRT','KONKA','KONTR','KONYA','KOPOL','KORDS','KOZAA','KOZAL','KRPLS','KRVGD','KTLEV', 'KTSKR','LIDER','LOGO','MAGEN','MAKIM','MEDTR','MERCN','MGROS','MIATK','MNDRS','MNDTR','MOBTL','MPARK','MTRKS','NATEN','NETAS', 'NTGAZ','NUHCM','ONCSM','ORGE','OTKAR','OYAKC','OYYAT','OZKGY','PAMEL','PARSN','PASEU','PENGD','PENTA','PETKM','PETUN','PGSUS', 'PNLSN','PNSUT','POLHO','PRDGS','PRKAB','PRKME','QUAGR','RUBNS','RYSAS','SAHOL','SARKY','SASA','SAYAS','SELEC','SISE','SMRTG', 'SNICA','SOKM','SRVGY','SUNTK','SUWEN','TATGD','TCELL','TERA','TEZOL','TKFEN','TKNSA','TMSN','TOASO','TRCAS','TRILC','TTKOM', 'TTRAK','TUKAS','TUPRS','TUREX','TURSG','ULUUN','VAKKO','VERUS','VESBE','YATAS','YEOTK','YKSLN','YUNSA','YYLGD','ZOREN','AYES', 'BALAT','BASCM','CMENT','ISBIR','KENT','KLNMA','KSTUR','SNPAM','SODSN','SUMAS','TBORG','UMPAS','UZERB','YBTAS','YONGA','ATSYH', 'BRKO','BRMEN','CASA','DIRIT','EKIZ','EMNIS','KERVN','KUVVA','MMCAS','OTTO','ROYAL','SNKRN','ACSEL','ADEL','ADESE','AKENR','AKMGY', 'AKSUE','ALCAR','ALKA','ALMAD','ANELE','ARZUM','ATEKS','ATLAS','AVHOL','AVOD','AVTUR','AYCES','BAKAB','BANVT','BAYRK','BEYAZ', 'BFREN','BMSCH','BMSTL','BNTAS','BOSSA','BRKSN','BSOKE','BURCE','BURVA','CELHA','CEOEM','CMBTN','COSMO','CRDFA','CRFSA','DAGHL', 'DAGI','DARDL','DENGE','DERHL','DERIM','DESPC','DGATE','DITAS','DMSAS','DNISI','DOBUR','DOGUB','DOKTA','DURDO','EDATA','EDIP', 'EMKEL','ENSRI','EPLAS','ERSU','ETILR','ETYAT','EUHOL','FADE','FLAP','FMIZP','FORMT','FORTE','FRIGO','GARFA','GEDZA','GEREL', 'GLBMD','GLRYH','GMTAS','GSDDE','GZNMI','HATEK','HDFGS','HUBVC','HURGZ','ICUGS','IDEAS','IEYHO','INGRM','INTEM','ISGSY','ISKPL', 'ITTFH','IZFAS','IZINV','KAPLM','KARYE','KFEIN','KIMMR','KRONT','KRSTL','KRTEK','KUTPO','KUYAS','LIDFA','LINK','LKMNH','LUKSK', 'MAALT','MAKTK','MANAS','MARKA','MEGAP','MEPET','MERIT','MERKO','METUR','MIPAZ','MRSHL','MZHLD','NIBAS','OBASE','ORCAY','OSTIM', 'OYLUM','OZRDN','OZSUB','PAPIL','PCILT','PEKGY','PINSU','PKART','PKENT','PLTUR','POLTK','PRZMA','PSDTC','RALYH','RAYSG','RNPOL', 'RODRG','RTALB','SAFKR','SAMAT','SANEL','SANFM','SANKO','SEKFK','SEKUR','SELGD','SELVA','SEYKM','SOKE','SONME','TEKTU','TETMT', 'TGSAS','TLMAN','TMPOL','TNZTP','TUCLK','TURGG','UFUK','ULAS','ULUFA','ULUSE','USAK','VANGD','VBTYZ'] stock_market_index = ['XU100'] start_date = '31-12-' + str((date.today().year - 1)) end_date = (date.today() - timedelta(days=1)).strftime("%d-%m-%Y") frequency = '1d' drop_na = False language = 'tr'

veriler = await fetch_data(
    symbol=symbol,
    stock_market_index=stock_market_index,
    start_date=start_date,
    end_date=end_date,
    frequency=frequency,
    drop_na=drop_na,
    language=language
)
veriler = veriler.sort_values(by='Tarih', ascending=False).fillna(method='ffill').dropna().iloc[[0, -1]].iloc[:, 1:]
getiri = round((veriler.iloc[0] / veriler.iloc[-1] - 1) * 100, 2)
return getiri

async def run(): sonuc = await main() print(sonuc)

async def main_wrapper(): gorev = asyncio.create_task(run()) await gorev

asyncio.run(main_wrapper())

=================================== File "C:\Users\200055\Anaconda3\lib\asyncio\runners.py", line 44, in run return loop.run_until_complete(main) File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 616, in run_until_complete return future.result()

veriler = await fetch_data(

File "C:\Users\200055\Anaconda3\lib\site-packages\isyatirimhisse\FetchData.py", line 126, in fetch_data if result and result['value']: KeyError: 'value' Exception ignored in: <function _ProactorBasePipeTransport.del at 0x00000179136943A0> Traceback (most recent call last): File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 116, in del self.close() File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 108, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 719, in call_soon self._check_closed() File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 508, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed Exception ignored in: <function _ProactorBasePipeTransport.del at 0x00000179136943A0> Traceback (most recent call last): File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 116, in del self.close() File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 108, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 719, in call_soon self._check_closed() File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 508, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed Exception ignored in: <function _ProactorBasePipeTransport.del at 0x00000179136943A0> Traceback (most recent call last): File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 116, in del self.close() File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 108, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 719, in call_soon self._check_closed() File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 508, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed Exception ignored in: <function _ProactorBasePipeTransport.del at 0x00000179136943A0> Traceback (most recent call last): File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 116, in del self.close() File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 108, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 719, in call_soon self._check_closed() File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 508, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed Exception ignored in: <function _ProactorBasePipeTransport.del at 0x00000179136943A0> Traceback (most recent call last): File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 116, in del self.close() File "C:\Users\200055\Anaconda3\lib\asyncio\proactor_events.py", line 108, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 719, in call_soon self._check_closed() File "C:\Users\200055\Anaconda3\lib\asyncio\base_events.py", line 508, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed

urazakgul commented 1 year ago

Selam,

Site kaynaklı bir durum olduğu için pek müdahale edemiyorum ancak kodu buna göre şekillendirebilirsiniz. Örneğin, for döngüsü yardımıyla her 10 hissede 30 saniye bekleyebilirsiniz. Değerleri kendinize göre optimize edebilirsiniz.

from isyatirimhisse import fetch_data
from datetime import date, timedelta
import asyncio
import nest_asyncio
nest_asyncio.apply()

async def fetch_data_for_symbols(symbols, start_date, end_date):
    veriler = await fetch_data(
        symbol=symbols,
        start_date=start_date,
        end_date=end_date,
        frequency='1d',
        drop_na=False,
        language='tr'
    )
    return veriler

def calculate_returns(veriler):
    veriler = veriler.sort_values(by='Tarih', ascending=False).fillna(method='ffill').dropna().iloc[[0, -1]].iloc[:, 1:]
    getiri = round((veriler.iloc[0] / veriler.iloc[-1] - 1) * 100, 2)
    return getiri

async def fetch_and_process_batch(symbol_batch, start_date, end_date):
    veriler = await fetch_data_for_symbols(symbol_batch, start_date, end_date)
    getiri = calculate_returns(veriler)
    return getiri

async def main():
    symbol_list = [] # sembol listesi
    batch_size = 10
    delay_seconds = 30
    start_date = '31-12-' + str((date.today().year - 1))
    end_date = (date.today() - timedelta(days=1)).strftime("%d-%m-%Y")

    for i in range(0, len(symbol_list), batch_size):
        batch_symbols = symbol_list[i:i + batch_size]
        print(f"Fetching data for symbols: {batch_symbols}")

        getiri = await fetch_and_process_batch(batch_symbols, start_date, end_date)
        print(getiri)

        if i + batch_size < len(symbol_list):
            print(f"Waiting for {delay_seconds} seconds before the next batch...")
            await asyncio.sleep(delay_seconds)

asyncio.run(main())