python-3.x 从绘图图中删除dt_breaks

c7rzv4ha  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(88)

我想绘制一个ohlc图,在不同的时间间隔内删除没有数据的间隙(范围中断)。程序工作良好时,使用每日间隔,但我无法删除的差距时,使用其他间隔(1小时,30分钟),过程是或多或少相同,但只显示第一天。
首先,我认为这是一个日期时间格式的问题,但删除“rangebreaks”允许绘制所有系列。
有什么建议吗?
先谢了

import warnings
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta
import numpy as np
import plotly.io as pio
from plotly.subplots import make_subplots
import plotly
import plotly.graph_objects as go
import yfinance as yf
#pio.renderers.default = "browser"
warnings.filterwarnings('ignore')

t_var = ['META']
end = datetime.now()
start = end - relativedelta(days=59)
df_y = yf.download(t_var, start=start.strftime('%Y-%m-%d'), end=end.strftime('%Y-%m-%d'), interval= "30m")
d = df_y.index[0]
b = df_y.index[-1]

dt_all = pd.date_range(start=d,end=b,freq='30min')
dt_breaks = [d for d in dt_all if not d in df_y.index]
fig = make_subplots(rows=1, cols=1)
fig.add_ohlc(x=df_y.index, open=df_y['Open'], high=df_y['High'], low=df_y['Low'], close=df_y['Close'],name='stock',decreasing_line_color='#21201f', increasing_line_color='#21201f', row=1, col=1)
fig.update_xaxes(showgrid=False, zeroline=False, showticklabels=True, showspikes=True, spikemode='across', spikesnap='cursor', showline=False,rangebreaks=[dict(values=dt_breaks)], rangeslider_visible=False)
#fig.update_xaxes(showgrid=False, zeroline=False, showticklabels=True, showspikes=True, spikemode='across', spikesnap='cursor', showline=False,rangeslider_visible=False)
fig.show()

字符串

bqjvbblv

bqjvbblv1#

无法由rangebreak功能单独处理的市场假期可以通过将目标期间添加到rangebreak来处理,但规范不起作用。rangebreak=[dict(bounds=['sat','mon']),dict(bounds=[16,9], pattern='hour'),dict(value=['2023-06-17','2023-06-19'])]另一种方法是将当前索引添加到从开始日期到结束日期的30分钟间隔的索引中,并仅提取不重叠的索引。然后将该提取提供给rangebreak。此时,rangebreak的dvalue的基础值为86400000msec(1000msec60sec60min 24h),因此我们将其设置为1800000(1000msec60sec*30min)。

t_var = ['META']
end = datetime.now()
start = end - relativedelta(days=59)
df_y = yf.download(t_var, start=start.strftime('%Y-%m-%d'), end=end.strftime('%Y-%m-%d'), interval= "30m")

d = df_y.index[0]
b = df_y.index[-1]

dt_all = pd.date_range(start=d,end=b,freq='30min')

marged_index = dt_all.append(df_y.index)
timegap = marged_index[~marged_index.duplicated(keep = False)]

fig = make_subplots(rows=1, cols=1)
fig.add_ohlc(x=df_y.index,
             open=df_y['Open'],
             high=df_y['High'],
             low=df_y['Low'],
             close=df_y['Close'],
             name='stock',
             decreasing_line_color='#21201f',
             increasing_line_color='#21201f',
             row=1, col=1)
fig.update_xaxes(showgrid=False,
                 zeroline=False,
                 showticklabels=True,
                 showspikes=True,
                 spikemode='across',
                 spikesnap='cursor',
                 showline=False,
                 rangebreaks=[
                     dict(values=timegap, dvalue=1800000), # 30min:1000msec*60sec*30min
                 ],
                 rangeslider_visible=False)
fig.show()

字符串


的数据

2izufjch

2izufjch2#

问题在于如何计算dt_breaks。当您使用每日时间间隔时,它工作得很好,因为在每日时间框架中没有丢失的数据点。但是,当使用较小的间隔(如30分钟)时,数据中可能存在间隙(丢失数据),并且计算dt_breaks的方式会导致问题。
要解决这个问题,您需要修改dt_breaks的计算,以找到缺失的数据点并创建适当的范围间隔。下面是代码的更新版本

import warnings
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta
import numpy as np
import plotly.io as pio
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import yfinance as yf

#pio.renderers.default = "browser"
warnings.filterwarnings('ignore')

t_var = ['META']
end = datetime.now()
start = end - relativedelta(days=59)
df_y = yf.download(t_var, start=start.strftime('%Y-%m-%d'), end=end.strftime('%Y-%m-%d'), interval="30m")
d = df_y.index[0]
b = df_y.index[-1]

dt_all = pd.date_range(start=d, end=b, freq='30min')
dt_breaks = [d for d in dt_all if d not in df_y.index]

fig = make_subplots(rows=1, cols=1)
fig.add_ohlc(x=df_y.index, open=df_y['Open'], high=df_y['High'], low=df_y['Low'], close=df_y['Close'], name='stock', decreasing_line_color='#21201f', increasing_line_color='#21201f', row=1, col=1)

# Calculate range breaks for missing data
range_breaks = []
for i in range(1, len(df_y.index)):
    prev_time = df_y.index[i - 1]
    curr_time = df_y.index[i]
    if (curr_time - prev_time) > pd.Timedelta(minutes=30):
        range_breaks.append(dict(values=[prev_time, curr_time]))

fig.update_xaxes(showgrid=False, zeroline=False, showticklabels=True, showspikes=True, spikemode='across', spikesnap='cursor', showline=False, rangebreaks=range_breaks, rangeslider_visible=False)
fig.show()

字符串
修改后的代码根据连续数据点之间的时间差计算range_breaks。如果时间差大于30分钟,则表示缺少数据点,并且在先前数据点和当前数据点之间创建范围中断。这样,OHLC图将不会显示由缺失数据引起的差距。
请尝试此更新的代码,它应该以30分钟间隔或您选择的任何其他间隔显示无间隙的OHLC图。

相关问题