powerbi新特性 字段参数字段参数字段参数可以帮助我们更好的完成动态筛选。默认的筛选可能只在某一个表格列中，而字段参数可以实现跨表格列，以及使用多度量值筛选。在Modeling里面可以选择新建参数。当参数设置完成后，会生成一个计算表。初次看这个计算表，以为是用DAX 函数 NAMEOF写的一个公式。但是实际上，是当我们新建参数时，系统自动生成的。我们可以进行二次编辑。案例学习：这个案例的研究了很久，作者的思路的确很巧妙。图形上面设置了几个slicer,包含度量值筛选，按TOP还是BOTTOM，以及排名数字，产品、catergory等进行展示。从关联上来看，下面的图表放入的数据和上方的筛选没有相应的关联关系。当我们按照同样的数值进行绘制图表，会发现上方的筛选器都是无效的。从图表的筛选上面来看，可以发现多了一个度量值的筛选。查看该度量值，可以看到，它是判定了选择TOPN还是BOTTMN，以及排名的数字是多少。然后将另外一个度量值与排名数字进行比较，如果小于排名数字就是1，否则就是0。而使用filter只选择1的部分，这样就实现了TOPN的排序功能。过滤综合指标 = var a =SELECTEDVALUE('TOPNBOTTMN'[TOPN/BOTTMN]) var b =SELECTEDVALUE('Topn'[序号]) return SWITCH(true(),a="TOPN",IF([Rank_按综合指标]<=B,1,0), a="BOTTMN",IF([Rank_按综合指标 -反序]<=B,1,0))继续展开到Rank_按综合指标这个度量值。这里的DAX逻辑是，根据选择的'参数-指标'[参数-指标 个字段]来判定界面上选择的是那个指标，然后获取对应这个指标的按照相应的分类得到的RANK排名。这样就实现了根据TOPN/BOTTOM N，进行动态排名的目的。Rank_按综合指标 = VAR xs = SWITCH(TRUE(), ISFILTERED('Product'[category]), RANKX(ALLSELECTED('Product'[category]),[销售金额]), ISFILTERED('Product'[Subcategory]), RANKX(ALLSELECTED('Product'[Subcategory]),[销售金额]), ISFILTERED('Product'[Model]),RANKX(ALLSELECTED('Product'[Model]),[销售金额]), ISFILTERED('Product'[Product]), RANKX(ALLSELECTED('Product'[Product]),[销售金额]), ISFILTERED('Product'[SKU]), RANKX(ALLSELECTED('Product'[SKU]),[销售金额]), ISFILTERED('Customer'[Customer]), RANKX(ALLSELECTED('Customer'[Customer]),[销售金额]), ISFILTERED('Reseller'[Reseller]), RANKX(ALLSELECTED('Reseller'[Reseller]),[销售金额]), ISFILTERED('Sales Territory'[Country]), RANKX(ALLSELECTED('Sales Territory'[Country]),[销售金额]), BLANK()) VAR dg = SWITCH(TRUE(), ISFILTERED('Product'[category]), RANKX(ALLSELECTED('Product'[category]),[订购数量]), ISFILTERED('Product'[Subcategory]), RANKX(ALLSELECTED('Product'[Subcategory]),[订购数量]), ISFILTERED('Product'[Model]),RANKX(ALLSELECTED('Product'[Model]),[订购数量]), ISFILTERED('Product'[Product]), RANKX(ALLSELECTED('Product'[Product]),[订购数量]), ISFILTERED('Product'[SKU]), RANKX(ALLSELECTED('Product'[SKU]),[订购数量]), ISFILTERED('Customer'[Customer]), RANKX(ALLSELECTED('Customer'[Customer]),[订购数量]), ISFILTERED('Reseller'[Reseller]), RANKX(ALLSELECTED('Reseller'[Reseller]),[订购数量]), ISFILTERED('Sales Territory'[Country]), RANKX(ALLSELECTED('Sales Territory'[Country]),[订购数量]), BLANK()) VAR cb = SWITCH(TRUE(), ISFILTERED('Product'[category]), RANKX(ALLSELECTED('Product'[category]),[成本]), ISFILTERED('Product'[Subcategory]), RANKX(ALLSELECTED('Product'[Subcategory]),[成本]), ISFILTERED('Product'[Model]),RANKX(ALLSELECTED('Product'[Model]),[成本]), ISFILTERED('Product'[Product]), RANKX(ALLSELECTED('Product'[Product]),[成本]), ISFILTERED('Product'[SKU]), RANKX(ALLSELECTED('Product'[SKU]),[成本]), ISFILTERED('Customer'[Customer]), RANKX(ALLSELECTED('Customer'[Customer]),[成本]), ISFILTERED('Reseller'[Reseller]), RANKX(ALLSELECTED('Reseller'[Reseller]),[成本]), ISFILTERED('Sales Territory'[Country]), RANKX(ALLSELECTED('Sales Territory'[Country]),[成本]), BLANK()) VAR lr = SWITCH(TRUE(), ISFILTERED('Product'[category]), RANKX(ALLSELECTED('Product'[category]),[利润]), ISFILTERED('Product'[Subcategory]), RANKX(ALLSELECTED('Product'[Subcategory]),[利润]), ISFILTERED('Product'[Model]),RANKX(ALLSELECTED('Product'[Model]),[利润]), ISFILTERED('Product'[Product]), RANKX(ALLSELECTED('Product'[Product]),[利润]), ISFILTERED('Product'[SKU]), RANKX(ALLSELECTED('Product'[SKU]),[利润]), ISFILTERED('Customer'[Customer]), RANKX(ALLSELECTED('Customer'[Customer]),[利润]), ISFILTERED('Reseller'[Reseller]), RANKX(ALLSELECTED('Reseller'[Reseller]),[利润]), ISFILTERED('Sales Territory'[Country]), RANKX(ALLSELECTED('Sales Territory'[Country]),[利润]), BLANK()) VAR kd = SWITCH(TRUE(), ISFILTERED('Product'[category]), RANKX(ALLSELECTED('Product'[category]),[客单金额]), ISFILTERED('Product'[Subcategory]), RANKX(ALLSELECTED('Product'[Subcategory]),[客单金额]), ISFILTERED('Product'[Model]),RANKX(ALLSELECTED('Product'[Model]),[客单金额]), ISFILTERED('Product'[Product]), RANKX(ALLSELECTED('Product'[Product]),[客单金额]), ISFILTERED('Product'[SKU]), RANKX(ALLSELECTED('Product'[SKU]),[客单金额]), ISFILTERED('Customer'[Customer]), RANKX(ALLSELECTED('Customer'[Customer]),[客单金额]), ISFILTERED('Reseller'[Reseller]), RANKX(ALLSELECTED('Reseller'[Reseller]),[客单金额]), ISFILTERED('Sales Territory'[Country]), RANKX(ALLSELECTED('Sales Territory'[Country]),[客单金额]), BLANK()) RETURN SWITCH(TRUE(),SELECTEDVALUE('参数-指标'[参数-指标 个字段])="'Measure'[销售金额]",xs, SELECTEDVALUE('参数-指标'[参数-指标 个字段])="'Measure'[订购数量]",dg, SELECTEDVALUE('参数-指标'[参数-指标 个字段])="'Measure'[成本]",cb, SELECTEDVALUE('参数-指标'[参数-指标 个字段])="'Measure'[利润]",lr, SELECTEDVALUE('参数-指标'[参数-指标 个字段])="'Measure'[客单金额]",kd )
继续学习Powerbi，预计要半个月到一个月的时间来学习这个报表。不再眼高手低。
PowerBI Drill through 学习什么是drill throughdrill through翻译过来是钻取，即针对选定的信息进行进一步的分析，或者将目前设定的条件作为另外一个页面的filter来使用Drill through实现的效果默认的状态 选定特定后的显示这里的图表都变彩色并且可以进行点击跳转Drill through 实现步骤制作点击选项这里的选项要用按钮来实现，如果用文本框无法设置颜色变化。具体的设置如下。在学习过程中用了很长的时间来寻找这个功能针对按钮的default和disable进行设置不同文字颜色和填充颜色即可制作跳转在按钮的Action里面设置drill through，默认没有页面的的话会无法选择。所以需要新建一个跳转页面，同时在页面的设置为drill through页面。设置页面选项页面内部可以设置不同的drill through from 数据。设置按钮Action到这里即可以实现相应的跳转，同时在跳转页面也会自动出现一个左向箭头返回上一页一些思考之前设计的报表基本上没有去用drill through进行关联，都是在一个很长的页面去做。后续可以考虑使用这个跳转方式来实现。Drill through 对于从总的数据到具体展开分析操作很便捷，减少使用filter去设定问题使用这个方式在展示上会更思路清晰，结构也很简洁。不会给使用人员一共从头看不到尾的报表这里仅是实现跳转方式，具体的各个页面实现还要依赖DAX函数搭配View来实现
KPI多行card的实现针对TOP N的销售额去排列展示，并且分为按Sub catgory , model, sku展示不同的Rank ,成品图如下图形界面的展示方式目前实现的方式有两种。比较友好的方式是采用第二种（应该也是后期更新的）使用inforgraphic Designer插件 这个插件的功能太过于强大。上图中最右边的即使用该插件来完成的。在使用该Visual时，可以删除默认图表，然后进行二次编辑。同时创建文本并且绑定相应的值。这里放了两个文本，这些文本本身还可以采用layout进行位置的设定。所以功能强大但是有点操作复杂。使用新的visual KPI multicard左边的三个卡片都是使用官方后期新增的visual来实现，整体样式也比较好。方法一如果设定不好会导致字体被遮挡的问题。而此方法则不存在这个问题。简单的将两个数据拖到图表里面就可以。DAX公式学习公式一：将t设定为前段slicer的选择topn对应的序号，然后判定相应的排名，如果排名低于选择的序号，则展示销售金额，否则显示空。同时在view界面展示时使用filter将空值隐藏掉销售金额_top = var t =SELECTEDVALUE('Topn'[序号]) Return IF([Rank_按营业额]<=T,[销售金额],BLANK()) 公式二：判断筛选的是产品的哪一列，如果是subcategory,则针对subcategory进行按照销售金额进行排名，其他的按照model,产品，以及sku相应的进行排名。Rank_按营业额 = VAR RESURT = SWITCH(TRUE(),ISFILTERED('Product'[Subcategory]), RANKX(ALLSELECTED('Product'[Subcategory]),[销售金额]), ISFILTERED('Product'[Model]),RANKX(ALLSELECTED('Product'[Model]),[销售金额]), ISFILTERED('Product'[Product]), RANKX(ALLSELECTED('Product'[Product]),[销售金额]), ISFILTERED('Product'[SKU]), RANKX(ALLSELECTED('Product'[SKU]),[销售金额]), BLANK()) RETURN RESURT图表绘制databar实现使用两个相同的度量值，将数据显示同一个矩阵里面。同时，将后面一个的数据使用databar来展示，这样就可以显示出来相应的柱状图效果。对于汇总的数据可以在row subtotals里面针对不同的level等级进行设置。在勾选时需要注意选择show bar only.成品图形中间的部分逻辑比较简单就不用再研究。是环形图搭配multirow card来实现。
Powerbi学习记录读完DAX语法后，感觉使用并没有多大提升，且未应用于实践。所以在网上搜索了一个很好的案例自己去学习实践一下。进而提升自己的能力。先学第一页图表。成品图如下：PowerBI 度量值表的创建正常在做Powerbi度量值时，一般是将PowerBI度量值进行统一放到一个表里面去进行管理。步骤如下：Home ==>Enter data不用输入数据，输入表名即可删除原表中的列在model view界面将度量值移动到表格内设置度量值的folder用于分类管理如何使用new table功能创建的会导致数据列不能删除，且无法自动将度量值置顶动态数据展示针对一些简单的数据可以不用KPI Card来展示，使用文本框即可实现。如下图将选择的种类以及汇总的值进行动态展现，均使用文本框加上动态值的形式展示使用书签模拟按钮的点击效果重点：书签不能保存颜色的变化 。即不可以设置一个按钮的颜色，然后保存书签，再更改按钮的颜色。这种设置不能生效比如下面这三个按钮设置点击效果，则实际上是使用了六个按钮，分别代表有亮和暗色的点击效果来实现。然后搭配书签进行保存。所以书签保存的效果应该是类似于隐藏和现实的效果。使用按钮后获取相应的值这里也有一个坑，研究了一两个小时。有时候展示的效果并不是后台的逻辑。如上图我们选择3时，这个会显示TOP3的值，而DAX公式使用的是selectedvalue,我在研究时一直以为是从按钮上面的获取的值，经过一直寻找都没发现怎么获取这一组按钮的选择值。Powerbi其实没有这个功能。在这个图表里是透过slicer来实现的，唯一的变化是，当作者设计这个书签时将slicer隐藏了。这就导致了我找半天找不到。
好久没写文章了，也没去反思自己是否进步。真是变懒了。2023过去大半，重新思考。
正则表达式学习正则表达式平时偶尔使用，都是从网上直接搜索借鉴。前天在使用时，发现都忘记了。需要重新学习一下。不管在哪个编程语言里面，用到正则表达式的机会都是比较多的。什么是正则表达式正则表达式(Regular Expression)是一种文本模式，包括普通字符（例如，a 到 z 之间的字母）和特殊字符（称为"元字符"）。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。正则表达式的目的可以测试字符串内的模式 即数据验证可以用来替换文本基于模式匹配从字符串中提取子字符串正则表达式基本语法常用的元字符首先要认识的是一些元字符。这些在匹配是组合使用的。^ 代表的开始位置比如我们一串字符串bcde去识别是否为bc开头的，则可以写为^bc$ 代表结束位置例如：abcd 确认是不是结束为cd 则cd$* 代表匹配子表达式零次或多次例如：abc ,aabb, aacc 确认c出现的次数 c*+ 代表匹配前面的表达式一次或多次例如：abc ,aabb, aacc 确认c出现的次数 c+ 能匹配到的是abc和aacc? 代表匹配前面的表达式零次或一次例如：abc ,aabb, aacc 确认c出现的次数 c? 能匹配到的是abc{n} 匹配确定的n次{n,} 至少匹配n次{n,m} 至少匹配n次且最多匹配m次？ 如果前面的字符后面加上了这个问号，则变为非贪婪模式即尽可能少的匹配字符串匹配用的普通字符. 代表除换行符之外任何单字符[ABC] 匹配括号里面所有的字符1 匹配出来ABC的所有字符[A-Z] 匹配所有大写字符[a-z] 匹配所有小写字母[0-9] 匹配数字0-9\w 匹配字母数字和下划线记录一些常用的正则表达式用法求整数 145 ^([^0]\d+|(0+))$如果是多位则判定不是0开头的数字或者直接为0求负整数 -123^-[^0]\d+$ 先用[^0]判定不是0开头，然后再判定数字至少出现一次求数字和字母的组合 ^[A-Za-z0-9]+$求长度为8-10的用户密码（以字母开头数字和下划线）^[a-zA-Z]\w{7,9}$ 以字母开头 ^[a-zA-Z] ,\w表示为字母数字下划线出现7-9次求是否包含某字符串开头并且开头可能包含空格 ^\s*昆山疫情.*$ABC ↩
机器学习机器学习是让计算机无须进行明确编程就具备学习能力。机器学习和传统编程有什么区别呢？简单的两个图来理解：下图就是正常的编程逻辑，发现一个问题，编写规则来处理。如果发现规则有缺失，就去补充这个逻辑。机器学习，则是在未知规则的条件下，让机器自动发现并实现算法。可以简单理解为一个黑盒子。我们并不清楚最后如何实现。机器学习的另一个亮点是善于处理对于传统方法而言太复杂或没有已知算法的问题使用机器学习方法挖掘大量数据来帮助发现不太明显的规律。这称作数据挖掘有监督学习与无监督学习有监督学习在有监督学习中，提供给算法的包含所需解决方案的训练集称为标签。分类任务是一个典型的有监督学习任务。垃圾邮件过滤器就是一个很好的示例。常用的算法有：k-近邻算法线性回归逻辑回归支持向量机（SVM）决策树随机森林神经网络无监督学习无监督学习的训练数据都是未经标记的。系统会在没有“老师”的情况下进行学习。常用算法：聚类算法k-均值算法DBSCAN分层聚类分析（HCA）异常检测和新颖性检测单类SVM孤立森林可视化和降维主成分分析（PCA）核主成分分析局部线性嵌入（LLE）t-分布随机近邻嵌入（t-SNE）关联规则学习AprioriEclat先使用降维算法减少训练数据的维度，再将其提供给另一个机器学习算法（例如有监督学习算法）。这会使它运行得更快，数据占用的磁盘空间和内存都会更小，在某些情况下，执行性能也会更高。批量学习与在线学习看系统是否可以从传入的数据流中进行增量学习批量学习在批量学习中，系统无法进行增量学习——即必须使用所有可用数据进行训练。这需要大量时间和计算资源，所以通常都是离线完成的。离线学习就是先训练系统，然后将其投入生产环境，这时学习过程停止，它只是将其所学到的应用出来。在线学习在在线学习中，你可以循序渐进地给系统提供训练数据，逐步积累学习成果。机器学习的步骤研究数据。选择模型。使用训练数据进行训练（即前面学习算法搜索模型参数值，从而使成本函数最小化的过程）最后，应用模型对新示例进行预测（称为推断），希望模型的泛化结果不错。测试与验证选择是将数据分割成两部分：训练集和测试集。顾名思义，你可以用训练集的数据来训练模型，然后用测试集的数据来测试模型。应对新场景的误差率称为泛化误差（或者样例外误差）。通常将80%的数据用于训练，而保持20%供测试用。学习资料来源：
作者介绍西蒙·斯涅克，著作有《无限的游戏》，《超级激励者》，《团队有你真好》等管理类书籍世界上有两种游戏，一种是有限游戏，一种是无限游戏。而商业游戏就是一场无限的游戏。在这个游戏里没有时间限制，没有终点，更没有输赢。两个生活场景第一个世界：我们屈从于现实，每天在对工作的担忧中醒来，无法安心工作，在生活中挣扎着寻找满足感。这种工作与生活失衡的问题已经严重影响了整个社会。对此，我很好奇，我们有没有另一种可行的选择？另一个世界：大多数人都会在热情中醒来，能安心地在外工作，能带着工作的满足感踏上回家的路。我所提倡的这种改变并非易事，却是有可能实现的。有限与无限有限游戏有限游戏的玩家都是已知的。他们有固定的规则，有一致认同的目标，一旦目标达成，游戏就结束了。有限的游戏需要用有限的思维来思考。就像足球赛，更关注分数，点球率。无限游戏无限游戏则既有已知玩家，也有未知玩家，且没有确切的或一致认同的规则。每个玩家的游戏方式完全由自己决定，可以随时因任何原因而改变。无限的游戏则需要用无限的思维来思考。无限思维的因素下图就给出思考无限思维的模型图。追求崇高的事业参与无限游戏的动机则截然不同，并不是为了赢，而是为了能继续玩下去，是为了推进比我们自身或所在的组织更伟大的事情。若有一项崇高的事业，一个比任何一场特定胜利都更重要的理由，我们的日子就会过得更有意义，过得更有满足感。支持某事的——积极的、乐观的；有凝聚力的——欢迎所有愿意为之做出贡献的人；服务导向的——为了他人的主要利益；有适应力的——能够经受住政治、技术和文化的变迁；理想主义的——宏伟、大胆但最终无法实现。建立彼此信任的团队团队内部能够敞开心怀在一个彼此信任的团队中工作，我们能安心地说出自己的脆弱，可以安心地举手承认自己犯下的错误，坦诚自己的不足，对自己的行为负责并寻求帮助。寻求帮助是表达脆弱的一种方式。在一个彼此信任的团队里，我们敢于寻求帮助，因为我们深信领导或同事会在身边支持我们。业绩与信任处于左上角的低信任、高业绩者会成为团队的毒瘤。这类队员有自恋的特征，会毫不犹豫地指责他人，总是把自己放在第一位。比起低信任、高业绩者，海豹突击队更愿意选择高信任、中业绩者，有时甚至宁愿选择高信任、低业绩者（这是相对而言的）。尊重值得较量的对手透过竞争对手能够让我们看清自己，找到自己的问题点。有时竞争对手也能够帮助我们发展。同时有助于看清从事一份工作的原因。就像苹果公司，值得较量的对手让他们对自己的事业有了更清楚的认识，也让他们的员工更加团结。对手的存在提醒了苹果公司内外的每一个人，让他们始终记得自己所代表的是什么，也就是他们最初进入该行业的原因。事业盲症是指，我们过度投入自己的事业，或是过度专注于寻找其他玩家事业中的“错误”，因而无法看到他们的长处或自己的短处。拥有攸关存亡的变通性攸关存亡的变通性指的是一种能力，为了更有效地推进崇高的事业而对商业模式或战略过程进行极端颠覆的能力。这是无限思维的玩家对不可预测性的理解，这份理解让他们拥有了做出此类改变的能力面对新事物时我们应该采取的态度往往会决定一家企业的存亡，柯达相机可能是最好的例子，他们先研究出来了数码相机，但是企业执着于本身的胶片产业，专注于眼前的利益。最终导致发展越来越差，被其他企业所击败。而看现在，基本上每人的手机都有相机功能，冲洗照片的需求也微乎其微。这个也就是有限思维遮挡了企业发展的道路。表现领导的勇气当今的世界是被有限思维主导，人们更想获得更多收入，更好的短期效果。这也就使得如果使用无限思维会冒更大的风险。特别是当我们站在更高的位置上，我们是否还敢于做出打破常规的决定？领导者的勇气就显得尤为重要，如何做到不顺从大流，依照你自己的内心所向去做出更多的决定。关于无限游戏在教育上面的思考无限思维的子女养育方式与之相反，我们会帮助自己的孩子发现他们的才华，引导他们找到激情所在，并鼓励他们沿着那条路向前走。这意味着，要教孩子懂得服务的价值，教会他们如何交朋友，以及如何与他人打成一片；这意味着，要让孩子懂得教育是持久的，不会因为从学校毕业而结束，教育会贯穿他们的一生，但不一定总有课程或分数的引导；这意味着，要让孩子懂得如何运用无限思维去生活。在这场养育子女的无限游戏中，没有什么贡献是比让孩子能在我们离开后继续成长，继续为他人服务更伟大的了。这也是我一直在不断反思的问题，我们对于孩子的教育到底什么是最重要的？成绩？和其他孩子的对比？培训班里的表现？这些往往都是用有限的思维在思考。而如果用无限思维去想，可能是帮助他们发现自我，离开家庭后继续成长的能力。
最近两个月读书进度有点缓慢。一方面是时间不够，另一方面是心态浮躁，不能静下心来去读。《无缘社会》这本书是最近MBA课程老师在授课时推荐的一本书。整体读下来，感觉生活都有点忧郁了。那什么是无缘社会？就是社会之中，人们之间互相没有关联，各不相干。这本书是日本NHK一个特别节目录制组在拍摄时的记录。记录了日本社会的发展的特定阶段，越来越多的「无依无靠者」。为什么会出现这个现象？社会在发展到一定的阶段，人们对于物的依赖已经超过对于人的依赖后。比如之前的封建社会，人们必须依靠群体去作业，那么人与人的关系必须足够强才能生存发展。而当今的社会，可能有份工作就可以养活自己。而且越来越多的人出现了不想麻烦其他人的想法。读完之后有下面几个特别的感想。1.在读本书前，我以为的这些人可能都是老年人且文化水平低的孤寡老人。实际上，有些人也是大学毕业，甚至工作了一辈子。最奇怪的是，他们有的还是有儿有女的。放在国内来看，这种状况至少目前还不会出现。2.家庭与工作的比重。大部分的人都是将工作放在家庭之前。日本这个国家对于工作的忠诚度的确挺高。有的人一份工作做了一辈子直到退休。而忙碌工作时，却将家庭疏远。导致最后，妻离子散，更无颜面去找后代养老。3.终生不婚越来越多。这个应该是全球都在关注的现象了。个人完全可以依赖自己的能力去独立生活，婚姻不是必需品而是可选项。而且结婚要买房、养老、养娃的开支也远远超过了他们能够承担的。4.直送火葬，即提前和公益组织沟通好，当去世时不去开追悼会。直接送往火葬场。听起来的确很是凄凉。但却也是无奈。这样一个人可以完全依靠自己独立过完这一生。国内还没听说过这种组织的存在。但是如果再过几十年，这样的业务也许会出现。