demo部分
demo
快速可视化
[1]
var df2 load_csv("//localhost:4400/javascripts/datas/train.csv").then((df)=>{ df2 = df })
[2]
table(df2.head())
Out
Product_Identifier | Supermarket_Identifier | Product_Supermarket_Identifier | Product_Weight | Product_Fat_Content | Product_Shelf_Visibility | Product_Type | Product_Price | Supermarket_Opening_Year | Supermarket _Size | Supermarket_Location_Type | Supermarket_Type | Product_Supermarket_Sales | |
0 | DRA12 | CHUKWUDI010 | DRA12_CHUKWUDI010 | 11.6 | Low Fat | 0.068535039 | Soft Drinks | 357.54 | 2005 | NaN | Cluster 3 | Grocery Store | 709.08 |
1 | DRA12 | CHUKWUDI013 | DRA12_CHUKWUDI013 | 11.6 | Low Fat | 0.040911824 | Soft Drinks | 355.79 | 1994 | High | Cluster 3 | Supermarket Type1 | 6381.69 |
2 | DRA12 | CHUKWUDI017 | DRA12_CHUKWUDI017 | 11.6 | Low Fat | 0.041177505 | Soft Drinks | 350.79 | 2014 | NaN | Cluster 2 | Supermarket Type1 | 6381.69 |
3 | DRA12 | CHUKWUDI018 | DRA12_CHUKWUDI018 | 11.6 | Low Fat | 0.041112694 | Soft Drinks | 355.04 | 2016 | Medium | Cluster 3 | Supermarket Type2 | 2127.23 |
4 | DRA12 | CHUKWUDI035 | DRA12_CHUKWUDI035 | 11.6 | Ultra Low fat | 0 | Soft Drinks | 354.79 | 2011 | Small | Cluster 2 | Supermarket Type1 | 2481.77 |
[3]
table(df2.describe())
Out
Product_Shelf_Visibility | Product_Price | Supermarket_Opening_Year | Product_Supermarket_Sales | |
count | 4990 | 4990 | 4990 | 4990 |
mean | 0.066916 | 391.803772 | 2004.783447 | 6103.52002 |
std | 0.053058 | 119.378259 | 8.283151 | 4447.333835 |
min | 0 | 78.730003 | 1992 | 83.230003 |
median | 0.053564 | 393.86 | 2006 | 5374.675 |
max | 0.328391 | 667.219971 | 2016 | 32717.410156 |
variance | 0.002815 | 14251.168763 | 68.610594 | 19778778.23941 |
[4]
//Display the number of rows and columns console.log(df2.shape)
Out
[4990,13]
[5]
console.log(df2.dtypes)
Out
[string,string,string,string,string,float32,string,float32,int32,string…3 more]
为了同时查看列及其类型。让我们创建一个序列,然后将索引设置为列名,并将值设置为tyoe
[6]
let dtypes = new dfd.Series(df2.dtypes,{index: df2.columns}) table(dtypes)
Out
0 | |
Product_Identifier | string |
Supermarket_Identifier | string |
Product_Supermarket_Identifier | string |
Product_Weight | string |
Product_Fat_Content | string |
Product_Shelf_Visibility | float32 |
Product_Type | string |
Product_Price | float32 |
Supermarket_Opening_Year | int32 |
Supermarket _Size | string |
Supermarket_Location_Type | string |
Supermarket_Type | string |
Product_Supermarket_Sales | float32 |
[7]
//Remove Id columns let cols_2_remove = ['Product_Identifier', 'Supermarket_Identifier', 'Product_Supermarket_Identifier'] var new_df = df2.drop({columns:cols_2_remove,axis:1}) // drop the columns table(new_df.head())
Out
Product_Weight | Product_Fat_Content | Product_Shelf_Visibility | Product_Type | Product_Price | Supermarket_Opening_Year | Supermarket _Size | Supermarket_Location_Type | Supermarket_Type | Product_Supermarket_Sales | |
0 | 11.6 | Low Fat | 0.068535039 | Soft Drinks | 357.54 | 2005 | NaN | Cluster 3 | Grocery Store | 709.08 |
1 | 11.6 | Low Fat | 0.040911824 | Soft Drinks | 355.79 | 1994 | High | Cluster 3 | Supermarket Type1 | 6381.69 |
2 | 11.6 | Low Fat | 0.041177505 | Soft Drinks | 350.79 | 2014 | NaN | Cluster 2 | Supermarket Type1 | 6381.69 |
3 | 11.6 | Low Fat | 0.041112694 | Soft Drinks | 355.04 | 2016 | Medium | Cluster 3 | Supermarket Type2 | 2127.23 |
4 | 11.6 | Ultra Low fat | 0 | Soft Drinks | 354.79 | 2011 | Small | Cluster 2 | Supermarket Type1 | 2481.77 |
[8]
console.log(df2.dtypes)
Out
[string,string,string,string,string,float32,string,float32,int32,string....3 more]
为了一起查看columns及其类型。让我们创建一个Series ,然后将索引设置为列名,并将值设置为tyoe。
let dtypes = new dfd.Series(df2.dtypes,{index: df2.columns}) table(dtypes)
Out
0 | |
Product_Identifier | string |
Supermarket_Identifier | string |
Product_Supermarket_Identifier | string |
Product_Weight | string |
Product_Fat_Content | string |
Product_Shelf_Visibility | float32 |
Product_Type | string |
Product_Price | float32 |
Supermarket_Opening_Year | int32 |
Supermarket _Size | string |
Supermarket_Location_Type | string |
Supermarket_Type | string |
Product_Supermarket_Sales | float32 |
//Remove Id columns let cols_2_remove = ['Product_Identifier', 'Supermarket_Identifier', 'Product_Supermarket_Identifier'] var new_df = df2.drop({columns:cols_2_remove,axis:1}) // drop the columns
table(new_df.head())
Product_Weight | Product_Fat_Content | Product_Shelf_Visibility | Product_Type | Product_Price | Supermarket_Opening_Year | Supermarket_Size | Supermarket_Location_Type | Supermarket_Type | Product_Supermarket_Sales | |
0 | 11.6 | Low Fat | 0.068535039 | Soft Drinks | 357.54 | 2005 | NaN | Cluster 3 | Grocery Store | 709.08 |
1 | 11.6 | Low Fat | 0.040911824 | Soft Drinks | 355.79 | 1994 | High | Cluster 3 | Supermarket Type1 | 6381.69 |
2 | 11.6 | Low Fat | 0.041177505 | Soft Drinks | 350.79 | 2014 | NaN | Cluster 2 | Supermarket Type1 | 6381.69 |
3 | 11.6 | Low Fat | 0.041112694 | Soft Drinks | 355.04 | 2016 | Medium | Cluster 3 | Supermarket Type2 | 2127.23 |
4 | 11.6 | Ultra Low fat | 0 | Soft Drinks | 354.79 | 2011 | Small | Cluster 2 | Supermarket Type1 | 2481.77 |
//print the shape console.log(new_df.shape)
Out
[4990,10]
//list out the categorical and numerical variable var cat_cols = ['Product_Fat_Content','Product_Type', 'Supermarket _Size', 'Supermarket_Location_Type', 'Supermarket_Type' ] var num_cols = ['Product_Weight', 'Product_Shelf_Visibility', 'Product_Price', 'Supermarket_Opening_Year', 'Product_Supermarket_Sales']
for(let i in cat_cols){ let col = cat_cols[i] let counts = new_df[col].value_counts() var layout = { title: `Bar Plot for ${col}` } viz(`cat_viz${i}`, x =>{ counts.plot(x).bar({layout:layout}) }) }
for(let i in num_cols){ let col = num_cols[i] let layout ={ xaxis:{ title: col }, yaxis: { title:'Product_Supermarket_Sales' } } viz(`num_col${i}`, x=>{ new_df.plot(x).scatter({x:col,y:'Product_Supermarket_Sales'}) }) }
for(let i in cat_cols){ let col = cat_cols[i] let layout ={ xaxis:{ title: col }, yaxis: { title:'Product_Supermarket_Sales' } } viz(`cat_cols${i}`, x=>{ new_df.plot(x).box({x:col, y:'Product_Supermarket_Sales'}) }) }
Getting Started 部分
Getting Started
使用Dnotebooks的快速指南
安装
要安装Dnotebooks,必须安装Node.js。如果您没有,请按照这里的官方指南进行安装。
安装Node.js后,您可以通过在终端上运行以下命令来安装Dnotebook:
npm install -g dnotebook
建议如上全局安装Dnotebook。这使得从任何地方启动服务器都很容易。
运行 Dnotebook
安装后,在您打开的终端中运行以下命令:
dnotebook
这将在您的默认网页浏览器中打开一个url为 http://localhost:4400 的新选项卡.应该如下图所示:
此页面是默认的笔记本界面。从这里你可以开始写JavaScript或者Markdown。
单元格(Cells)
单元格(Cell)们构成了笔记本的主体。 在上面的截图中,黑色的单元格(Cell)为空单元格. 有两种类型的单元格,即:
- Code cell: 这些单元格包含要执行的JavaScript代码,输出如下所示。
- Markdown cell: 这些包含使用 Markdown 的文本.
代码单元格(Code Cell)
新笔记本的第一个单元格始终是代码单元格。任何JavaScript代码都可以在代码单元中编写和执行。让我们用经典的hello world示例来测试一下。键入console.log("Hello World!")
输入代码单元格,然后单击运行按钮。
将鼠标悬停在代码单元格上,会显示Run按钮。或者,可以使用快捷键****Ctrl + Enter** (Win)或者Command + Enter (Mac) 来运行代码单元格。
结果应该如下所示:
Markdown
Markdown 是一种轻量级标记语言,可用于向纯文本文档添加格式元素。标记写在文本单元格中。要创建文本单元格,请将鼠标悬停在任意单元格上,然后单击 text 按钮。您可以选择在当前单元格的上方或下方添加降价单元格。
在文本框中,您可以添加任何减价文本。例如,将下面的文本复制并粘贴到标记文本框中。
# This is a level 1 heading ## This is a level 2 heading This is some plain text that forms a paragraph. Add emphasis via **bold** and __bold__, or *italic* and _italic_. Paragraphs must be separated by an empty line. * Sometimes we want to include lists. * Which can be indented. 1. Lists can also be numbered. 2. For ordered lists. [It is possible to include hyperlinks](https://www.example.com) Inline code uses single backticks: `foo()`, and code blocks use triple backticks: ``` bar() ``` Or can be indented by 4 spaces: foo() And finally, adding images is easy: ![Alt text](https://www.example.com/image.jpg)
要运行markdown 单元格,您可以双击它,或使用运行按钮。这将代替markdown 呈现输出。
要再次编辑一个markdown 单元格,你再次双击即可.
持久化/State
笔记本的每个实例都运行一个持久状态,并且在任何单元格中声明的变量对所有单元格都可用。
例如,如果您在一个单元格中加载包或声明变量,它们将在另一个单元格中可用。通过这种方式,您可以认为笔记本文档有点类似于脚本文件,只是它是多媒体。让我们试试这个来感受一下。首先,我们将加载danfo.js和tensorflow.js包,然后创建一个简单的模型。
//load package downloads and install any JavaScript package via its CDN load_package(["https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest", "https://cdn.jsdelivr.net/npm/danfojs@0.2.4/dist/index.min.js"])
load_package是一种内置方法,可帮助您通过库/包的CDN链接将其加载到笔记本中。它可以接受一系列链接。
一旦我们执行了上面的单元,我们就可以在任何其他单元中引用tf (Tensorflow.js)和dfd (Danfo.js)。例如,我们可以从下面的代码创建一个Danfo DataFrame:
json_data = [{ A: 0.4612, B: 4.28283, C: -1.509, D: -1.1352 }, { A: 0.5112, B: -0.22863, C: -3.39059, D: 1.1632 }, { A: 0.6911, B: -0.82863, C: -1.5059, D: 2.1352 }, { A: 0.4692, B: -1.28863, C: 4.5059, D: 4.1632 }] df = new dfd.DataFrame(json_data) table(df)
要显示Danfo对象(DataFrame/Series),请通过传递要显示的对象来使用内置的table函数。如果使用普通的print()语句,结果会打印到浏览器控制台
添加一个新的代码单元,并创建一些简单的张量,如下所示:
var xs = tf.tensor2d([[0,0],[0,1],[1,0],[1,1]]) var ys = tf.tensor2d([[0],[1],[1],[0]]) function getModel(){ var model = tf.sequential() model.add(tf.layers.dense({units:8, inputShape:2, activation: 'tanh'})) model.add(tf.layers.dense({units:1, activation: 'sigmoid'})) model.compile({optimizer: 'sgd', loss: 'binaryCrossentropy', lr:0.1}) return model }
您可以使用console.log函数打印出任何对象。这将在浏览器控制台和单元格下的输出div中打印对象。
console.log(xs)
键入 Option + ⌘ + J (在 macOS系统上), 或者 Shift + CTRL + J (在 Windows/Linux系统上)以打开网页浏览器的console。我们鼓励您在实验时打开控制台,因为控制台中的错误消息格式正确。
在下面的新单元中,您可以创建和训练一个简单的模型:
var loss = [] var epochs = [] const model = getModel() model.fit(xs, ys, { batchSize: 1, epochs: 50, callbacks: { onEpochEnd: async(epoch, logs)=>{epochs.push(epoch); loss.push((logs.loss).toFixed(4))} } })
我们保存了每个epoch后的loss,因此我们可以使用Danfo.js内置的绘图方法进行绘图。
s = new dfd.Series(loss) s.plot(this_div()).line()
要使用Danfo.js绘图,您需要指定一个div名称。您可以通过调用函数**this_div( )**来访问每个代码单元格下的输出div
文件选项
单击Option选项卡会为您的笔记本显示几个文件选项:
你可以重命名、下载和上传笔记本。
重命名笔记本
单击重命名选项会打开一个模态框,您可以在其中输入名称。完成后,单击关闭按钮。
下载你的笔记本
你可以下载一个笔记本供以后使用。下载按钮将笔记本保存为JSON对象,可以重新上传到Dnotebooks。例如,您将下载您创建的示例笔记本,并在下面重新上传:
导入保存的笔记本
您可以上传上例中保存的笔记本。首先,刷新页面,在新实例中,单击option 然后upload。
选择你早期下载的笔记本 (myNotebook.json). 这将自动加载并显示文件:
您还可以像使用任何其他笔记本一样进行交互和运行笔记本。
Extra Functions
load_package()
加载包方法可以帮助您通过CDN链接轻松地将外部包/库添加到笔记本中。例如,要加载Tensorflow.js和Plotly.js,您可以执行以下操作:
load_package(["https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest", "https://cdn.plot.ly/plotly-latest.min.js"])
加载包后,您可以像在HTML页面中一样访问它们。例如,您可以绘制如下所示的交互式图表:
var trace1 = { x: [1, 2, 3, 4], y: [10, 11, 12, 13], mode: 'markers', marker: { size: [40, 60, 80, 100] } }; var data = [trace1]; var layout = { title: 'Marker Size', showlegend: false, height: 600, width: 600 }; Plotly.newPlot(this_div(), data, layout); //this_div is a function that returns the current output div name
load_csv()
load_csv函数帮助您通过互联网将csv文件异步加载到Danfo.js DataFrame中。在读取大文件并且想要跟踪进度的时候,应该用这个代替Danfo.js内置的read_csv函数。load_csv在导航栏上显示一个微调器,以指示加载方法的状态。
将下面一行代码添加到代码单元格中,然后运行它。
var df load_csv("https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv") .then((d)=>{ df = d })
如果您观察右上角,您会注意到一个指示单元格状态的微调器。
table()
要轻松显示Danfo.js的DataFrame/series,可以使用内置的table函数。只需从任何单元格中调用它,并传入DataFrame对象。例如,加载上述finance数据集后,您可以如下所示显示它:
table(df) //displays object as a formated table
this_div()
函数this_div()将返回当前代码单元格输出的id。这可以在绘图时使用,或者当您想要在输出单元格中显示内容时使用。
请参见下面的示例,该示例根据日期索引绘制了finance DataFrame 中的两列。
var layout = { title: 'A financial charts', xaxis: { title: 'Date', }, yaxis: { title: 'Count', } } new_df = df.set_index({ key: "Date" }) new_df.plot(this_div()).line({ columns: ["AAPL.Open", "AAPL.High"], layout: layout })
forlog()
当循环(looping)时,**console.log()**将只显示输出单元格中循环的最后一个元素:
for(let i=0; i<10; i++){ console.log(i) }
要查看输出单元格中循环的所有元素,可以使用如下所示的forlog 方法:
for(let i=0; i<10; i++){ console.forlog(i) }