1

1)这是我试图运行的代码片段。主要思想是,我希望 ipywidgets 是交互式的,同时不断地从数据源中获取数据。并且使用 while 循环以特定间隔更新数据。目标是使用 @interact 函数通过更改要考虑的主成分 (PC) 的数量以交互方式绘制主成分。此外,它在没有 while 循环的情况下运行得非常好,也就是说,当我们不考虑使用 while 循环对数据集进行自动更新时。但是当我包含 while 循环时,它不处理小部件的交互性(即 PC 数量的交互)。我的感觉是,由于某些执行问题,“while True”循环不会让 ipywidget 的交互发生。

2)我也研究了线程,但我不确定如何使用functools(select_data)中的功能,使用threading.Thread调用。

任何形式的帮助将不胜感激。谢谢

def data_import_date(start_date,end_date):
    end_date1=end_date.strftime('%Y-%m-%dT%H:%M:%S')
    start_date=pd.Timestamp(start_date)
    end_date=pd.Timestamp(end_date1)

    button=widgets.Button(description='Pull Data')
    button.on_click(functools.partial(select_data,rs_=[start_date,end_date]))

    vbox=widgets.VBox([button])
    display(vbox,out)


def select_data(b,rs_):
#     clear_output()
    start_date=rs_[0]
    end_date1=rs_[1]
    print("Data pulling started")

    with out:
        clear_output()
        seeq_login() 
        [item1,item2]=query_seeq_for_data()
        i=0
        while True:
            end_date=end_date1.strftime('%Y-%m-%dT%H:%M:%S')
            print("Start & End date: ",start_date,end_date)
            if i==0:
                [X_data,Y_data]=pull_data(item1,item2,start_date,end_date)
            else:
                [X_data_live,Y_data_live]=pull_data(item1,item2,start_date,end_date)
                X_data=X_data.append(X_data_live)
                Y_data=Y_data.append(Y_data_live)
            print("Data pulling completed.\nNow you're ready for your analysis")

            clear_output()
            [X_train,X_test,Y_train,Y_test]=train_test(X_data,Y_data)

            [Xp_train,components,explained_variance_ratio,_,_]=apply_PCA(X_train,X_test)
            plot_PC_variance(X_data,explained_variance_ratio)
            plot_PC(X_data,components)

            time.sleep(20)
            start_date=end_date
            end_date1=end_date1+datetime.timedelta(days=1)
            i+=1



  a=interact(data_import_date,
           start_date=widgets.DatePicker(value=pd.to_datetime(start_date)),
           end_date=widgets.DatePicker(value=pd.to_datetime(end_date)))


def plot_PC(X_data,components):
    Np_comp=(1,len(X_data.columns),1)
    @interact
    def principal_components(PC1=Np_comp,PC2=Np_comp):
        fig,ax=plt.subplots(1,1,figsize=(10,10))
        plt.figure(5)
        print(PC1, PC2)

        ax.set_xlabel("Principal Component {}".format(PC1), fontsize=14)
        ax.set_ylabel("Principal Component {}".format(PC2), fontsize=14)
        ax.set_title("Principal components {0} & {1}".format(PC1,PC2), fontsize=(20))
        ax.scatter(components[:,PC1],components[:,PC2])
4

1 回答 1

1

一个相当基本的示例,展示了如何在轮询小部件更改时运行循环,但这并不是我真正的专业领域。

在打印值的同时拖动滑块,您应该会看到打印值发生变化以反映当前滑块位置。


import threading
from IPython.display import display
import ipywidgets as widgets
import time
float_val = widgets.FloatSlider()
display(float_val)

def work(progress):
    total = 10
    for i in range(total):
        time.sleep(1)
        print(float_val.value)

thread = threading.Thread(target=work, args=(progress,))

thread.start()
于 2020-05-19T14:07:27.290 回答