使用多个滑块在 bqplt/jupyter 中创建动态图表

Using multiple sliders to create dynamic chart in bqplt/jupyter

我正在尝试绘制随投资组合权重变化而变化的动态投资组合表现

假设投资组合有 2 个组成部分,每个组成部分的权重为 50%。我想显示一个投资组合图表,其中包含代表组件权重的滑块。然后我希望能够滑动权重值并动态更新投资组合图表。

我已经为包含一个权重的投资组合完成了此操作,但无法弄清楚如何修改超过 1 个权重 - 也许我需要一种不同的方法。

下面的示例用 1 列的随机 df 代替我的投资组合 df - 过程应该相同。

就此示例而言,如果 df 有 2 列 - 我怎样才能使用控制每个权重的 2 个滑块工作?


from bqplot import DateScale, LinearScale, Axis, Figure, Lines

从 ipywidgets 导入 FloatSlider、VBox

将 pandas 导入为 pd

将 numpy 导入为 np

slider = FloatSlider(value=1, min = 0, max = 1, step = .01, description = 'Weight A')

df = pd.DataFrame(np.random.randint(0,100,size=(100, 1)), columns=list('A'))

x_sc = LinearScale()

y_sc = LinearScale()

ax_x = 轴(标签='Date', 刻度=x_sc, grid_lines='solid')

ax_y = 轴(标签='Price',比例=y_sc,方向='vertical',grid_lines='solid')

line = Lines(y=df['A'],x=df.index, 比例尺={'x': x_sc, 'y': y_sc}, 颜色 = ['#FF0000'])

line2 = 线(y=df['A'],x=df.index , 比例尺={'x': x_sc, 'y': y_sc})

fig = 图(axes=[ax_x, ax_y], marks=[line, line2], title='Price Chart')

def new_chart(值):

new_y = df[['A']]*slider.value

line.y = new_y

slider.observe(new_chart,'value')

VBox([图,滑块])

不确定我是否理解你的意思。你是这个意思吗?

from bqplot import DateScale, LinearScale, Axis, Figure, Lines

from ipywidgets import FloatSlider, VBox

import pandas as pd

import numpy as np

slider = FloatSlider(value=1, min = 0, max = 1, step = .01, description = 'Weight A')
sliderB = FloatSlider(value=1, min = 0, max = 1, step = .01, description = 'Weight B')

df = pd.DataFrame(np.random.randint(0,100,size=(100, 1)), columns=list('A'))
df['B'] = np.random.randint(0,100,size=(100, 1))

x_sc = LinearScale()

y_sc = LinearScale()

ax_x = Axis(label='Date', scale=x_sc, grid_lines='solid')

ax_y = Axis(label='Price', scale=y_sc, orientation='vertical', grid_lines='solid')

line = Lines(y=df['A']+df['B'],x=df.index , scales={'x': x_sc, 'y': y_sc}, colors = ['#FF0000'])

line2 = Lines(y=df['A']+df['B'],x=df.index , scales={'x': x_sc, 'y': y_sc})

fig = Figure(axes=[ax_x, ax_y], marks=[line, line2, ], title='Price Chart')

def new_chart(change):
    line.y = df['A']*slider.value + df['B']*sliderB.value

slider.observe(new_chart,'value')

sliderB.observe(new_chart,'value')

VBox([fig,slider,sliderB])