python - 通过 pandas 数据框迭代绘制日期范围之间的水平线

标签 python pandas dataframe plotly plotly-python

我本质上有两个不同的数据框,一个用于计算每周数据 (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()

enter image description here

关于python - 通过 pandas 数据框迭代绘制日期范围之间的水平线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71872140/

相关文章:

python - 尝试在 Python : "ImportError: cannot import name core" 中使用 gevent 库

python - 返回类型取决于 Python 中的输入类型

python - 重新采样分钟数据

python - 连接两个数据框的模糊匹配

python - 定义函数以按名称选择列,Dataframe Python

python - 在 Python 中打开远程文档

python - flask 不读取或解释 css 文件

python - 如何在 python zeep 中使用额外的 xsd?

python - 搜索和更新 Pandas 数据框中每一行值的最快方法

python - 基于其他数据框向 Pandas 数据框添加新列