繁体   English   中英

在同一个图中绘制两个数据不完整的数据集

[英]Plotting two datasets with incomplete data in same graph

我的 dataframe 由两列组成,每个工作日的股价和每股收益。 股价仅在工作日可用,而每股收益仅在星期六每季度可用。 现在我想 plot 两个图表在同一个可视化中,有两个 y 轴。

            close   eps
date
...         
2020-04-01  240.91  NaN
2020-03-31  254.29  NaN
2020-03-30  254.81  NaN
2020-03-28     NaN  2.59
2020-03-27  247.74  NaN
2020-03-26  258.44  NaN
...
2019-12-28     NaN  5.04
2019-12-27  289.80  NaN
...   

到目前为止,我的方法是使用 plotly:

fig = make_subplots(specs=[[{"secondary_y": True}]])
    fig.add_trace(
        go.Scatter(
            x=df.index,
            y=df["close"],
            name = "Price"
        ),
        secondary_y = False,
    )
    fig.add_trace(
        go.Scatter(
            x=df.dropna(subset=["eps"]),
            y=df["eps"],
            name = "EPS",
        ),
        secondary_y = True,
    )

    
    fig.update_yaxes(
        title_text="Price",
        secondary_y=False
    )
    fig.update_yaxes(
        title_text="EPS",
        secondary_y=True,
    )
    
    fig.show()

然而,我最终得到了一个图表,但没有显示 EPS。 对于eps列中所有缺失的数据点,我希望eps成为一条连接的点。

在此处输入图像描述

我不太确定如果你想要一种逐步的 plot 或者只是用一条线连接点。 在第一种情况下,我认为您可以在第二个df["eps"].interpolate()上使用df["eps"].fillna(method="ffill") )

生成数据

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

df = pd.DataFrame({"date":pd.date_range('2019-01-01', '2020-12-31')})

df["close"] = np.abs(np.random.randn(len(df))) * 300
df["eps"] = np.abs(np.random.randn(len(df))) * 10

df["close"] = np.where(df["date"].dt.weekday>=5,
                       np.nan,
                       df["close"])

df["eps"] = np.where((df["date"].dt.month%4==0) & 
                     (df["date"].dt.weekday==5),
                     df["eps"],
                     np.nan)

grp = df.set_index("date").groupby(pd.Grouper(freq="M"))["eps"].last().reset_index()

df = df.drop("eps", axis=1)
df = pd.merge(df, grp, how="left", on="date")

df = df.set_index("date")

使用fillna(method="ffill")

df["eps_fillna"] = df["eps"].fillna(method="ffill")

fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
        go.Scatter(
            x=df.index,
            y=df["close"],
            name = "Price"
        ),
        secondary_y = False,
    )
fig.add_trace(
        go.Scatter(
            x=df.index,
            y=df["eps_fillna"],
            name = "EPS",

        ),
        secondary_y = True,
    )

    
fig.update_yaxes(
        title_text="Price",
        secondary_y=False
    )
fig.update_yaxes(
        title_text="EPS",
        secondary_y=True,
    )
    
fig.show()

在此处输入图像描述

使用interpolate()

df["eps_interpolate"] = df["eps"].interpolate()

fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
        go.Scatter(
            x=df.index,
            y=df["close"],
            name = "Price"
        ),
        secondary_y = False,
    )
fig.add_trace(
        go.Scatter(
            x=df.index,
            y=df["eps_interpolate"],
            name = "EPS",

        ),
        secondary_y = True,
    )

    
fig.update_yaxes(
        title_text="Price",
        secondary_y=False
    )
fig.update_yaxes(
        title_text="EPS",
        secondary_y=True,
    )
    
fig.show()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM