VisibleDeprecationWarning报错排查:Python金融数据爬取代码求助
问题排查请求
遇到赋值维度不匹配类错误,同时收到警告:VisibleDeprecationWarning: specify 'dtype=object' when creating the ndarray. arr_value = np.asarray(value)
烦请排查以下代码中的问题:
获取标普500股票列表代码
import requests import pandas as pd url = 'https://www.slickcharts.com/sp500' headers = {"User-Agent" : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'} request = requests.get(url, headers = headers) data = pd.read_html(request.text)[0] stk_list = data.Symbol stk_list = data.Symbol.apply(lambda x: x.replace('.', '-')) stk_list
获取股票基本面数据代码
import yfinance as yf import time stk_basic_data = yf.Ticker('AAPL').info stk_basic_data info_columns = list(stk_basic_data.keys()) stk_info_df = pd.DataFrame(index = stk_list.sort_values(), columns = info_columns) failed_list = [] for i in stk_info_df.index: try: print('processing: ' + i) info_dict = yf.Ticker(i).info columns_included = list(info_dict.keys()) intersect_columns = [x for x in info_columns if x in columns_included] stk_info_df.loc[i,intersect_columns] = list(pd.Series(info_dict [intersect_columns].values) time.sleep(1) except: failed_list.append(i) continue
问题分析与修复方案
1. 直接触发错误的语法问题
第二部分代码中,list(pd.Series(info_dict[intersect_columns].values))缺少一个右括号,导致语法解析失败,这是截图错误的直接原因。修正后代码:
stk_info_df.loc[i,intersect_columns] = list(pd.Series(info_dict[intersect_columns]).values)
2. VisibleDeprecationWarning警告修复
警告是因为pandas在将混合类型数据(字符串、数字、空值等)转为numpy数组时,未指定dtype=object。推荐直接用列表推导式提取值,避免不必要的类型转换:
stk_info_df.loc[i, intersect_columns] = [info_dict[col] for col in intersect_columns]
如果坚持使用Series方式,需明确指定dtype:
stk_info_df.loc[i,intersect_columns] = pd.Series(info_dict[intersect_columns], dtype=object).tolist()
3. 额外优化建议
- 减少重复实例化:
yf.Ticker(i)可以只创建一次,避免重复调用接口 - 精准异常捕获:替换宽泛的
except:为具体异常类型(如requests.exceptions.RequestException、KeyError),便于定位问题
优化后的循环代码示例:
for i in stk_info_df.index: try: print('processing: ' + i) ticker = yf.Ticker(i) info_dict = ticker.info # 逐个赋值,避免类型转换问题 for col in intersect_columns: stk_info_df.loc[i, col] = info_dict.get(col, None) time.sleep(1) except Exception as e: print(f"处理{i}时出错: {str(e)}") failed_list.append(i) continue
内容的提问来源于stack exchange,提问作者Lee NelsonML
相关产品推荐
相关产品推荐

