首页 > 解决方案 > 如何重置从我的 ipywidget 命令按钮生成的输出,以便仅显示更新的 DataFrame?

问题描述

对于我的问题可能令人困惑的措辞,我深表歉意。本质上,我试图做到这一点,以便每次按下“添加数据”命令按钮时只显示一个 DataFrame。应该显示的是按下按钮时修改的 DF。不过,目前,它会在通过较早单击按钮创建的旧版本之上,将输出与最近修改的 DF 一起附加。

所有小部件 所有输出

我将此代码用作执行蒙特卡罗模拟和回溯测试的更大程序的一部分。我对这些小部件的目标是输入我对某些资产的所有期权头寸。这样,我可以对我的职位有一个合并的 DF,以加快我在该程序后面部分的分析,并可以用于其他程序。“添加数据”按钮会将其他小部件的值输入到字典中,并将该字典与现有的投资组合 DF(保存在 CSV 文件中)连接。

我相信我的问题是由于我没有正确使用 ipywidget Output() 函数造成的,但我无法找到解决问题的可行方法。

另外,我正在写Jupyter Notebook

import pandas as pd
import datetime
from datetime import *
import ipywidgets as widgets
from ipywidgets import *

############################################## The following section is usually in a seperate cell so I can 
df = {                                       # refresh my portfolio every day, but still add to the DF throughout the day
    'Datetime' : [],
    'Expire' : [],
    'Type' : [],
    'Quantity' : [],
    'Strike' : [],
    'Spot' : []
}

df = pd.DataFrame(df)
df.to_csv("portfolio.csv", index=False)
##############################################


Type = widgets.Dropdown(
    options = ['Call', 'Put'],
    value = 'Call',
    description= 'Select Binary Type',
    disabled=False,
    layout={'width': 'max-content'},
    style={'description_width': 'max-content'}
)

Quantity = widgets.BoundedIntText(value=1,
    min=1,
    max=10,
    step=1,
    description='Quantity:',
    disabled=False,
    layout={'width': 'max-content'},
    style={'description_width': 'max-content'}
)

Strike = widgets.BoundedIntText(
    min=1500,
    max=3500,
    step=1,
    description='Strike:',
    disabled=False,
    layout={'width': 'max-content'},
    style={'description_width': 'max-content'}
)

Spot = widgets.BoundedIntText(
    min=1500,
    max=3500,
    step=1,
    description='Spot:',
    disabled=False,
    layout={'width': 'max-content'},
    style={'description_width': 'max-content'}    
)


Add = widgets.Button(description="Add Data")
out = Output()

def add_on_click(b):

    dt = datetime.now()
    option = Type.value
    quant = Quantity.value
    strike = Strike.value
    spot = Spot.value

    df = pd.read_csv("portfolio.csv")
    now = datetime.now()

    add = {
        'Datetime' : dt,
        'Expire' : datetime(now.year, now.month, now.day, 14, 15,0,1),
        'Type' : option,
        'Quantity': quant,
        'Strike' : strike,
        'Spot': spot
    }

    add = pd.DataFrame(add, index=[0])

    df = pd.concat([df, add],sort=True) #ignore_index=True)
    df.to_csv("portfolio.csv", index=False)

    display(df, out)


Add.on_click(add_on_click)

items = [Type, Quantity, Strike, Spot, Add]

box_layout = Layout(display='flex',
                    flex_flow='row',
                    align_items='stretch',
                    width='100%')

box_auto = Box(children=items, layout=box_layout)

display_widgets = VBox([box_auto])
display_widgets

标签: pythonpandasipywidgets

解决方案


你可以试试

def add_on_click(b):
    with out:
        clear_output()
        display(df)
#rest of the code goes here

推荐阅读