首页 > 解决方案 > 在 Jupyter 笔记本中运行的单元格期间,pandas 表中的变量未更新:从 javascript 调用 python 函数时出现问题

问题描述

我正在使用 pandas、python 和 javascript 在 Jupyter notebook 中编写代码。
我想监控产品的价格,这里假设产品的编号为“1234”和“5678”。
该表格每 5 秒更新一次,然后附加新价格,并在表格底部附上购买链接。此外,我还想一起显示点击计数器(df_cnt),即在 for 循环中的单元格运行期间,到目前为止您单击 pandas 表中的链接的次数(如下所示的#In[7])。
pandas 表中的可点击链接调用 javascript 函数 add(var1) #In[2],然后这个 add(var1) 执行 python 函数 add_func(x) #In[4],这会增加每个产品的点击次数。

问题

问题是#In[7]中显示的计数器(df_cnt)没有更新,即使我在#In[7]中运行单元格期间单击了链接,而在for循环完成后,计数器(df_cnt)在下一个单元格中正确更新(#In[8] 如下所示)。

我试过的

我试图改变javascript中的命令

kernel.execute( "df_cnt=add_func("+ var1 + ")") ;

kernel.execute( "df_cnt["+ var1 + "] += 1") ;

但结果是一样的。

如何在#In[7] 中动态更新 pandas 表 df_cnt?我感谢任何意见或建议。

代码

# In[1]:
import pandas as pd
import copy
from random import randint 
from time import sleep
from IPython.display import display, clear_output

%%html
# In[2]:
<script>
function add(var1) {
        var kernel = IPython.notebook.kernel;
        kernel.execute( "df_cnt=add_func("+ var1 + ")") ;  
        alert(var1 + " is clicked." ) ; 
    };
</script>

# In[3]:
def row_wise_clickable_add(val):
    return f'<a  onclick="add(%s)" target="_blank">%s</a>'%(val,val)

# In[4]:
def add_func(x):
    global df_cnt
    df_cnt[x] +=1
    return df_cnt

# In[5]:
df_cnt=pd.DataFrame([[0,0]],columns=[1234,5678])  # pandas table for click counter
df=pd.DataFrame([[0,0 ]],columns=[1234,5678]  ) # pandas table for price monitoring

这是监控的功能。

# In[6]:
def monitor():
    global df,df_cnt
    sleep(5)
    df_new=pd.DataFrame(data=[[int(randint(1,10)) for _ in range(2) ]],columns=[1234,5678])
    df=df.append(df_new,sort=False).reset_index(drop=True)
    
    df2=df.copy()
    df_tmp=pd.DataFrame([df2.columns.tolist()],columns=df2.columns)
    df2=df2.append(df_tmp.astype(int).rename(index={df_tmp.index[-1]: 'buy'}))
    s=df2.style.format(row_wise_clickable_add, subset=pd.IndexSlice[ df2.index[-1], df2.columns.tolist()[0:]])
    clear_output()
    return s

在定义函数和初始化 pandas 表之后,主要部分开始。

# In[7]:
for k in range(7): 
    s=monitor()
    print("Price monitor:")
    display(s)
    print("Click counter: ")
    display(df_cnt) # not updated while running this cell...

完成上面的单元格后,点击计数器的熊猫表被更新,但不在上面显示的 for 循环中......

# In[8]:
df_cnt 

标签: javascriptpythonpandasdataframejupyter-notebook

解决方案


推荐阅读