-- 人会说谎, 但是数据不会
个人原创, 转载需注明来源 https://www.cnblogs.com/milton/p/16296974.html
商业智能(Business Intelligence)是一个总称: 包括数据的定义, 生成, 收集, 存储和分析, 以及最后的一环 -- 决策.
数据化是对信息进行收集, 量化和存储. 这个趋势将一切活动数字化
由于科技的发展, 存储与传输的成本越来越低, 信息的产生速度与日俱增, 作为企业如何利用数据价值变得前所未有的重要.
数据对于决策的重要性 -- 传说罗斯柴尔德家族通过信鸽, 在滑铁卢战役还没有结束时就提前知道结果, 从而大量买入英国国债, 虽然未必是其成功的关键因素, 但是可以看出信息如何关键.
商业智能作为高价值服务, 自20世纪60年代计算机出现时就已经存在, 当时主要的用户是大型企业和政府部门, 经过半个世纪的发展, 商业智能已经成为中小企业的必备技能.
如果一个人把决策建立在主观认知而不是事实基础上, 就容易产生错误的决策. 企业也是如此.
使用BI, 企业可以从实际数据中提取关键事实, 将其转化为决策的依据. 是否高效地使用商业智能和分析, 是现代环境中成功的关键.
商业决策根据频率和影响, 通常分为三类: 运营, 管理和战略.
运营决策通常频繁发生, 每小时每分钟, 与企业的业务相关. 运营决策影响企业的日常经营情况以及盈利能力. 对于生产经营中存在的具体问题, 通过BI系统进行自动决策或辅助决策, 可以提升工作效率, 减小风险, 例如
管理决策的频率不会很频繁, 例如每周或每月, 属于企业中的中层管理决策, 通常这些决策与战略决策的息息相关. 例子包括产品价格调整, 营销策略, 优惠政策等:
战略决策通常由一个组织的最高管理层制定, 将对组织未来长时间的活动造成重大影响. 需要对多种方案进行仔细分析和评估后确定, 这种决策通常是不可重复的. 通过BI可以分析宏观环境, 通过市场趋势, 货币周期, 政策风向, 市场监管, 领导人偏好等重要信息, 结合内生数据对各种方案进行量化, 为最终的战略决策提供依据.
战略决策的例子包括
决策中, 每一个层级都为实现上一层的决策服务, 一个大的决策会随着时间不断分解为更小的决策, 直至目标达成, 或目标无法达成不得不更换上层决策.
以俄政府决定武装进攻乌克兰为例
随着每一个局部战斗(运营决策)的执行, 结果与预期的差距, 导致上层决策(战略决策)不断调整, 从最初的空降基辅, 到五月初的战线收缩转为集中兵力从东部推进. 可以看出在开战之初, 俄政府的数据和决策是有问题的, 基于错误的数据和判断, 做出了开战和冒进的决策.
从整体看, 这些数据分为
公共数据指的是能从公开的渠道获取的数据, 例如货币汇率, 证券资产的价格; 某一地的人口, 气温, 降水量和湿度, 手机号归属地, IP归属地, 身份证归属地, 企业所处行业的原材料和商品价格行情, 等等.
不同的业务对公共数据有不同的需求, 体现在精度(准确性), 实时性, 回溯性等方面. 例如交易数据, 可以分为不同的时间间隔, 五秒, 五分钟, 日, 周.
要求不高的数据, 可以从公开渠道下载或自行采集, 但是对精度和实时性要求高的数据, 需要从非公共渠道购买.
这部分数据指非公开渠道的数据, 或者需要付费的商业数据. 例如上面提到的高频交易数据, 有专人维护的地理信息和交通信息, 一些行研收集的行业数据, 还有监管机构从被监管机构提取的运营数据等.
企业运营中产生的数据: 财务数据, 业务数据, 大部分BI系统, 处理的是这部分内容, 配合公共和非公共数据, 产生报表或做出决策.
数据的类型, 从不同的角度有不同的分类:
对于定性数据, 必须将定性数据转化为定量数据, 才能进行正确的分析.
BI系统对数据的分类有三层, 分别是 Raw(原始数据), Meta(元), Model(模型), 每一层都是对前一层数据的细分.
原始数据泛指各种未经校验的, 未处理的, 未结构化的, 无直接的自然含义的数据. 这一阶段的数据是粗糙的, 可能存在噪音, 可能存在不匹配的格式, 需要处理后才能被软件使用.
从BI软件的角度, 原始数据有以下基础类型
实际上通用的类型只有三种: 字符串, 数值, 时间. 二进制是一种特殊的类型, 用于处理其它的例外情况, 例如无法识别的数据. 对于二进制数据, 通常需要转换为以上的三种通用类型才能被BI软件处理.
基于以上的基础类型, 进行排列组合可以得到派生类型, 例如
对于数值类型和时间类型, 可以进一步衍生出高级类型
元数据是经过加工清洗后, 具有自然含义的数据. 这一阶段的数据是可以被BI软件直观理解的, 与现实世界相关的数据.
不同的基础类型, 可以派生出的元数据类型有
同样地元数据也可以通过排列组合产生派生类型, 例如
模型数据是映射到模型中具体字段的元数据. 这一阶段的数据, 在模型中是确定的字段(或者说特征量). 将用于模型训练和计算, 影响最终的决策.
因为从元数据可以派生出无穷尽的模型数据, 这部分就无法列举了.
以手机号这个元数据类型举一个简单的例子, 根据不同的模型结构, 手机号可以体现为各种具体的字段
模型数据根据模型要求, 对数据有额外的属性要求
BI系统对数据的处理, 可以用ETL的过程进行理解. 借用 Power BI 的数据导入和类型作为示例

抽取可以通俗的理解为数据导入. BI系统的第一件事就是将数据导入. 不管主动还是被动, 通过文件或者接口. 在这个过程中需要适配各种数据源的容量, 频次和格式, 作为BI系统, 这部分也许并不能体现高科技, 但是需要实实在在地投入成本, 控制好质量.
数据的质量, 导入的效率, 异常的处理, 决定了BI系统performance的上限.
这里不讨论方式和接口适配, 只对入库进行说明.
在抽取阶段, 每个维度/字段/特征的数据格式必须为可用的格式: 字符串, 数值或时间. 如果连字符串都无法存储, 例如二进制数据, 必须通过专用的抽取方法或工具转换为可用的格式.
在实际应用中, 有两种形态: 桌面应用 和 服务器应用
如果BI软件直接运行在使用者的个人电脑上, 例如 Power BI, 这种情况下, 系统的资源是有限的, 通常只有4G - 8G的内存, 以及几十GB的存储, 但是BI软件可以直接访问文件(例如Excel和CSV数据源).
在桌面应用中, 导入可以简化为连接数据源, 将数据源作为转换和载入的基础.
如果BI软件运行在服务器上, 使用者通过客户端或浏览器使用BI软件提供的服务, 这种情况下, 系统的资源会充裕得多, 例如32G或更多的内存, 数个TB的存储, 但是BI软件面对的数据都在远程, 例如使用者个人电脑上存储的Excel, 公司财务系统上存储的报表.
在服务器应用中, 通常需要将数据缓存至服务端, 再进行后续的清洗和转换. 对于通用的场景, 可以将原始数据都存储为字符串, 对于存在二进制数据的场景可以考虑局部使用二进制字段.
转换中, 需要完成的工作包括数据识别, 数据清洗, 格式转换和属性扩充. 目标是要转换为结构化的元数据.
对每个维度/字段/特征, 根据数据的形态, 依次判断
并非所有的数据都完成上面三步的判断.
根据第一步得到的元类型, 如果无法判断的, 需要人手工指定元类型
这一步结束后, 字段的数值应当符合元数据类型的要求
转换和扩充, 指的是数据在清洗之后, 在载入模型之前的所有数据编辑操作. 这些操作丰富多样, 大体有以下类型
因为这一步之后不再处理清洗, 所以这一步的操作, 其结果都要满足当前字段的元数据类型对数据格式的要求
对于动态产生的数据, 需要保存各字段的元类型, 需要保存上面得到的转换规则, 以便新数据产生时自动转换为目标数据
载入是基于数据模型的, 将对应元类型的数据, 映射到数据模型的某个特征并载入.
在开发上, 涉及到两部分工作
通过抽取和转换之后的数据集, 是一个字段/维度/特征的集合, 根据这个集合中的元数据类型, 与系统中存在的数据模型进行匹配, 判断与各个模型的相似程度, 并确定或推荐最合适的数据模型.
模型匹配和识别通常是一次性的, 甚至在有些场合完全需要通过手工. 这部分是锦上添花的功能, 可以提升用户体验, 但是不会对BI的performance造成实质影响.
数据载入就是将建立映射关系的数据载入到模型中. 根据BI的处理机制, 通常分为动态和静态两种
数据导入后, 不会经常更新, 常用于历史数据分析, 以及一些长效的决策. 这种载入对系统的要求不高, 按元数据格式入库即可.
动态载入用于处理频繁更新, 或需要实时决策的场景, 根据来源数据的情况, 动态载入对系统的要求可能会很高
不同的场景, 对系统的设计思路是不一样的, 需要具体问题具体分析
以上说明了BI系统中决策的类型, 数据对决策的重要性, 数据的类型, 以及最重要的 -- 在BI系统中如何进行数据处理.
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack