★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>
1. Notebook VS IDE
Jupyter notebook(Jupyter lab)是aistudio实训平台默认的开发工具,同时也数据科学从业者最常使用的工具。相比vs code, pycharm等IDE(集成开发环境), notebook足够简单,可以让你把所有的精力放在数据挖掘探索和算法开发验证上。其代码结构是以单元格来组织和分割,一个单元格可以有一行或者若干行代码,完成一个单元格后可以立马运行查看中间结果并以及可视化,这种方式的方式的优点显而易见:
-
代码组织和运行方式非常符合数据科学工作者的思维习惯。可以一边做,然后根据运行的中间结果在思考下一步的操作。面对一个复杂问题时,往往需要多次分步骤尝试。而在IDE里面,每次要想知道中间结果需要打断点调试,每次都需要从头运行,没有notebook方便
-
配合markdown笔记,可以做出媲美教科书的效果
因为其易用和可扩展,现在很多大学都用来作上课的课件工具。另外你写完的notebook也可以发给别人(.ipynb文件),在Anaconda中可以直接运行,配合markdown可以完美再现你的思维过程!
本项目为AI全栈课程《Python从小白到精通》的配套补充,期望大家熟悉基本notebook开发环境后,掌握一些高阶的Notebook使用技巧,提高学习和工作效率。主要包括以下内容:
- 常用快捷键
- 单个单元格输出多个结果
- 单元格内执行shell脚本
- 执行常见的shell命令
- 输出当前notebook环境中已经存在的所有变量以及值
- 统计代码运行时间
- 画图相关
- 给for循环加上进度条
- 其他
2. 常用快捷键
-
- 显示行号。notebook默认状态下是不显示行号的。在命令模式下按I键可以显示行号
-
- code和markdown转换。命令模式下,m键可以将code转成markdown, y键相反
-
- 编辑模式下:shift+enter 运行当前单元,并且高亮显示下一单元,如果没有下一单元就新建一个单元
-
- 编辑模式下:crtl+enter 运行当前单元
-
- 编辑模式下:alt+enter 运行当前单元,并且插入一个新单元并高亮显示
同时可以点击帮助-》快捷键列表查看所有内置的快捷键
3. 单个单元格输出多个结果
Notebook正常情况下,只有最后一行的代码的结果会输出,
如下我们读取一个文件到df中,写了df.shape, df.columns和df.head,只有最后一行的df.head结果会输出,例如:
import pandas as pd
df = pd.read_csv('demo.csv')
df.shape # 正常情况下,因为此代码不是该单元格最后一行,此结果不会输出
df.columns # 正常情况下,因为此代码不是该单元格最后一行,此结果不会输出
df.head() # 只会输出该代码的结果
EQP_ID | MODEL_Type | CURR_TEMPERATURE | |
---|---|---|---|
0 | RS4 | QMO_2DCP1 | 32.9 |
1 | RS4 | QMO_2DCP1 | 32.4 |
2 | RS4 | QMO_2DCP1 | 33.0 |
3 | RS4 | QMO_2DCP1 | 32.9 |
4 | RS4 | QMO_2DCP1 | 32.9 |
# 如果想把其他有结果也输出,只要增加一个单元格运行下面两句代码即可:
"""
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
"""
'\nfrom IPython.core.interactiveshell import InteractiveShell \nInteractiveShell.ast_node_interactivity = "all"\n'
# 尝试一个单元格多个输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
df.head()
df.tail()
df.shape
df['EQP_ID'].value_counts()
EQP_ID | MODEL_Type | CURR_TEMPERATURE | |
---|---|---|---|
0 | RS4 | QMO_2DCP1 | 32.9 |
1 | RS4 | QMO_2DCP1 | 32.4 |
2 | RS4 | QMO_2DCP1 | 33.0 |
3 | RS4 | QMO_2DCP1 | 32.9 |
4 | RS4 | QMO_2DCP1 | 32.9 |
EQP_ID | MODEL_Type | CURR_TEMPERATURE | |
---|---|---|---|
377 | A6L | QMO_2DCP1 | 174.2 |
378 | A6L | QMO_2DCP1 | 171.6 |
379 | A6L | QMO_2DCP1 | 169.2 |
380 | A6L | QMO_2DCP1 | 166.8 |
381 | A6L | QMO_2DCP1 | 164.5 |
(382, 3)
A6L 132
RS6 111
Q5L 98
RS4 41
Name: EQP_ID, dtype: int64
4. notebook执行shell命令
- 很多时候别人开发的脚本是以.py文件形式保存的,这样的脚本一般需要在终端或者IDE环境中执行
- 其实用notebook也完全没问题。只要把终端执行的命令前加个" ! "号即可
- 举例: 下面我们写一个脚本demo.py输出当前的工作环境目录以及该目录下的所有文件,改文件位于当前的环境下:
# 先使用cat命令查看,在notebook中执行只要在命令前加!即可
print("demo脚本内容如下:")
!cat demo.py
demo脚本内容如下:
print("this is a demo")
print('------' * 10)
import os
print('当前的目录为:')
print(os.getcwd())
print('------' * 10)
print('当前目录下的文件:')
print(os.listdir())
print('------' * 10)
# 使用!python命令执行该脚本
!python demo.py
this is a demo
------------------------------------------------------------
当前的目录为:
/home/aistudio
------------------------------------------------------------
当前目录下的文件:
['data', 'demo.py', '.data', 'demo.csv', '.node.started', '.ipython', '.systemlogs', '.jupyter', '.cache', '.yarn', '.aistudiofs.download.success', '.codelab-jupyter.log', '.bash_history', '.ipynb_checkpoints', '.local', '.bashrc', '.aistudiofs', 'machine.csv', 'main.ipynb', '.conda', '.vscode.log', '.python_history', '.bash_logout', '.viminfo', '.virtual_documents', '.ssh', '.aistudiofs.success', '.homedata.success', '.dataset.download', '.pip', '.npm', '.profile', '.config', '.webide']
------------------------------------------------------------
- 由此我们知道只要在命令前加入!即可执行shell命令,因而在Linux命令行中常用的pwd, ls等命令均可以使用
- 该功能更长使用的一个场景是直接在notebook中安装第三方库,直接使用在单元格内执行: !pip install you-package==version即可
!pwd # 查看当前目录
!ls # 显示当前目录下得文件和目录
/home/aistudio
data demo.csv demo.py machine.csv main.ipynb
# 直接在单元格内使用pip命令安装相关的库,不需要切换到终端去安装
!pip install pandas
- !注意: 上面的执行shell命令中,很多命令只能在linux环境中执行,例如pwd,ls等,如果notebook是运行在windows操作系统中,这些命令会实效。但是将!改成%即可在windows环境中执行
5. 常用的shell命令
通过上面得介绍可以发现在notebook中可以方便的执行shell命令,熟练使用可以省去和终端来回切换,提高工作效率。
下面介绍一些在开发中高频使用的shell命令。
5.1 切换目录 %cd
这个有点特殊,在指令cd前加“%”,而不是“!”号。
这点需要注意
!pwd # 显示当前目录
# 切换目录,可以使用相对路径或绝对路径。推荐使用绝对路径
%cd /home/aistudio/work
!pwd # 显示切换之后的目录
/home/aistudio
[Errno 2] No such file or directory: '/home/aistudio/work'
/home/aistudio
/home/aistudio
5.2 重定向
在终端中,重定向即将指令原本在显示在终端中的输出追加或者输出到指定文件中进行持久化,便于后面的分析。
这个在一些日志或者输出信息比较多得时候非常有用。重定向有两种操作符:
- “>” 重定向操作符, 后面跟随文件的名称。如果当前目录下存在同名文件,会覆盖。
- “>>” 追加>>重定向操作符。不覆盖,进行追加
# 查看当前系统进程信息
!ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
aistudio 1 0.0 0.0 4528 728 ? Ss 10:07 0:00 /bin/sh -c /o
aistudio 7 0.0 0.0 13312 3352 ? S 10:07 0:00 /bin/bash /op
root 33 0.0 0.0 65536 3152 ? Ss 10:07 0:00 /usr/sbin/ssh
aistudio 44 0.0 0.0 13324 3428 ? S 10:07 0:00 bash /opt/con
aistudio 46 1.0 0.0 41645240 147244 ? Sl 10:07 2:40 /opt/conda/en
aistudio 100 0.0 0.0 4528 788 ? S 10:07 0:00 /bin/sh -c pl
aistudio 101 1.7 0.0 5758164 89156 ? Sl 10:07 4:17 /opt/conda/en
aistudio 130 0.0 0.0 26236 11184 ? S 10:07 0:00 /opt/conda/en
aistudio 131 0.0 0.0 225112 47484 ? Sl 10:07 0:01 /opt/conda/en
aistudio 138 1.2 0.0 152228 48060 ? Sl 10:07 3:06 /opt/conda/en
aistudio 142 1.2 0.0 152228 48120 ? Sl 10:07 3:07 /opt/conda/en
aistudio 264 1.7 0.0 3132680 224776 ? Sl 10:08 4:18 /opt/conda/en
aistudio 269 0.2 0.1 658804 345120 ? Sl 10:08 0:40 /opt/conda/en
aistudio 271 0.0 0.0 52864 26952 ? S 10:08 0:01 /opt/conda/en
aistudio 273 0.0 0.0 42996 24368 ? S 10:08 0:00 /opt/conda/en
aistudio 275 0.0 0.0 171708 49880 ? Sl 10:08 0:06 /opt/conda/en
aistudio 26729 0.0 0.0 42280 24256 ? S 14:02 0:00 /opt/conda/en
aistudio 26787 0.1 0.0 2889464 93768 ? Sl 14:02 0:01 /opt/conda/en
aistudio 27558 0.6 0.0 3098712 103336 ? Ssl 14:07 0:02 /opt/conda/en
aistudio 28175 0.0 0.0 37852 3404 pts/0 Rs+ 14:13 0:00 ps aux
%cd /home/aistudio/
!ps aux > systemid.txt
/home/aistudio
可以看到使用重定向命令后,屏幕不在有输出。相应的在/home/aistudio/目录下回出现一个systemid.txt文件,内容和上面得一样
5.3 查看文件内容
主要有cat, head, tail等命令。这些在深度学习项目中查看一些标注文件会用得比较多。通过查看一个标注文件得前5行可以大概了解文件和标签的结构。
这里举例使用head查看一个文件得前n行。其他命令可以自行尝试。
%cd /home/aistudio/
!head -5 systemid.txt
/home/aistudio
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
aistudio 1 0.0 0.0 4528 728 ? Ss 10:07 0:00 /bin/sh -c /opt/conda/include/container-start.sh
aistudio 7 0.0 0.0 13312 3352 ? S 10:07 0:00 /bin/bash /opt/conda/include/container-start.sh
root 33 0.0 0.0 65536 3152 ? Ss 10:07 0:00 /usr/sbin/sshd
aistudio 44 0.0 0.0 13324 3428 ? S 10:07 0:00 bash /opt/conda/envs/webide/bin/kernel_seperation_start.sh
5.4 tree命令查看一个目录的结构
可以指定 -L n用于显示目录的层级。
另外还有cp, mv, rm等文件的拷贝删除等操作。这里不在赘述。
!tree -L 2 /home/aistudio/
/home/aistudio/
├── data
├── demo.csv
├── demo.py
├── machine.csv
├── main.ipynb
└── systemid.txt
1 directory, 5 files
6. 查看当前notebook中的所有变量和变量值
在MATLAB中,直接有一个窗口可以显示当前所有的变量及其相应的值,这个功能非常强大,Anaconda中Spyder也有类似的功能。
其实notebook也可以,直接使用%who和%whos魔法命令即可。其中:
- %who会输出当前notebook中已经存在的变量
- %whos除了输出变量外,变量的类型以及当前值也会显示
# 先创建一些变量
a, b, c = 10, 20.5, 'zhangsan'
d = {'Name' : 'PaddlePaddle', 'Age': 18}
e = ['cat', 'dog']
# 显示当前环境中的所有变量
%who
InteractiveShell a b c d df e pd
# 显示当前环境中的所有变量、类型和值
%whos
Variable Type Data/Info
---------------------------------------------
InteractiveShell MetaHasTraits <class 'IPython.core.inte<...>eshell.InteractiveShell'>
a int 10
b float 20.5
c str zhangsan
d dict n=2
df DataFrame EQP_ID MODEL_Type CU<...>n\n[382 rows x 3 columns]
e list n=2
pd module <module 'pandas' from '/o<...>ages/pandas/__init__.py'>
- 这个功能在notebook内容比较多的时候比较有用,可以随时通过此命令查看当前环境下的变量而不用向上查找代码
7. 运行时间统计
这个比较常用。主要有time,和timeit两个魔法命令,在结合行模式和单元格模式就有4种用法,具体如下:
- %time:在行模式下,统计代码运行一次所花费的时间
- %%time:在单元模式下,统计整个单元格内的代码运行一次所花费的时间
- %timeit:在行模式下,执行代码块若干次,统计出平均时间。结果以mean+/-std的形式给出
- %%timeit:在单元模式下,执行代码块若干次,统计出平均时间。结果以mean+/-std的形式给出
所以time只统计执行一次的时间;而timeit会反复执行很多次统计平均时间,这个比只执行一次要准确一点
%time [i for i in range(100) if i%7 == 0]
CPU times: user 0 ns, sys: 10 µs, total: 10 µs
Wall time: 14.1 µs
[0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98]
- 上面的代码使用列表解析式输出100以内可以被7整除的整数,并使用time统计代码运行时间
- 如果改成timeit,则会执行多次,统计平均时间和标准差
%timeit [i for i in range(100) if i%7 == 0]
4.75 µs ± 40.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
- 将一个%改成2个%%后,变成单元格模式,即可以统计整个单元格内的代码运行时间
- 我们通过使用for循环和矩阵方式实现矩阵加法来举例,看看运行效率
# 先定义两个二维数组
import numpy as np
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
n = [[2, 2, 2], [3, 3, 3], [4, 4, 4]]
m_, n_ = np.array(m), np.array(n)
m_,n_
m_.shape
-
- 使用for-loop实现矩阵相加,并统计时间
%%timeit
def array_add_forloop():
res = np.zeros((3,3))
for row in range(m_.shape[0]):
for col in range(m_.shape[1]):
res[row,col] = int(m_[row,col] + n_[row,col])
return res
array_add_forloop()
-
- 使用矩阵方式实现矩阵加法
%%timeit
def array_add_matrix():
return m_+ n_
array_add_matrix()
- 通过时间统计可以看到,使用numpy中的array实现矩阵相加,效率是for循环的10倍以上!
8. 在notebook中绘图
在Notebook中,matplotlib是最常用的绘图库,并且Notebook中有相应的魔法命令用于辅助绘图功能:
-
- %matplotlib inline:使用这条魔法命令后,不需要显示地调用pyplot.show()即可自动显示图片
-
- 可以在plt.plot函数后面添加一个“;”这样只输出所需要的图形。
下面举例说明
# %matplotlib inline省略plt.show, 可以加在最前面的单元格,全局有效
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.linspace(-10,10,100)
y = np.sin(x)
plt.plot(x, y)
# 加上";"抑制其他输出
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.linspace(-10,10,100)
y = np.sin(x)
plt.plot(x, y);
9. 增加进度条
- 使用tqdm这个工具给循环语句增加个进度条可视化插件,显示循环体进行到那个阶段了
- 这个功能在处理耗时比较大的循环的时候是非常必要的,效果如下:
from tqdm import tqdm
import time
for i in tqdm(range(100)):
# 此处写业务逻辑
time.sleep(0.1)
10、其他技巧
- numpy中设定显示的小数点位数: 使用np.set_printoptions方法
- pandas中显示所有的行和列
10.1 设置numpy显示精度
# 默认情况下np会显示小数点后8位
import numpy as np
np.random.rand(2,2)
array([[0.69865144, 0.55332125],
[0.97711927, 0.15941402]])
# 设置成显示2位, 设置后全局有效
import numpy as np
np.set_printoptions(precision=2)
np.random.rand(2,2)
array([[0.45, 0.68],
[0.01, 0.2 ]])
10.2 pandas显示所有的列
在notebook中,当文件的行和列过多时,pandas默认不显示所有的信息。此时可以使用如下,命令显示:
- 显示所有行: pd.set_option(‘display.max_rows’, None)
- 显示所有列:pd.set_option(‘display.max_columns’, None)
%cd /home/aistudio/
import pandas as pd
df_machine = pd.read_csv("machine.csv")
df_machine
/home/aistudio
df_machine = pd.read_csv(“machine.csv”)
df_machine
/home/aistudio
<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Time</th>
<th>Step_Number</th>
<th>wafer_names</th>
<th>fault_name</th>
<th>lotid</th>
<th>lot_id</th>
<th>recipe</th>
<th>151821807</th>
<th>151820951</th>
<th>151821601</th>
<th>151821602</th>
<th>151821603</th>
<th>151821604</th>
<th>151822195</th>
<th>151822196</th>
<th>151822197</th>
<th>151822198</th>
<th>151822215</th>
<th>151822252</th>
<th>151822253</th>
<th>151822254</th>
<th>151822255</th>
<th>151821769</th>
<th>151821770</th>
<th>151821788</th>
<th>151821789</th>
<th>151821797</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>11.9460</td>
<td>4</td>
<td>l29011.txm</td>
<td>calibration</td>
<td>lot011</td>
<td>lot011</td>
<td>recipe1</td>
<td>4</td>
<td>751</td>
<td>753</td>
<td>132</td>
<td>0</td>
<td>626</td>
<td>100</td>
<td>1227</td>
<td>9408</td>
<td>9019</td>
<td>-362</td>
<td>26</td>
<td>16599</td>
<td>20028</td>
<td>-296</td>
<td>16848</td>
<td>360</td>
<td>0</td>
<td>27594</td>
<td>49</td>
</tr>
<tr>
<th>1</th>
<td>13.0280</td>
<td>4</td>
<td>l29011.txm</td>
<td>calibration</td>
<td>lot011</td>
<td>lot011</td>
<td>recipe1</td>
<td>4</td>
<td>751</td>
<td>753</td>
<td>134</td>
<td>0</td>
<td>620</td>
<td>99</td>
<td>1229</td>
<td>9431</td>
<td>9029</td>
<td>-1455</td>
<td>26</td>
<td>16568</td>
<td>20042</td>
<td>-676</td>
<td>16796</td>
<td>350</td>
<td>0</td>
<td>27440</td>
<td>49</td>
</tr>
<tr>
<th>2</th>
<td>14.0490</td>
<td>4</td>
<td>l29011.txm</td>
<td>calibration</td>
<td>lot011</td>
<td>lot011</td>
<td>recipe1</td>
<td>4</td>
<td>751</td>
<td>755</td>
<td>134</td>
<td>0</td>
<td>599</td>
<td>102</td>
<td>1221</td>
<td>9389</td>
<td>9114</td>
<td>-1056</td>
<td>25</td>
<td>16442</td>
<td>20146</td>
<td>-291</td>
<td>16512</td>
<td>344</td>
<td>0</td>
<td>27276</td>
<td>49</td>
</tr>
<tr>
<th>3</th>
<td>15.1329</td>
<td>4</td>
<td>l29011.txm</td>
<td>calibration</td>
<td>lot011</td>
<td>lot011</td>
<td>recipe1</td>
<td>4</td>
<td>751</td>
<td>753</td>
<td>133</td>
<td>0</td>
<td>586</td>
<td>100</td>
<td>1201</td>
<td>9445</td>
<td>9031</td>
<td>-587</td>
<td>25</td>
<td>16960</td>
<td>20148</td>
<td>-262</td>
<td>17020</td>
<td>352</td>
<td>0</td>
<td>27330</td>
<td>50</td>
</tr>
<tr>
<th>4</th>
<td>16.1390</td>
<td>4</td>
<td>l29011.txm</td>
<td>calibration</td>
<td>lot011</td>
<td>lot011</td>
<td>recipe1</td>
<td>4</td>
<td>751</td>
<td>754</td>
<td>132</td>
<td>0</td>
<td>587</td>
<td>102</td>
<td>1182</td>
<td>9456</td>
<td>9043</td>
<td>-124</td>
<td>25</td>
<td>16564</td>
<td>20226</td>
<td>-547</td>
<td>16440</td>
<td>346</td>
<td>0</td>
<td>27262</td>
<td>50</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>10765</th>
<td>104.6880</td>
<td>5</td>
<td>l33431.txm</td>
<td>calibration</td>
<td>lot061</td>
<td>lot061</td>
<td>recipe1</td>
<td>5</td>
<td>752</td>
<td>753</td>
<td>131</td>
<td>0</td>
<td>538</td>
<td>102</td>
<td>1226</td>
<td>9365</td>
<td>8973</td>
<td>1161</td>
<td>28</td>
<td>16920</td>
<td>19110</td>
<td>7</td>
<td>16464</td>
<td>346</td>
<td>0</td>
<td>28446</td>
<td>51</td>
</tr>
<tr>
<th>10766</th>
<td>105.6870</td>
<td>5</td>
<td>l33431.txm</td>
<td>calibration</td>
<td>lot061</td>
<td>lot061</td>
<td>recipe1</td>
<td>5</td>
<td>752</td>
<td>754</td>
<td>134</td>
<td>0</td>
<td>534</td>
<td>102</td>
<td>1227</td>
<td>9426</td>
<td>8934</td>
<td>606</td>
<td>28</td>
<td>16640</td>
<td>18982</td>
<td>134</td>
<td>16658</td>
<td>346</td>
<td>0</td>
<td>28444</td>
<td>51</td>
</tr>
<tr>
<th>10767</th>
<td>106.7190</td>
<td>5</td>
<td>l33431.txm</td>
<td>calibration</td>
<td>lot061</td>
<td>lot061</td>
<td>recipe1</td>
<td>5</td>
<td>752</td>
<td>754</td>
<td>132</td>
<td>0</td>
<td>531</td>
<td>102</td>
<td>1227</td>
<td>9357</td>
<td>8937</td>
<td>1249</td>
<td>28</td>
<td>16593</td>
<td>19056</td>
<td>-34</td>
<td>16714</td>
<td>348</td>
<td>0</td>
<td>28230</td>
<td>51</td>
</tr>
<tr>
<th>10768</th>
<td>107.7500</td>
<td>5</td>
<td>l33431.txm</td>
<td>calibration</td>
<td>lot061</td>
<td>lot061</td>
<td>recipe1</td>
<td>5</td>
<td>752</td>
<td>754</td>
<td>132</td>
<td>0</td>
<td>534</td>
<td>100</td>
<td>1227</td>
<td>9434</td>
<td>8920</td>
<td>1155</td>
<td>28</td>
<td>16522</td>
<td>19046</td>
<td>139</td>
<td>16560</td>
<td>353</td>
<td>0</td>
<td>28278</td>
<td>51</td>
</tr>
<tr>
<th>10769</th>
<td>108.7660</td>
<td>5</td>
<td>l33431.txm</td>
<td>calibration</td>
<td>lot061</td>
<td>lot061</td>
<td>recipe1</td>
<td>5</td>
<td>751</td>
<td>752</td>
<td>132</td>
<td>0</td>
<td>529</td>
<td>101</td>
<td>1226</td>
<td>9346</td>
<td>8990</td>
<td>799</td>
<td>28</td>
<td>16815</td>
<td>19114</td>
<td>72</td>
<td>16630</td>
<td>355</td>
<td>0</td>
<td>28240</td>
<td>51</td>
</tr>
</tbody>
</table>
<p>10770 rows × 27 columns</p>
</div>
```python
# 这里举例显示所有的列,其他可以自行尝试
pd.set_option('display.max_columns', None)
df_machine.head()
Time | Step_Number | wafer_names | fault_name | lotid | lot_id | recipe | 151821807 | 151820951 | 151821601 | 151821602 | 151821603 | 151821604 | 151822195 | 151822196 | 151822197 | 151822198 | 151822215 | 151822252 | 151822253 | 151822254 | 151822255 | 151821769 | 151821770 | 151821788 | 151821789 | 151821797 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 11.9460 | 4 | l29011.txm | calibration | lot011 | lot011 | recipe1 | 4 | 751 | 753 | 132 | 0 | 626 | 100 | 1227 | 9408 | 9019 | -362 | 26 | 16599 | 20028 | -296 | 16848 | 360 | 0 | 27594 | 49 |
1 | 13.0280 | 4 | l29011.txm | calibration | lot011 | lot011 | recipe1 | 4 | 751 | 753 | 134 | 0 | 620 | 99 | 1229 | 9431 | 9029 | -1455 | 26 | 16568 | 20042 | -676 | 16796 | 350 | 0 | 27440 | 49 |
2 | 14.0490 | 4 | l29011.txm | calibration | lot011 | lot011 | recipe1 | 4 | 751 | 755 | 134 | 0 | 599 | 102 | 1221 | 9389 | 9114 | -1056 | 25 | 16442 | 20146 | -291 | 16512 | 344 | 0 | 27276 | 49 |
3 | 15.1329 | 4 | l29011.txm | calibration | lot011 | lot011 | recipe1 | 4 | 751 | 753 | 133 | 0 | 586 | 100 | 1201 | 9445 | 9031 | -587 | 25 | 16960 | 20148 | -262 | 17020 | 352 | 0 | 27330 | 50 |
4 | 16.1390 | 4 | l29011.txm | calibration | lot011 | lot011 | recipe1 | 4 | 751 | 754 | 132 | 0 | 587 | 102 | 1182 | 9456 | 9043 | -124 | 25 | 16564 | 20226 | -547 | 16440 | 346 | 0 | 27262 | 50 |