【问题标题】:Python: Plotly Candlestick Chart with ScatterPython:用散点图绘制烛台图
【发布时间】:2022-10-02 10:37:44
【问题描述】:

要重新创建自己:CANDLESTICK CSV | ORDERS CSV

import pandas as pd
import plotly.graph_objects as go

def plot_ohlcv_plotly(df, orders):
        df.columns = [\'Date\', \'Open\', \'High\', \'Low\', \'Close\', \'Volume\']
        df[\'Date\'] = pd.to_datetime(df[\'Date\'], unit=\'ms\')
        fig = go.Figure(
            data=[go.Candlestick(
                    x=df[\'Date\'],
                    open=df[\'Open\'],
                    high=df[\'High\'],
                    low=df[\'Low\'],
                    close=df[\'Close\'])])

        date = pd.to_datetime(orders[\'timestamp\'], unit=\'ms\')

        size = orders[\'size\'] * 0.5

        fig.add_trace(go.Scatter(x=date, y=orders[\'price\'], mode=\"markers\", marker = dict(
                # color = orders[\'color\'], <-- where color is set
                size=size
            )
        ))

        fig.show()


df = pd.read_csv(\'btcusdt-orders.csv\')
candles = pd.read_csv(\'btcusdt-candles.csv\')

grouped_multiple = df.groupby([\'timestamp\']).agg({\'size\': [\'sum\'], \'price\': [\'mean\'], \'side\':[\'first\']})
grouped_multiple.columns = [\'size\', \'price\', \'side\']
orders = grouped_multiple.reset_index()

orders = orders.loc[orders[\'size\'] > 20]

# pepe.plot_orders(grouped_multiple)
plot_ohlcv_plotly(candles, orders)

我有一个简单的问题,我似乎无法找到解决方案。

我想要做的是在烛台图的顶部绘制一个散点图,显示在时间范围内发生的大订单。到目前为止,我得到了它的工作。

问题: 如何更改圆圈的颜色以匹配下订单的一侧?因此,\'buy\' 会将那个圆圈设置为 \'green\' 和 \'red\' 来表示 \'sell\'。

到目前为止,我尝试的是 python 三元赋值,但无法评估 Series 真值:

color = \'green\' if orders[\'color\'] == \'buy\' else \'red\'

错误告诉我尝试添加 .all()、.any()、.item()、.bool() 以找出真值,但 .any() 和 .all() 是唯一没有错误的,但它不适用于每一行和绘制的每个圆圈。

我还尝试根据“side”列的值创建一个新的颜色列。但这也不起作用。

这是我绘制 plotly 图表的函数:

def plot_ohlcv_plotly(self, df, orders):
    df.columns = [\'Date\', \'Open\', \'High\', \'Low\', \'Close\', \'Volume\']
    df[\'Date\'] = pd.to_datetime(df[\'Date\'], unit=\'ms\')
    fig = go.Figure(
        data=[go.Candlestick(
                x=df[\'Date\'],
                open=df[\'Open\'],
                high=df[\'High\'],
                low=df[\'Low\'],
                close=df[\'Close\'])])

    date = pd.to_datetime(orders[\'timestamp\'], unit=\'ms\')

    size = orders[\'size\'] * 0.5

    fig.add_trace(go.Scatter(x=date, y=orders[\'price\'], mode=\"markers\", marker = dict(
            # color = orders[\'color\'],
            size=size
        )
    ))

    fig.show()

订单 csv 文件确实包含有销售的行。因此,数据确实包含买入和卖出。

timestamp,size,price,side

1664567708302,20.55188,19560.0,buy

1664568424915,29.02367,19450.0,buy

1664568480558,29.38344,19489.29,buy

1664569334535,30.37156,19490.0,sell

1664572312440,26.37094,19370.0,buy

1664572667156,25.87512,19350.0,sell

1664572746101,20.66364,19300.1,sell

1664572746103,53.43113,19300.0,sell

1664575734563,44.57541,19250.0,sell

1664575734563,31.07015,19250.0,buy

1664575734594,31.94762,19250.0,buy

1664577201634,22.63745,19345.01,sell

1664579865001,29.92649,19390.18,sell

1664581629722,22.07112,19427.09,sell

  • 您的 df 包含 6 列,而 CSV 文件包含 4 列?
  • 那是对的。烛台图使用 df 数据框绘制,散点图使用订单数据框绘制。有两个 CSV 文件,一个用于蜡烛(6 列),一个用于订单(4 列)
  • 您应该将数据框添加到问题中,以帮助其他人重现您的工作以帮助您。
  • @Hamzah 好主意,谢谢你的建议。我将整个项目添加到帖子的顶部。
  • 有很多文件,我认为将必要的代码添加到您的问题中以至少绘制上面显示的图表是个好主意。

标签: python plotly scatter-plot


【解决方案1】:

在这种情况下,必须设置已确定颜色的列表。因此,我列出了您对颜色指定的理解标准。

import plotly.graph_objects as go

def plot_ohlcv_plotly(df, orders):
    df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
    df['Date'] = pd.to_datetime(df['Date'], unit='ms')
    fig = go.Figure(
        data=[go.Candlestick(
            x=df['Date'],
            open=df['Open'],
            high=df['High'],
            low=df['Low'],
            close=df['Close'],
            name='Chandlestick')
             ]
    )

    date = pd.to_datetime(orders['timestamp'], unit='ms')

    size = orders['size'] * 0.5

    fig.add_trace(go.Scatter(
        x=date,
        y=orders['price'],
        mode="markers",
        name='side',
        marker = dict(
            color = ['green' if s == 'buy' else 'red' for s in orders['side']],
            size=size,
        )
    ))
    fig.update_layout(autosize=True, height=600, xaxis=dict(rangeslider=dict(visible=False)))
    fig.show()

plot_ohlcv_plotly(df, orders)

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2019-06-05
    • 2018-06-23
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2020-09-14
    • 2022-01-14
    相关资源
    最近更新 更多