我正在尝试编写一个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}')
我已经成功解决了这个问题。错误的原因很简单 -
我必须从“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)
下面的 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}')