2023-07
28

跨表查询python版搞定

By xrspook @ 22:30:18 归类于: 烂日记

花了一整天的时间去做python版本的发跨表查询,最终还真的被我做到了,唯一有点小瑕疵的就是出入进度里我还没有实现批次小计。我基本已经想好需要一个什么样的数据处理,但是怎么把那些东西结合起来我还没有一个成熟的思路,估计会有一些类似的案例,我可以参考一下。

之所以这个脚本居然用了一整天,是因为最后我算了一下字数,居然有4000多字。因为我用的是VSCode,所以实际上敲代码已经很高效了,因为几乎所有符号都会配对出现,一旦有手误的地方基本上都会提醒,但是有些东西是VSCode不会提醒我的,比如我要用到pandas各种格式的数据,有些事不能直接用print打印出来的,必须要用个循环才能把那些东西展示出来。如果我用python处理Excel,我会用xlwings进去,然后用pandas。之所以用xlwings,因为这个东西支持Excel的版本比较多,老一点的插件有的只支持xlsx有些不支持xlsb,有些仅仅支持xls,而我选择的这个xlwings基本上我用的Excel格式都支持了。现在我主要用xlsx和xlsb。因为做这个python查询之前,我已经在PQ和PP上做了两遍,所以我完全知道自己要做些什么,但具体那些东西该如何实现,应该用什么样的表达式去实现,是我花时间的地方。

昨天之前我对pandas里面的dataframe并不太熟悉。我知道那个结构很类似于Excel的表格,但实际上用起来又跟表格不太一样。我觉得那个东西最好的地方就是不像PQ那样,经常被高手套叠起来,于是你想半天都搞不懂那到底是什么。作为一个不是python新手的人,我还是喜欢用短语句完成,然后再连接起来。自学python让我觉得最成功的地方在于我喜欢用for循环,而且还非常习惯使用套叠循环。如果在我大二学C语言的时候,我也能把循环玩得这么溜。估计我就不会为冒泡法这种东西发愁了。

虽然花了一整天时间,才终于把这个东西整出来,但我个人感觉还是比较愉快的,尤其是敲代码的过程,因为相对于在Microsoft 365的PQ或PP的编辑器里面敲代码,VSCode里敲代码实在太爽了。PP会经常提醒我公式错误,因为PP那个你看不到的循环实在会把你整得很惨。PQ里我不过是删了个文字,不知道为什么它会自动给我加半边括号,所以搞了半天,我都搞不懂自己到底哪里错了,最后发现不知道为什么,多了个括号,又或者在调整某些语句的时候多了或少了个逗号。英文和中文逗号在编程的世界里是有区别的,在VSCode里可以看得很清楚,但在PQ的高级编辑器里。因为字体太小,你还没办法快捷变大,非常折磨我这种眼睛不太好的老人家。

高中的时候我的数学老师经常一节课就只讲一道题,他会用很多方法把那道题解出来。现在,我也喜欢上了这种别人可能非常难理解的行为。

2023-07
27

PQ为什么不改进

By xrspook @ 8:26:19 归类于: 烂日记

上周开始我就在用Power Query跟Power Pivot做跨表的数据合并。与其说是数据合并,不如说是数据查询。一开始我用的是PQ,因为从感觉上来说好像 PQ做这个就够了,但当我把东西都做出来了以后发现PQ很多规则都非常奇怪。让我觉得要试一下PP到底怎么样。根本原因是明明数据量很少,但是PQ的运行效率却很低,而且运行效果很不稳定。从0-1生成PQ的过程比较挣扎,虽然整体的思路我都有,我知道我要有什么后效果。但是该如何实现还是花费了我不少时间,比如查询参数应该用什么格式的表格表达出来。一开始我把4个日期和3个文本以左右的方式表达。的确这样的取数没有什么问题。虽然实际上PQ是用列去进行各种魔法运算的,但要精确定位到某个单元格也就是某条记录一点问题都没有。后来当我要用PP,那个东西至今我不知道如何在某列混杂着各种内容的单元格里获取我需要的数据。要顺畅用起PP,我得把日期参数跟文本参数拆分为两个表格。文本参数我不是直接给PP用,而先给PQ,所以横的竖的都无所谓。日期参数是直接在PP里做限定,所以必须以PP的规格去设定表格的形式。这仅仅是参数的表达,是最简单的东西。如果以普通人的视角考虑,某一列数据日期和文本混搭一点问题都没有,但是从机器的角度考虑,从我使用的那两个软件的规范考虑,显然这样是不行的,又或者说不是不行,是你为什么非得以一种如此随意的方式去做这么简单的设定呢?混搭的方式,肯定也会得到你想要的结果,但是对软件新手来说,绕那么一大圈显然就比较费劲了。

用PQ和PP的方式做出来的两个查询都能实现我的目标。数据都是没有问题的,但是一个文件体积很大,一个查询时间很长,且查询效率忽高忽低不稳定。这两个都不是我想要的。我不过是想做一个查询而已,很简单的东西,实际上我就只需要一个结果。那个结果以我想要的方式输出,后续的格式化纯粹是让我自己觉得比较顺眼好看而已。但是这两个Microsoft 365内置的Power都不能达到我的预期目标。

在挣扎之前,我觉得应该用PQ实现目标,但实际上出来的效果跟我想象的相差挺远,最根本的原因是我实在不太理解PQ的数据处理。PQ是用来做数据清洗的,所以从某个大表里获取数据,然后进行各种筛选,接着以各种目标形式输出表格,理论上这是很简单的事情。这大表的查询几乎可以这么说,一定是引用外表,因为源数据已经很大,你不可能在上面直接运行,虽然其实一直以来我都是这么干的,但是那个时候我并没有进行跨表操作。从现在的运行效果看来,即便是同一个代表同一个源数据,最终需要以几种方式输出分组筛选后的结果,最终要生成多少个查询效果,我就得把那个源数据查询多少次。理论上怎么会干这么傻的事情呢?直接把大的源数据查询一次缓存起来,往后就不需要调用了。但问题是从我现在的观察看来。最终我要多少个查询结果,他们就同时开始查询多少遍,于是有些时候就会导致有些查询结果失败,你得刷新再来。原因是这个查询正在使用那个源数据,那个查询也在用那个源数据,为了抢那个源数据打架了,抢不赢那个就刷新失败。都是查询一个源数据,我考虑过既然无法避免它们一次又一次查询,那么我就把那几个查询按顺序来,完了一个再到下一个,但实际上这个也是无法控制的。都说VBA是单线程的,但是PQ是多线程的,单线程虽然慢,但是多线程这样打架,最终反而得不到我想要的效果。从理论上说,我把那个大表一开始就缓存起来,后面的都用内存缓存,这很正常啊。我设置查询的优先等级,先刷新一些,然后再刷新另外一些,这也很正常啊,为什么却没有一个很直接的实现方式呢?有些人想到要用VBA去控制PQ的刷新顺序,但是VBA却很难判定某个刷新是不是完毕了,VBA也很难做到这个刷新完毕了再开始下一个。

接下来我要试一下python方案,我的目标是查询时间小于10秒,生成的文件小于100K。

2023-07
21

外部数据查询

By xrspook @ 9:37:46 归类于: 烂日记

近几天都沉醉于做Excel的数据合并,实际上就只是两个表,一个是交易情况另外一个是出入库明细。出入库明细是一个大表,交易情况里面除了交易本身以外还有货款明细以及损溢明细,所以原始表格合计有4个。相对于我之前纠结过的那些东西来说,这几个表有一个数据是必定唯一的,也就是交易情况里面的合同号。损溢明细里一个合同号可能出现多次,货款明细里一个合同号可能会出现多次,出入库明细里一个合同号绝大多数情况会出现多次。所以这些表里,交易情况的合同号是1,其它是多。以前在Excel里面用Power Pivot建立表的关系的时候,我是直接把某一个列拉到另外一个表的列建立关联,但这一次我发现交易情况和损溢明细无论我怎么拉,PP都默认,一是损溢明细,多是交易情况。直到昨天我才知道原来建立表关系的时候是可以不用手拉的。理论上我已经把PP的界面看过一遍又一遍,不仅仅是软件本身,关于它的书我也看过一些,但是好像在昨天之前我就从来没有发现原来有那么个界面。1对多到底谁是一,最重要的一点是哪个表先选定,后选定的表在Excel的Power Pivot里默认是多,但如果二者关系不成立,会建立不了关系。我不知道Excel的PP为什么会这么设定,理论上应该还有1对1,多对多之类的关系,显然在Power BI里面就有,但Excel就是这么神经。用Excel PP默认给的那个1对多的关系,在用透视表的时候,无论如何都得不出我想要的结果,但实际上我想要的那个结果我想了半天也都是合理的。结果手动建立正确的1对多关系后,透视表的数据就正常了。之前,我在Excel的PP上耗了好长时间研究其它东西,之所以有些坎无论如何迈不过,无论如何觉得有毛病我猜是不是也跟这个1对多的关系自动默认给我生成错了。

在玩PP之前,其实我已经折腾了一天的Power Query,之所以从PQ转投PP,是因为我发现虽然我的原数据很简单。最大的那个表才几千行,载入以后进行初次筛选,剩下700多行,另外的那些表只有几行和几十行。但即便这样,它们关联了以后,做全体刷新的时候依然会出现卡顿,依然会偶尔告诉我数据不是我期待的那个格式,所以刷新失败,但实际上当我重新再去刷新失败的那个表,又会成功。在不修改参数的情况下刷新同一个查询,有时都能刷出来,有时一些刷不出来,有时刷的时间要长一点,有时刷的时间挺短,到底这是为什么?各种缓存的参数我都试过了,各种PQ本身设置相关的参数我也试过了,但是PQ自己就是这么不稳定。快的时候可能5秒就出来了,但是慢的时候可能30秒都出不来。折腾了我一天后,当我用PP做出跟PQ完全一样的功能的时候,发现PP的稳定性好很多,几乎不会出现数据刷新失败,大多数情况下,PP刷新需要10秒钟,但是它俩最大的区别在于PQ这个查询文件只有50KB,但是PP的查询文件是800KB,之所以这样,是因为实际上PP把整个原数据都抓过来了。考虑到这些查询文件我肯定会在不同的机器上运行,所以虽然PP可以直接连接某个外部源文件,但我还是选择先在PQ里做一个动态接口,然后再转到PP的模型上,同时在一开始的时候让PQ把3000多条数据出筛成700多条。

10秒钟和不知道到底要多少时间,以及50KB和800KB这两个答案我都不太满意。所以接下来估计我会尝试一下python方案。

2023-07
14

开机黑屏

By xrspook @ 8:44:15 归类于: 烂日记

祸不单行,这种东西真的是会让人觉得很无语。

周日黎明时分开始拉肚子,拉了一整天。到下午4点多的时候回到宿舍,那天的作业5点多已经结束了,所以拖完地我就打算打开电脑把那天的日报做了,但问题是当我想打开宿舍的电脑的时候,却进入不了系统。一开始我以为自己眼花,因为到win10需要我输入账号密码之后,看到我的头像在那里转圈圈,然后就没有然后了,显示屏漆黑一片,什么都没有,我的第一个反应是,难道主机跟显示器连接的HDMI线又松动了吗?漆黑的屏幕,甚至让我不知道到底那是完全没有反应,还是说屏幕就是漆黑一片。一开始的时候我没想过要动鼠标。因为我默认那个是显示器没反应,但接着我又好像发现那是屏幕的画面漆黑一片,所以实际上显示器是亮着的。简直不知道该怎么办,我没想过要按键盘或者鼠标,所以直接把电脑电源键按下去重新启动,结果还是一样,这次我确定肯定不是眼花。接下来我就只好用手机寻找答案。找答案的时候我发现这种情况还不非常罕见,因为有各种对策,首先我发现鼠标是可以动的,同时键盘按下去也是有反应的。当我按下Ctrl+Alt+Del的时候,出现了蓝色的界面。理论上如果是以前的电脑,应该直接就跳出任务管理器,跳出一个蓝色的界面意味着我看到的漆黑一片并不是真的漆黑,只是桌面不知道为什么加载不出来。弹出蓝色界面以后,再点任务管理器,然后在文件那里运行新任务,在那里打开msconfig,在常规那里选择诊断启动。接着电脑进入重启,在登录的时候告诉我无法用pin密码进入系统,那一下我是紧张的,因为我实在不知道密码该是什么,结果发现可能不用pin,我的密码还是那个,但万一不是估计就问题大了,但幸好我还是成功的进入到了桌面,但进入到了桌面以后,我发现所有服务都没有。上网的没有,音频也没有,我能看到的所有服务都运行不了,为什么会这样呢?之所以不知道为什么,是因为我在做系统配置的时候,并没有意识到我点的诊断启动实际上是仅加载基本设备和服务。我的系统可以在不加载其它东西的情况下顺利进入。接下来我就没有做其他的修改,直接在系统配置那里重新又点回正常启动。接着电脑才终于正常进入到平时的界面。我不知道为什么突然间就出现了这么个黑屏的状况。因为在我记忆之中,上一次关电脑是很正常的,没有做什么奇怪的行为。最奇怪的大概就是进行了一次又一次的系统更新和一次又一次重启,当我不想升级win11的时候,那个东西老是弹出来,现在当我想把宿舍的电脑升级为win11的时候,win11的窗口却死活不再提示,所以这到底是怎么回事?

宿舍的电脑突然挂了,我没有办法正常工作,当然会让我觉得很不爽,但是这边宿舍的电脑挂了我依然可以回办公室继续我的工作。所以那个时候我觉得主要是烦而不是慌。但幸好所有的这些郁闷很快就解决掉了,至于为什么会突然间发生这种事情,我无法解释。因为我根本没有做任何的处理,电脑又自己好了。

情况就好像我不知道为什么拉肚子了,然后吃过几次加味藿香正气丸以后,不知道为什么又好了。

2023-06
23

路由器远程穿透?

By xrspook @ 11:16:31 归类于: 烂日记

第一次在宿舍用手机APP跟锐捷X32-PRO连上了以后,我就开始在那里探索APP。进而发现APP的可玩性很差,因为基本上功能都没有展示完全。对一些很基础的客户来说,够了,但是显然我不满足于这些功能。在乱点的过程之中,我发现在首页点击那个路由器,会进入一个比较神奇的界面。里面会有一个全部配置的按钮,进去了以后就进入了路由器的web管理界面,在点击了后会有个重要提示,说隧道创建成功。实际上是从手机APP转到了web的管理界面。那时我并没有考虑清楚这到底是干什么用的。如果我要控制路由器,为什么我要用APP呢?为什么我不直接打开路由器里相应的IP地址然后管理呢?当我复制了上面所提供的那个网址之后,我发现了一串我不知道到底是什么鬼的东西。提示语里说到了隧道,所以是不是如果我人在外面,我的手机没有通过WiFi连接路由器,但我的路由器能上网的,我就可以用手机流量以这种创建隧道的方式远程管理我的路由器呢?如果真的能实现这种隧道的功能,他们也就不需要在手机APP上耗费太多时间,只需要确保管理界面能兼容电脑和手机,因为那可以远程访问,你可以从任意一个地方连上可以联网的路由器。这样就很神奇,这样就再也不会有人吐槽为什么手机APP上面的功能那么少。

X32-PRO的web管理界面手机版和电脑版是有区别的,手机版跟电脑版比起来也是阉割的,所以你在手机APP上获取全部配置,弹出重要提示以后,你可以选择直接打开,又或者是复制网址,把手机的这个网址转到电脑上,再进行进一步的操作。重要提示里面也说到了,在进行这些操作的时候,你不要在手机APP上选择另外一个联机的路由器,如果那样的话,可能你想改的是A路由器,实际上你却改了B路由器。改了谁没改谁,改了什么,最后无论是你还是锐捷的工程师都搞不清了。

对懂行的人来说,这种可以远程到达的管理方式是最省事的,但是为什么一直以来都没有这种操作呢?比如如果你要管理TP-Link的路由器。同一个网址,你在手机上打开跟你在电脑上打开完全不是一回事,但是你却没办法在你的手机上把手机版简单地切换到PC版,锐捷的web管理界面就可以这么做。通过连接路由器的WiFi,然后以网址方式进入web管理界面,很容易就能切换到PC版,但是那个PC版本又不是真的电脑上你看到的那个模式,也是有一点手机化的,但是手机化得不太好,很多东西都堆叠在那里了,你能操作,但你很容易误操作。可想而知,如果你拿的不是一个手机而是一个平板,如果一开始他们默认识别到的是一个安卓系统,没有把你识别成一个大屏幕的平板,你可以通过切换到PC的管理界面进行非常自如的操作。

我不知道现在TP-Link的管理界面怎么样了,但是从网上的各种操作看来,小米MiWiFi路由器管理界面还跟我用小米路由器mini的时候差不了多少,甚至有一些阉割。

换一个牌子的路由器,的确有可能给我带入很多未知的烦恼,但同时也会让我眼界大开。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress