我本质上有两个不同的数据框,一个用于计算每周数据 (df),另一个用于计算股票/加密货币的绘图值 (df1) 。在 df 上,我使用每周数据创建了一个 pandas 列“pivot”((open+high+low)/3)来创建一组包含每周的值枢轴值。
现在我想将这些每周数据(以线的形式)绘制到具有每日数据的 df1 上。因此,x1 是一周的开始,x2 是一周的结束。 y 值是 df(每周)的枢轴值。 Here is what I would want it to look like:
我的方法和问题:
首先,我是Python的初学者,这是我学习的第二个月。如果之前有人问过这个问题,我深表歉意。
我知道可以使用单个数据框和 pandas group-by 来计算枢轴值,但我想在完成后解决这个问题,所以如果您正在解决这个问题,两种方法都应该没问题。我想要的是带有 OHLC 烛台的最后几行。我想使用 Plotly OHLC 绘制这些结果和 go Shapes 。我所困扰的是迭代枢轴每周数据框架并将线条添加为 OHLC 数据每日数据之上的跟踪。
这是到目前为止我的代码:
import yfinance as yf
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
df = yf.download( tickers = 'BTC-USD',
start = '2021-08-30',
end = datetime.today().strftime('%Y-%m-%d'),
interval = '1wk',
group_by = 'ticker',
auto_adjust = True).reset_index()
#daily df for plot
df2 = yf.download( tickers = 'BTC-USD',
start = '2021-08-30',
end = datetime.today().strftime('%Y-%m-%d'),
interval = '1d',
group_by = 'ticker',
auto_adjust = True).reset_index()
#small cap everything
df = df.rename(columns={'Date':'date',
'Open': 'open',
'High': 'high',
'Low' : 'low',
'Close' : 'close'})
df['pivot'] = (df['high']+ df['low'] + df['close'])/3
result = df.copy()
fig = go.Figure(data = [go.Candlestick(x= df['date'],
open = df['open'],
high = df['high'],
low = df['low'],
close = df['close'],
name = 'Price Candle')])
这将用于绘制烛台 OHLC 之前的图,但是,其余迭代才是困扰我的问题。您可以将其绘制在折线图或 OHLC 图表上并进行迭代。
fig = px.line(df, x='time', y='close')
result = df.copy()
for i, pivot in result.iterrows():
fig.add_shape(type="line",
x0=pivot.date, y0=pivot, x1=pivot.date, y1=pivot,
line=dict(
color="green",
width=3)
)
fig
当我打印此内容时,没有出现我希望的枢轴线。 Only the original price line graph shows 预先感谢您花时间阅读本文。
最佳答案
创建线段有两种方法:添加形状或在散点图上使用线条模式。我认为散点图的线模式更有优势,因为它允许更详细的设置。对于数据帧,逐行引入循环过程,使用数据帧的 idx 获取下一行。 y 轴值是枢轴值。我想要横滨,所以我把传奇位置上移了。另外,由于我们循环遍历散点图,因此我们将有许多枢轴值的图例,因此我们仅在第一次将图例显示设置为 True。
import yfinance as yf
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
df = yf.download( tickers = 'BTC-USD',
start = '2021-08-30',
end = datetime.today().strftime('%Y-%m-%d'),
interval = '1wk',
group_by = 'ticker',
auto_adjust = True).reset_index()
#daily df for plot
df2 = yf.download( tickers = 'BTC-USD',
start = '2021-08-30',
end = datetime.today().strftime('%Y-%m-%d'),
interval = '1d',
group_by = 'ticker',
auto_adjust = True).reset_index()
#small cap everything
df = df.rename(columns={'Date':'date',
'Open': 'open',
'High': 'high',
'Low' : 'low',
'Close' : 'close'})
df['pivot'] = (df['high']+ df['low'] + df['close'])/3
fig = go.Figure()
fig.add_trace(go.Candlestick(x= df['date'],
open = df['open'],
high = df['high'],
low = df['low'],
close = df['close'],
name = 'Price Candle',
legendgroup='one'
)
)
#fig.add_trace(go.Scatter(mode='lines', x=df['date'], y=df['pivot'], line=dict(color='green'), name='pivot'))
for idx, row in df.iterrows():
#print(idx)
if idx == len(df)-2:
break
fig.add_trace(go.Scatter(mode='lines',
x=[row['date'], df.loc[idx+1,'date']],
y=[row['pivot'], row['pivot']],
line=dict(color='blue', width=1),
name='pivot',
showlegend=True if idx == 0 else False,
)
)
fig.update_layout(
autosize=False,
height=600,
width=1100,
legend=dict(
orientation="h",
yanchor="bottom",
y=1.02,
xanchor="right",
x=1)
)
fig.update_xaxes(rangeslider_visible=False)
fig.show()
关于python - 通过 pandas 数据框迭代绘制日期范围之间的水平线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71872140/