You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyCharm运行代码输出空索引问题排查(预期非空表格)

排查PyCharm中data_period返回空索引的思路

我运行下述代码时,期望打印出data_period对应的完整表格,但PyCharm返回了空索引。朋友使用相同代码在PyCharm上能得到目标表格,我们怀疑问题与PyCharm使用/存储信息的文件有关,还有其他排查思路吗?

import yfinance as yf
import pandas as pd
import numpy as np
from pandas_market_calendars import get_calendar

# Get the calendar for the NYSE
nyse = get_calendar('NYSE')

# Get the trading days for the NYSE between the start and end date
start_date = '2020-01-01'
end_date = '2023-01-26'
schedule = nyse.schedule(start_date, end_date)
trading_days = schedule.index

# Download the daily price action of the S&P 500
data = yf.download("SPY", start=start_date, end=end_date)

# Filter out days when the market is closed
data_period = data.loc[data.index.isin(trading_days)]


# Number of periods to calculate the standard deviation
averagingPeriod = 30
data_period['up'] = 100 * (data_period['High'].shift(1) - data_period['Open'].shift(1)) / data_period['Close'].shift(1)
data_period['down'] = 100 * np.abs(data_period['Open'].shift(1) - data_period['Low'].shift(1)) / data_period['Close'].shift(1)

# standard deviation
std_dev = data_period[['up','down']].rolling(window=averagingPeriod).std()
std_dev.rename(columns={'up':'up_std_dev','down':'down_std_dev'}, inplace=True)

# average
average = data_period[['up','down']].rolling(window=averagingPeriod).mean()
average.rename(columns={'up':'ave_up','down':'ave_down'}, inplace=True)

# H1 resistance level
data_period['H1'] = data_period['Open'] + (average['ave_up'] / 100) * data_period['Open']

# H2 resistance level
data_period['H2'] = data_period['Open'] + ((average['ave_up'] + std_dev['up_std_dev']) / 100) * data_period['Open']

# L1 support level
data_period['L1'] = data_period['Open'] - (average['ave_down'] / 100) * data_period['Open']

# L2 support level
data_period['L2'] = data_period['Open'] - ((average['ave_down'] + std_dev['down_std_dev']) / 100) * data_period['Open']

print(data_period)

排查思路:

  • 检查依赖库版本:确认yfinance、pandas_market_calendars、pandas等库的版本和朋友完全一致。不同版本可能导致数据索引的时区、格式差异,比如pandas_market_calendars返回的trading_days带时区,而yfinance下载的data索引不带时区,直接用isin会匹配失败。
  • 验证时区一致性:分别打印trading_days.tz和data.index.tz查看时区信息。如果存在时区不匹配,统一时区后再尝试匹配:比如将data.index转为带时区的索引:data.index = data.index.tz_localize('US/Eastern'),或者将trading_days转为无时区:trading_days = trading_days.tz_convert(None)。
  • 确认数据下载完整性:单独打印data.head(),检查yfinance是否成功下载到SPY的行情数据。网络问题可能导致下载失败,返回空DataFrame,后续自然得到空的data_period。
  • 调试日期匹配逻辑:提取单个日期对比,比如打印trading_days[0]和data.index[0]的类型、具体值,确认两者是否真的相等。可能存在datetime类型的细微差异(比如带时区和不带时区)导致匹配失败。
  • 清理缓存:尝试清理PyCharm缓存(通过File -> Invalidate Caches...),或者删除yfinance的本地缓存文件(一般在用户目录下的.yfinance文件夹),避免旧缓存干扰数据获取。
  • 检查运行环境:确认Python解释器版本和朋友一致,同时检查虚拟环境是否相同,是否存在依赖缺失的情况。不同Python版本的pandas对datetime的处理逻辑可能有区别。
  • 定位匹配失败原因:在生成data_period前,打印data.index.isin(trading_days)的结果,查看是否全为False。如果是,说明核心问题是日期匹配失败,而非后续代码逻辑错误。

内容的提问来源于stack exchange,提问作者John Habib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:05:45