在遍历 pandas 数据框的日期范围之间绘制水平线

Plot horizontal lines between date ranges iterating through pandas dataframe

我基本上有两个不同的数据框,一个用于计算每周数据 (df),第二个 (df1) stock/crypto 的绘图值。在 df 上,我使用每周创建了一个 pandas 列 'pivot' ((open+high+low)/3)数据以创建一组包含每周枢轴值的值。

现在我想将这些每周数据(作为线条)绘制到具有每日数据的 df1 上。因此 x1 将是一周的开始,x2 将是一周的结束。 y 值是 df(每周)的枢轴值。 Here is what I would want it to look like:

我的方法和问题:

首先,我是Python的初学者,这是我学习的第二个月。如果之前有人问过这个问题,我深表歉意。

我知道可以使用单个数据框和 pandas 分组来计算枢轴值,但我想在这完成后解决这个问题,所以如果你正在接近这个,这两种方法都应该没问题问题。我想要的是带有 OHLC 烛台的最后几行。我想使用 Plotly OHLC and 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 提前感谢您到目前为止花时间阅读本文。

创建线段有两种方法:添加形状或在散点图上使用线模式。我认为散点图的线模式更有优势,因为它允许更详细的设置。对于dataframe,在line-by-line的基础上引入一个循环过程,利用dataframe的idx得到下一行。 y-axis 值是枢轴值。我想得到横滨,所以我把传奇位置上移了。此外,由于我们循环遍历散点图,我们将有许多关于枢轴值的图例,因此我们仅在第一次将图例显示设置为 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()