如何将NSE India API返回的JSON数据转换为表格格式并筛选指定列
解决NSE India API JSON转DataFrame及列筛选问题
首先,你直接用pd.DataFrame(res.json())失败的原因是NSE这个API返回的JSON是嵌套式结构——实际的标的数据被包裹在顶层的'data'键下面,不是直接的数组格式,所以得先提取出正确的数据部分再转换。
步骤1:先确认JSON的具体结构
先运行这段代码查看返回的JSON结构,找到存储持仓量数据的数组位置:
import requests from pprint import pprint import pandas as pd baseurl = 'https://www.nseindia.com/' url = f'https://www.nseindia.com/api/live-analysis-oi-spurts-underlyings' headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'} session = requests.Session() request = session.get(baseurl, headers=headers, timeout=30) cookies = dict(request.cookies) res = session.get(url, headers=headers, timeout=30, cookies=cookies) # 打印完整JSON结构,定位数据所在的键 pprint(res.json())
运行后你会发现,所有持仓量激增标的的表格数据都存在'data'这个键对应的数组里。
步骤2:正确转换JSON为DataFrame
基于上面的结构,我们提取res.json()['data']来创建标准表格:
# 提取嵌套的data数组,转换为DataFrame df = pd.DataFrame(res.json()['data']) print(df.head())
这样就能得到正常的表格格式数据了。
步骤3:筛选特定列
如果只需要部分列,比如只保留标的代码、持仓量、持仓量变化及变化百分比,直接用列名列表筛选即可:
# 定义需要保留的列名 selected_columns = ['symbol', 'openInterest', 'changeInOi', 'percentChangeInOi'] # 筛选出目标列 filtered_df = df[selected_columns] print(filtered_df.head())
完整可运行代码
把所有步骤整合后的完整代码如下:
import requests import pandas as pd baseurl = 'https://www.nseindia.com/' url = f'https://www.nseindia.com/api/live-analysis-oi-spurts-underlyings' headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'} session = requests.Session() # 先获取站点Cookie,避免请求被拦截 session.get(baseurl, headers=headers, timeout=30) # 请求API数据 res = session.get(url, headers=headers, timeout=30) # 转换为DataFrame df = pd.DataFrame(res.json()['data']) # 筛选特定列 selected_columns = ['symbol', 'openInterest', 'changeInOi', 'percentChangeInOi'] filtered_df = df[selected_columns] # 输出结果 print("完整表格数据前5行:") print(df.head()) print("\n筛选后的特定列数据:") print(filtered_df.head())
补充说明
如果后续NSE的API结构有变化,只需要调整提取数据的键名即可。另外,若遇到请求失败,可以尝试更新user-agent为你当前浏览器的最新版本,避免被反爬机制拦截。
内容的提问来源于stack exchange,提问作者Brijesh Chaurasia
相关产品推荐
相关产品推荐

