python - 如何重置从我的 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
解决方案
你可以试试
def add_on_click(b):
with out:
clear_output()
display(df)
#rest of the code goes here
推荐阅读
- python - 使用 Kafka 和 Python 向 Elasticsearch 发送数据时抛出 RequestError
- c++ - 适用于 Windows 控制台应用程序的传感器 API 的 SetEventSink()
- java - 将另一个api的返回数据集成到服务方法
- c - C:函数,将字符串作为字符数组返回
- python - 将 OpenCV C++ Mat 暴露给 Python
- java - 使用 JDBC 连接到 Hive 2.3.0
- c# - 为什么编译器不能解析结果类型?
- python - 如何获取特定时区的当前时间?
- ruby-on-rails - 哈希的最后一个元素
- mysql - Rails 为 mysql 查询动态添加条件