使用JavaScript脚本自动生成数据分析报告

首先我们用来分析数据的工具仅仅是一个浏览器,也许你觉得愕然,觉得不可思议。但我们真的做到了,而且是一个通用的数据分析工具。不管你是库存数据、销售数据、金融数据还是行政统计都可以快速分析数据,并生成数据分析报告。如下图所示,只需点击书签就能启动数据分析,报告内容以网页的形式显示在浏览器页面。

浏览器生成数据分析报告

分析数据之前,需要获得数据。而浏览器支持多种数据获取方式,甚至可以同时从多个不同的数据源获取数据,这样适用范围更广泛。

使用浏览器可以从网页抓取数据,这样可以获得实时数据,比如抓取实时订单。从网页抓取数据时 ,在浏览器项目管理器中,添加抓取内容步骤,定位需要抓取的html元素,并获取元素的属性值,保存到浏览器变量中。

从网页抓取数据

除了从网页抓取数据外,浏览器还支持直接向服务器发送数据请求,一般使用Post或Get请求,同时可以设置Http请求头数据,如果获取需要登录验证的数据,可以把Cookie添加到Http请求头部数据中。得到服务器的返回数据后,保存到浏览器的变量。

从服务器获得数据

如果数据来自Excel文档,则在浏览器的项目管理中添加自定义变量步骤,设置Excel文档路径和字段名,项目在执行时就会自动读取Excel文档。获取数据后保存为浏览器变量,以供后续步骤分析调用。

如果数据保存在txt文档,或者以json、xml格式保存的数据,也可以在处定义变量步骤中读取。可以选择每次读取一行或者直接读取整个文件内容,获得内容后保存为浏览器变量。

如果从第三方系统获取数据,可以直接访问它的数据库,通过执行数据库查询SQL语句获取数据表,数据表内容自动转换为JSON格式保存为浏览器变量。支持Sqlserver、Mysql、Sqlite、Access等常见关系数据库。

不管通过什么途径获得数据,都可能会有意外情况发生,比如:文件被删除找不到数据文件,或者数据库连接失败等情况。浏览器无法获取完整的数据,就无法执行后续分析数据步骤,或者分析后得到不完整的结果。为避免这种错误的发生,需要检查获取的数据是否完整。

获取到的数据保存在浏览器变量中,可以在JS脚本代码中直接引用,通过JS判断数据是否存在。

添加一个监控变量的步骤,当判断获取数据完整时,执行Yes节点分支,对数据做下一步分析。当未能获取完整数据时,执行No节点,终止数据分析,并在弹出窗口中给出错误提示。

实际上数据分析过程是通过JavaScript或JQuery来实现的,浏览器在执行脚本前,会把浏览器变量替换为它的值。由于脚本编程的灵活性,可以完成各种复杂的数据处理,并把最终结果嵌入HTML代码。

因为使用的浏览器,可以把html代码直接嵌入网页显示,这样就可以在浏览器上直接查看数据分析报告了。就像本文开头一样生成数据分析报告,甚至可以用脚本调用相关组件,在网页上生成各种统计图表。生成报告的格式,完全由脚本代码控制。

以上所有配置,包括JavaScript脚本代码,都可以保存为项目文件。下次使用时,只要运行这个项目文件即可。也可以添加多个项目,以不同的角度分析数据,得到多份数据分析报告。分析报告可自动保存为Html、Txt或Excel文档格式,甚至可以把结果重新写入数据库,只需要构建相应的SQL语句执行。

对于某些周期性数据分析,比如每天18点生成当天的生产数据报告,可以在项目第一个步骤前插入一个定时控制步骤,设置每天18点自动生成报告,还可以把报告内容通过邮件发送公司经理。也可以调用webapi,实现微信或钉钉app定时接收数据分析报告。

本文转载于网络 如有侵权请联系删除

相关文章

  • 让用户依次输入三个整数,求出三个数中的最小值,并打印到控制台

    让用户依次输入三个整数,求出三个数中的最小值,并打印到控制台//导包 importjava.util.Scanner; publicclassTest{ publicstaticvoidmain(String[]args){ //让用户依次录入三个整数,求出三个数中的最小值,并打印到控制台。 //创建键盘输入对象 Scannerscan=newScanner(System.in); //依次输入三个数 System.out.print("请输入第一个数:"); inta=scan.nextInt(); System.out.print("请输入第二个数:"); intb=scan.nextInt(); System.out.print("请输入第三个数:"); intc=scan.nextInt(); //定义一个整数用来存储最小值 intminimum; //对三个数进行判断 if(a>b&&b>c){ minimum=c; }elseif(a>c&&c>b){ m

  • 牛客寒假算法基础集训营3 D. 处女座的训练(思维)

    题目链接:https://ac.nowcoder.com/acm/contest/329/D    一道贪心题,其实思路想的都差不多,但是这个贪心的排序应该是按bi/ai的,算出来单位时间内的疲劳值消耗(类似性价比),还有就是除法可能会有一个精度损失,所以cmp可以用不等式的性质,把除法换成乘法就好了。AC代码:#include<bits/stdc++.h> #definelllonglong usingnamespacestd; intn; structNode{ llx,y; }Edge[100005]; boolcmp(Nodea,Nodeb){ returna.y*b.x>b.y*a.x; } intmain() { scanf("%d",&n); llsum=0; for(inti=0;i<n;i++){ scanf("%lld%lld",&Edge[i].x,&Edge[i].y); sum+=Edge[i].y; } sort(Edge,Edge+n,cmp); llans=0;

  • 卖体验卖温度,年轻人家电印上“统帅烙印”

    家电业正在变天!前不久,中国家用电器行业研究机构中怡康在报告中认为,2017年国内家电行业或将呈现出成本上升、产品升级;智能家居生态圈渐成主流;家电企业逐渐进入智能制造时代等七个明显的趋势。如果说,这份报告释放了家电行业“深化改革”的信号,那么这次在上海新国际博览中心举行的中国家电及消费电子博览会(AWE)上,年轻人家电品牌统帅发布行业首套轻时尚家电,首秀年轻人全天生活场景,对标家电界“宜家”,则是实打实的开打价值战。统帅为何在这个时候强势转型?对行业又释放着什么信号?风向已转,家电行业迎来新战役:体验温度战具体表现在几个方面。一、透支顾客信任的价格战陷入死胡同 全场5折、满3000返500、底价秒杀……当这些频繁的价格战变质为家电行业的常规武器,又无法触及用户痛点时,价格战的“杀伤力”就已逐步失灵,原来那些造势、提价再降价、你方唱罢我登场、骗多少消费者上当算多少的伎俩也没法用了。这背后一是因为消费者对家电业频繁的造节和打价格战已经产生了严重的“审美疲劳”,再加上不少消费者在以往的促销中上过当,不管家电吹嘘自己降价是多大风暴,都已然不能再激起他们太大的热情。二是消费者越来越精明,各类比

  • 【特朗普悍然给中国高科技加税】中国通讯、半导体等遭精准打压,美国用AI算出1300项加税商品

    新智元报道来源:彭博等作者:肖琴、克雷格【新智元导读】美国贸易代表办公室(USTR)昨天公布了拟加征关税的中国商品清单,这些商品多达1300种商品,计划加征25%的关税,其中,包含大量的半导体产业商品。值得注意的是,在精准打击中国制造2025的路上,美国使用了计算机算法挑选出这1300中商品。清明节前夕,中美笼罩在全面贸易战的阴霾下。昨天,美国贸易代表办公室(USTR)公布了拟加征关税的中国商品清单,涉及每年从中国进口的价值约500亿美元商品,这些商品多达1300种商品,计划加征25%的关税。这是特朗普政府对中国上周日宣布对美国猪肉、水果等产品征收关税的回应。“中美贸易战”双方僵持了很久,但这次特朗普的做法有点狠:在这1300多商品中,除了钢铁产品、铝产品等名单“常客”外,还主要涉及信息和通信技术、航天航空、机器人等科技产业。为何选择这些商品?美国贸易代表办公室一位官员表示,关税清单目标对准的是从中国产业政策中受益的产品,产业政策包括“中国制造2025”计划。这个计划国人都比较熟悉,它旨在发展国内的信息技术、机器人、新能源汽车等10个战略性行业。因此,这10个行业的许多产品都出现在美国

  • 06.移动先行之谁主沉浮----我的代码我来写(Xaml的优势)

    如果移动方向有任何问题请参考===>异常处理汇总-移动系列(点)前面几节课,我们都是在前台创建对象,进行一些设置,那么我们为什么不用传统的方法来编程呢?我们今天来试试你就明了了~~打开MainPage.xaml.cs,自己创建一个button,进行一些常用设置///<summary> ///在此页将要在Frame中显示时进行调用。 ///</summary> ///<paramname="e">描述如何访问此页的事件数据。 ///此参数通常用于配置页。</param> protectedoverridevoidOnNavigatedTo(NavigationEventArgse) { Buttonbtn=newButton(); btn.Content="巴松2号";//文本内容 btn.HorizontalAlignment=Windows.UI.Xaml.HorizontalAlignment.Right;//水平对齐方式 btn.VerticalAlignment=Windows.UI.

  • 将linux下的rm命令改造成mv到指定的目录下

    来源:博客园-BigBao的博客链接:http://www.cnblogs.com/smail-bao/p/6347347.html(点击文末阅读原文前往)小编语:昨晚一条新闻刷爆朋友圈,GitLab.com一位身处荷兰的疲惫系统管理员在进行数据库复制过程中不小心在一台错误的服务器上删除了一个目录,他删除了一个包含300GB实时产品数据的文件夹,在取消rm-rf删除命令后该文件夹只剩下4.5GB数据(http://www.chinaz.com/server/2017/0202/651410.shtml)。后台开发、维护是比较默默无闻的工作,一旦被关注,往往是背锅、负责任的时候,对线上的文件、数据库的修改、删除操作一定要注意备份,慎之又慎。如使用这个rm命令,尽管出意外的概率很低,而一旦出意外,影响是很大的。rm是Linux下文件删除的命令,它是Linux下非常强大却又非常危险的一条命令,特别是rm-rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有文件和目录时,很简单 #rm-rf./* 这没什么,但是,但是如果不小心打成这样 #rm-rf/* 兄弟请节哀吧!~~ rm删除文件同

  • 英语从头学

    4级没有过,听力完全不行,阅读能力有一点点,初中时英语还马马虎虎,高中开始哑巴英语,2016年3月19日开始决定重新学,以前总认为反正就是为了看懂点技术材料,所以也没重视过读,不过后来发现光看记不住单词,很多单词认识我,我不记得它.所以决定从音标开始,简单记录一下过程吧. 1.赖世雄美语音标:每个都反复听,跟着读,一天不求多,只读3,4个.这叫积少成多. 2.把4级单词过一遍:用的是手机上的App,"有道四六级"和"百斩词",有道里面有个"看词表"的功能,用它主要是可以发音.背完也没记住几个,不过发现很多单词发音都是有规律的,如果根据发音会读了,单词记起来也容易多了. 3.学短语:其实有些句子单词可能都认识,但就是不知道它是什么意思,也就是有些搭配不懂它的意思,我主要是用手机App"扇贝炼句",背诵之后,记录下来,为此我做了一个工具,挂在了网上,可以随时录入和模糊查询(简单的支持相关度排序,开源): 4.加英语群聊天:记录下来的句子和学到的东西要应用到实际,所以加了一些QQ英语群和WhatsApp等,也在Google+上加英语社区,如果有机会用到,就把自己背过的句子或短语用上,从不会

  • 九个Console命令,让 JS 调试更简单

    摘要 一、显示信息的命令二:占位符三、信息分组四、查看对象的信息五、显示某个节点的内容六、判断变量是否是真七、追踪函数的调用轨迹。八、计时功能九、console.profile()的性能分析   一、显示信息的命令   <!DOCTYPEhtml>     <html>     <head>         <title>常用console命令</title>         <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />     </head>    &

  • 事务隔离级别

    未授权读取 也称为读未提交(ReadUncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。 授权读取 也称为读提交(ReadCommitted):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 可重复读取(RepeatableRead) 可重复读取(RepeatableRead):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。 序列化(Serializable) 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。 隔离级别越高,越能保证数据

  • puppeteer自动化测试

    1、基础知识 puppeteer.launch()创建浏览器实例 puppeteer.newPage()创建一个新页面 puppeteer.goto()进入指定网站 page.screenshot()截屏 page.pdf()输出为pdf注意必须是headless=true page.evaluate()在浏览器中执行函数想到与在控制台执行函数返回promise page.waitFor(selectorOrFunctionOrTimeout[,options[,...args]])等待可以是等待一段时间,某个函数执行或某个DOM的出现 page.click(selector[,options])点击某个元素 page.type(selector,text[,options])文本输入 page.frames()获取当前页面所有的iframe,然后根据iframe的名字精确获取某个想要的iframe iframe.$(‘.srchsongst‘)获取iframe中的某个元素 iframe.evaluate()在浏览器中执行函数,相当于在控制台中执行函数,返回一个Promise Arr

  • 自制CSS面试题答案

    blue red black inherit,initial,unset,revert(截止目前revert仅Firefox,Safari浏览器支持) 用于重置所有属性 Importance Specificity Sourceorder 覆盖该属性的所有计算规则

  • 科目组2

    科目组:1将科目分类       2点击进入一类科目组即是字段状态组  

  • 2020牛客寒假算法基础集训营1

    题目链接: https://ac.nowcoder.com/acm/contest/3002 A题 思路: 既然三角形面积为1且有一条边平行于坐标轴,那么这条边为1或者2,我们枚举1平行于x/y轴的情况,加上2平行于x/y轴的情况,再减去(重复的)1、2都平行于坐标轴的情况即是答案; 注意计算的过程中每一步都需要取余; 代码: #include<bits/stdc++.h> usingnamespacestd; typedeflonglongll; constllmod=1e9+7; lln,m; intmain(){ #ifdefMyTest freopen("Sakura.txt","r",stdin); #endif cin>>n>>m; llx=(m-1)*m%mod*(n-2)%mod*2ll%mod+(n-1)*n%mod*(m-2)%mod*2ll%mod; x%=mod; lly=(m-2)*m%mod*(n-1)%mod*2ll%mod+(n-2)*n%mod*(m-1)%mod*2ll%mod; y

  • 安装pywin32以及问题

    pywin32源码网址:   https://github.com/mhammond/pywin32/   通过exe(二进制包)安装包安装pywin32        或者直接通过pipinstall安装      安装后不能导入win32api报错   找到安装python所在的安装路径,找到pywin32_postinstall.py文件         通过管理员命令提示符 下执行,执行后重启电脑,重新打开项目即可 python./pywin32_postinstall.py-install复制   既要脚踏实地,也需仰望天空

  • 第3章上机实践报告

    1、实践题目 7-3 编辑距离问题 (30分) 2、问题描述 设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括(1)删除一个字符;(2)插入一个字符;(3)将一个字符改为另一个字符。将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。对于给定的字符串A和字符串B,计算其编辑距离d(A,B)。 3、算法描述 ★数据输入:输入1组数据。每组数据两行,每行一个字符串。每个字符串长度不超过2000; ★初始化:开一个二维数组d[i][j]来记录a0-ai与b0-bj之间的编辑距离。首先给定第一行和第一列。dp[0][i],就是说A串是一个空串,而B串是个长度为i的串,很显然A串变为B串就是插入i个字符,即dp[0][i]=i;而dp[i][0],就是说A串是个长度为i的串,而B串是一个空串,很显然A串变为B串就是删除i个字符,即dp[i][0]=i。 ★计算d[i][j]:定义一个二维数组dp[i][j]表示状态,dp[i][j]表示a的前i个和b的前j个相同后的最短距离。  &n

  • 关于拦截器与过滤器使用场景、拦截器与过滤器的区别整理

    过滤器在web.xml中配置: (1)因为一开始在过滤器中映射的url-pattern填写路径是*.action。所有的action要经过它的过滤。<url-pattern>*.action</url-pattern> (2)因为在web.xml中配置了过滤器,所以,执行过程所有程序都经过struts2过滤器(路径是:/*),首先过滤自己相关的程序,如xx.action,先处理,如果是.html或者.jsp就不会处理,直接放行。 解决方法:把过滤器映射路径改为:/* ,即全部过滤处理。 <url-pattern>/*</url-pattern> 过滤器和拦截器不同,struts中拦截器是核心。   理解 (1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。(理解:就是一堆字母中取一个B) (2)拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。(理解:就是一堆字母中,干预他,通过验证的

  • DSAPI CMD命令行进程代理

    DSAPI.文件.CMD命令行进程代理,是用来和CMD.exe或指定exe进行输出重定向的简化使用工具,可隐藏或显式地启动一个cmd.exe,并将输出流、输入流和错误流重定向至代理,通过事件触发方式与之交互。 相关代码如下: PrivateWithEventsCMD命令行AsNewDSAPI.文件.CMD命令行进程代理 PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.Click CMD命令行.启动CMD命令行进程() EndSub PrivateSubCMD命令行进程_有输出内容(SenderAsCMD命令行进程代理,输出内容AsString)HandlesCMD命令行.有输出内容,CMD命令行.有输出报错内容 Me.BeginInvoke(NewSetText(AddressOfSetTextA),输出内容) EndSub PrivateSubForm1_FormClosing(senderAsObject,eAsFormClosingEventArgs)HandlesMe.FormClosin

  • oracle锁表进行关闭

    --查询被锁表 select'altersystemkillsession'''||sess.sid||','||sess.serial#||''';',sess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_modefromv$locked_objectlo,dba_objectsao,v$sessionsesswhereao.object_id=lo.object_idandlo.session_id=sess.sid;   ---进行封杀 altersystemkillsession'''||sess.sid||','||sess.serial#||''';  

  • Unity Vector3.Slerp使用范例

            1usingSystem.Collections; 2usingSystem.Collections.Generic; 3usingUnityEngine; 4 5publicclassTestSlerp:MonoBehaviour 6{ 7publicTransforma; 8publicTransformb; 9 10voidStart() 11{ 12 13} 14boolkaishi=false; 15floatT; 16voidUpdate() 17{ 18if(Input.GetKeyDown(KeyCode.S)) 19{ 20kaishi=true; 21T=Time.time; 22print(Time.time+"SSSSSSSSSSS"+T); 23 24} 25if(kaishi) 26{ 27Debug.DrawLine(Vector3.zero,newVector3(10,10,10),Color.red); 28//for(inti=0;i<11;++i) 29//{ 30Vector3ce

  • 查找“asdfjvjadsffvaadfkfasaffdsasdffadsafafsafdadsfaafd”, 打印出该字符串中有多少个&quot;af&quot;。

    #include<stdio.h>#include<string.h> /*查找“asdfjvjadsffvaadfkfasaffdsasdffadsafafsafdadsfaafd”,打印出该字符串中有多少个"af"。*/ voidmain(){ charstr[]="asdfjvjadsffvaadfkfasaffdsasdffadsafafsafdadsfaafd"; inti=0,count=0; for(i=0;i<strlen(str);i++) { if(str[i]=='a'&&str[i+1]=='f') { count++; } } printf("共有%d个af\n",count); }

  • 电商打折套路解析

    importnumpyasnp importpandasaspd importmatplotlib.pyplotasplt %matplotlibinline importwarnings warnings.filterwarnings('ignore') #不发出警告 frombokeh.ioimportoutput_notebook output_notebook() #导入notebook绘图模块 frombokeh.plottingimportfigure,show frombokeh.modelsimportColumnDataSource #导入图表绘制、图标展示模块 #导入ColumnDataSource模块复制 #查看数据,计算商品总数、品牌总数 importos os.chdir('C:\\Users\\Hjx\\Desktop\\') #创建工作路径 df=pd.read_excel('双十一淘宝美妆数据.xlsx',sheetname=0,header=0,index_col=0) df_length=len(df) df_columns=df

相关推荐