Python 错误 - IndexError:单个位置索引器超出范围

问题描述 投票:0回答:1

我正在尝试编写一个Python代码来下载所有上市公司的NSE股票数据。印度 NSE 上市公司仅有 1700 多家。我只需要最近 120 天的数据。我已经编写了下面的代码,但它抛出了下面的错误,尝试了几种方法来解决这个问题,但它仍然不起作用。任何解决此问题的指导将不胜感激。请注意,我已经声明了代码中出现的所有必要变量。

错误: IndexError:单个位置索引器超出范围

我的Python版本 - 3.13

def getHistoricalData(symInfo):
    res = None
    try:
        parseInstrument = urllib.parse.quote(symInfo.instrument_key)
        fromDate = (datetime.now(TIME_ZONE) - timedelta(days=120)) . strftime("%Y-%m-%d")
        todate = datetime.now(TIME_ZONE).strftime("%Y-%m-%d")        
        url = f'https://api.upstox.com/v2/historical-candle/{parseInstrument}/day/{todate}/{fromDate}'        
        res = requests.get(url, headers={'accept': 'application/json', }, params={}, timeout=5.0)
        candleRes = res.json()

        if 'data' in candleRes and 'candles' in candleRes['data'] and candleRes['data']['candles']:
            candleData = pd.DataFrame(candleRes['data']['candles'])
            candleData.columns = ['date', 'open', 'high', 'low', 'close', 'vol', 'oi']
            candleData = candleData[['date', 'open', 'high', 'low', 'close', 'vol', 'oi']]
            candleData['date'] = pd.to_datetime(candleData['date']).dt.tz_convert('Asia/Kolkata')
            candleData['symbol'] = symInfo.tradingsymbol            
            return candleData
        else:
            print('No data', symInfo.instrument_key, candleRes)
    except:
        print(f'Error in data fetch for (symInfo.instrument_key) {res} {e}')

candledfList = []
for i in symboldf.index[:-1]:
    candledfList = []
    res = getHistoricalData(symboldf.iloc[i])
    if res is not None: candledfList.append(res)
    finalDataDf = pd.concat(candledfList, ignore_index=True)

    isCsv = True
    for symData in candledfList[:-1]:
        try:
            filename = symData.iloc[0]['symbol']
            if isCsv:
                filename = f'{filename}.csv'
                symData.to_csv(folder + filename, index=False)
                del candledfList
            else:
                filename = f'{filename}.parquet'
                symData.to_parquet(folder_parquet + filename, engine='pyarrow')
                del candledfList
        except Exception as e:
            print(f'Error {e}')
python-3.x pandas stock nse
1个回答
0
投票

我已经成功解决了这个问题。错误的原因很简单 -

  1. 我必须从“res = getHistoricalData(symboldf.iloc[i])”中删除“i”,使其成为“res = getHistoricalData(symboldf.loc[i])”。这将解决问题。

    candledfList = [] 对于 symboldf.index[:-1] 中的 i: 蜡烛列表 = [] res = getHistoricalData(symboldf.iloc[i]) 如果 res 不是 None:candledfList.append(res) FinalDataDf = pd.concat(candledfList,ignore_index=True)

  2. 下面的 for 循环是为每个公司股票数据生成单个/单独的文件。我们可以删除这一点,并将逻辑移至上面的 for 循环,并生成一个 CSV 文件来捕获所有公司数据。但这种方法的问题是我们会丢失几家公司的数据,但不知道为什么。当我尝试将所有公司数据捕获到一个 CSV 文件中时,我丢失了 36 个公司数据。

isCsv = True 对于 CandledfList[:-1] 中的 symData: 尝试: 文件名 = symData.iloc[0]['符号'] 如果是CSV: 文件名 = f'{文件名}.csv' symData.to_csv(文件夹+文件名,索引=False) 德尔烛光列表 别的: 文件名 = f'{文件名}.parquet' symData.to_parquet(folder_parquet + 文件名,engine='pyarrow') 德尔烛光列表 除了异常 e: print(f'错误{e}')

© www.soinside.com 2019 - 2024. All rights reserved.