IPython notebook:如何编写可以访问notebook变量的cell magic?
IPython notebook: How to write cell magic which can access notebook variables?
我的问题是:如何编写可以访问 IPython notebook 的命名空间的 IPython cell magic?
IPython 允许编写用户定义的单元魔法。我的计划是创建一个绘图函数,它可以绘制一个或多个任意 Python 表达式(基于 Pandas 系列对象的表达式),其中单元格字符串中的每一行都是图表中的一个单独的图形。
这是细胞魔法的代码:
def p(line, cell):
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame()
line_list = cell.split('\n')
counter = 0
for line in line_list:
df['series' + str(counter)] = eval(line)
counter += 1
plt.figure(figsize = [20,6])
ax = plt.subplot(111)
df.plot(ax = ax)
def load_ipython_extension(ipython):
ipython.register_magic_function(p, 'cell')
该函数接收整个单元格内容作为字符串。然后这个字符串被换行符分割,并使用 eval() 进行评估。结果被添加到 Pandas DataFrame 中。最后使用 matplotlib 绘制 DataFrame。
使用示例:首先在IPython笔记本中定义Pandas系列对象。
import pandas as pd
ts = pd.Series([1,2,3])
然后在IPython笔记本中调用魔法(下面的整个代码是一个单元格):
%%p
ts * 3
ts + 1
此代码失败并出现以下错误:
NameError: name 'ts' is not defined
我怀疑问题在于 p
函数仅接收 ts * 3\n ts + 1
作为字符串,并且它无法访问 [= 的命名空间中定义的 ts
变量38=] 笔记本(因为 p
函数定义在一个单独的 .py 文件中)。
如何更改我的代码,以便 cell magic 可以访问 IPython notebook 中定义的 ts
变量(因此不会因 NameError 而失败)?
使用 @needs_local_scope
decorator decorator. Documentation is a bit missing, but you can see how it is used,欢迎为文档做出贡献。
您也可以使用 Magics
中的 shell.user_ns
。例如:
from IPython.core.magic import Magics
class MyClass(Magics):
def myfunc(self):
print(self.shell.user_ns)
我的问题是:如何编写可以访问 IPython notebook 的命名空间的 IPython cell magic?
IPython 允许编写用户定义的单元魔法。我的计划是创建一个绘图函数,它可以绘制一个或多个任意 Python 表达式(基于 Pandas 系列对象的表达式),其中单元格字符串中的每一行都是图表中的一个单独的图形。
这是细胞魔法的代码:
def p(line, cell):
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame()
line_list = cell.split('\n')
counter = 0
for line in line_list:
df['series' + str(counter)] = eval(line)
counter += 1
plt.figure(figsize = [20,6])
ax = plt.subplot(111)
df.plot(ax = ax)
def load_ipython_extension(ipython):
ipython.register_magic_function(p, 'cell')
该函数接收整个单元格内容作为字符串。然后这个字符串被换行符分割,并使用 eval() 进行评估。结果被添加到 Pandas DataFrame 中。最后使用 matplotlib 绘制 DataFrame。
使用示例:首先在IPython笔记本中定义Pandas系列对象。
import pandas as pd
ts = pd.Series([1,2,3])
然后在IPython笔记本中调用魔法(下面的整个代码是一个单元格):
%%p
ts * 3
ts + 1
此代码失败并出现以下错误:
NameError: name 'ts' is not defined
我怀疑问题在于 p
函数仅接收 ts * 3\n ts + 1
作为字符串,并且它无法访问 [= 的命名空间中定义的 ts
变量38=] 笔记本(因为 p
函数定义在一个单独的 .py 文件中)。
如何更改我的代码,以便 cell magic 可以访问 IPython notebook 中定义的 ts
变量(因此不会因 NameError 而失败)?
使用 @needs_local_scope
decorator decorator. Documentation is a bit missing, but you can see how it is used,欢迎为文档做出贡献。
您也可以使用 Magics
中的 shell.user_ns
。例如:
from IPython.core.magic import Magics
class MyClass(Magics):
def myfunc(self):
print(self.shell.user_ns)