Plotly - x 轴在绘制财务数据时产生间隙

问题描述 投票:0回答:1

我正在绘制市场广度,下图中的最后一个条形图,您可以看到股市收盘日期存在一些差距。然而在我的数据框中,这些日期不存在,我不确定为什么会出现,任何人都可以帮助我。

请帮我找到消除间隙的方法

import plotly.graph_objects as go
import pandas as pd
from tvDatafeed import TvDatafeed, Interval
from plotly.subplots import make_subplots

# Create TV Datafeed instance
tv = TvDatafeed()

# 1) Create Main CandleStick Chart
data_feed = tv.get_hist(symbol="SET", exchange='SET', interval=Interval.in_daily, n_bars=250)


# 6) Advance Decline Unchanged Chart
file_path_advance_decline_unchanged = "/content/drive/MyDrive/Stock Python/AdvanceDeclineUnchanged.csv"
AdvanceDeclineUnchanged_df = pd.read_csv(file_path_advance_decline_unchanged, index_col='Unnamed: 0')
last_250_days_data = AdvanceDeclineUnchanged_df.iloc[:, 0:250]
valid_dates = AdvanceDeclineUnchanged_df.loc["Advance", AdvanceDeclineUnchanged_df.loc["Advance"].notna()].index
plot_data = pd.DataFrame({
    'Date': data_feed.index,
    'Advance%': last_250_days_data.loc['Advance%', :].values,
    'Unchanged%': last_250_days_data.loc['Unchanged%', :].values,
    'Decline%': last_250_days_data.loc['Decline%', :].values
})

# Get only valid dates for x-axis
valid_dates = list(map(str, valid_dates))
plot_data = plot_data[plot_data['Date'].isin(valid_dates)]

# Create subplots
fig = make_subplots(rows=6, cols=1, shared_xaxes=True, vertical_spacing=0.04)

# Add traces to subplots
fig.add_trace(go.Candlestick(x=data_feed.index, open=data_feed.open, high=data_feed.high, low=data_feed.low, close=data_feed.close), row=1, col=1)

# 52Wks NHNL-Line Chart
_52WksNHNL_line = go.Scatter(x=_52WksNHNL_df.columns[0:249], y=_52WksNHNL_df.iloc[2, 0:250], mode='lines', name='52WksNewHighNewLow', line=dict(color='maroon'))
fig.add_trace(_52WksNHNL_line, row=2, col=1)

# 20Days NHNL-Line Chart
_20DaysNHNL_line = go.Scatter(x=_20DaysNHNL_df.columns[0:250], y=_20DaysNHNL_df.iloc[2, 0:250], mode='lines', name='20DaysNewHighNewLow', line=dict(color='green'))
fig.add_trace(_20DaysNHNL_line, row=3, col=1)

# 4% Gainer Chart
_4percent_line = go.Scatter(x=x_values_4percent, y=y_values_4percent, mode='lines', name='Amount of 4% Gainer', line=dict(color='blue'))
fig.add_trace(_4percent_line, row=4, col=1)

# EMA Breadth Chart
fig.add_trace(go.Scatter(x=_20EMA_Breadth_df.columns[0:250], y=_20EMA_Breadth_df.loc['Percent Above EMA', :].iloc[0:250], mode='lines', name='EMA20', line=dict(color='orange')), row=5, col=1)
fig.add_trace(go.Scatter(x=_50EMA_Breadth_df.columns[0:250], y=_50EMA_Breadth_df.loc['Percent Above EMA', :].iloc[0:250], mode='lines', name='EMA50', line=dict(color='red')), row=5, col=1)
fig.add_trace(go.Scatter(x=_200EMA_Breadth_df.columns[0:250], y=_200EMA_Breadth_df.loc['Percent Above EMA', :].iloc[0:250], mode='lines', name='EMA200', line=dict(color='purple')), row=5, col=1)

# Stacked bar chart for Advance Decline Unchanged Chart (Chart 6)
fig.add_trace(go.Bar(x=plot_data['Date'], y=plot_data['Decline%'], name='Decline%', marker_color='red'), row=6, col=1)
fig.add_trace(go.Bar(x=plot_data['Date'], y=plot_data['Unchanged%'], name='Unchanged%', marker_color='grey', base=plot_data['Decline%']), row=6, col=1)
fig.add_trace(go.Bar(x=plot_data['Date'], y=plot_data['Advance%'], name='Advance%', marker_color='green', base=plot_data['Unchanged%'] + plot_data['Decline%']), row=6, col=1)

# Update layout
fig.update_layout(xaxis_rangeslider_visible=False, height=2000, title_text="Thai StockMarket Market Breadth", xaxis=dict(type='category'))

python plotly
1个回答
0
投票

要排除市场假期和时间序列数据中的假期,请使用范围突破。我通过将公司股票价格作为与您的问题类似的数据并仅制作相关的子图烛台和条形图来测试这一点。首先要解决的是 x 轴必须是

date
类型。下一步是为范围破坏创建数据。我根据为股票价格获取的日期创建连续的日期数据,然后比较每个数据以创建仅在一侧的日期列表。这被设置为 x 轴的范围突破。

import yfinance as yf
import pandas as pd

data_feed = yf.download("AAPL", start="2023-01-01", end="2024-01-01")
data_feed.reset_index(inplace=True)
data_feed['Date'] = pd.to_datetime(data_feed['Date'])

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import numpy as np

# rangebreaks data
date_all = pd.DataFrame({'Date': pd.date_range('2023-01-01','2023-12-29',freq='1d'),'value': np.arange(1,364,1)})
rangebreak_list = pd.merge(data_feed, date_all, on=["Date", "Date"], how ="outer", indicator=True).query(f'_merge != "both"')

# Create subplots
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.05)

fig.add_trace(go.Candlestick(x=data_feed.Date, open=data_feed.Open, high=data_feed.High, low=data_feed.Low, close=data_feed.Close), row=1, col=1)

# Stacked bar chart for Advance Decline Unchanged Chart (Chart 6)
fig.add_trace(go.Bar(x=data_feed['Date'], y=data_feed['Open'], name='Open', marker_color='red'), row=2, col=1)
fig.add_trace(go.Bar(x=data_feed['Date'], y=data_feed['Low'], name='Low', marker_color='grey', base=data_feed['Open']), row=2, col=1)
fig.add_trace(go.Bar(x=data_feed['Date'], y=data_feed['High'], name='High', marker_color='green', base=data_feed['Open'] + data_feed['Low']), row=2, col=1)

# Update layout
fig.update_layout(xaxis_rangeslider_visible=False, height=600, title_text="Thai StockMarket Market Breadth", xaxis=dict(type='date'))
fig.update_xaxes(
    rangebreaks=[
        dict(values=rangebreak_list['Date'].tolist()),
    ]
)
fig.show()

© www.soinside.com 2019 - 2024. All rights reserved.