分类目录归档:学习

使用Pandas解决数据处理问题

今天星期天,突然接到朋友电话需要帮忙解决数据处理问题。今天要求解的问题,听起来很简单,就是将数据【姓名、日期、金额】中同一个人日期排最后的那一笔数据筛选出来。

最开始使用的是excel处理,使用文心一言帮忙,给出的方案是:
{MAX( IF(姓名列=当前姓名,日期列) )},结果准确。

使用Pandas也进行了一次尝试,果然是python强大,使用更简单的语句就解决了问题。
import pandas as pd # 读取CSV文件
df = pd.read_xls('data.xlsx') # 按照身份证号和支付日期排序
df = df.sort_values(by=['姓名', '日期']) # 根据身份证号分组,并选择每个组的最后一行数据
df = df.groupby('姓名').last().reset_index() # 保存结果到Excel文件
df.to_excel('result.xlsx', index=False)

WEB3.0的一些概念

最近有一个概念很热门,那就是WEB3.0,顾名思义就是第三代互联网。第一代互联网,主要是内容发布型网站,通过网站展示内容,访客只能阅读网站提供的内容;第二代互联网,是指社交类型的网站,任何人都可以在网站上发布信息,发表看法,就像现在非常流行的Facebook、Twitter等,对于这类网站来说,其内容是由用户产生的,而且数据量巨大。

第三代互联网则是跟近些年流行的区块链和虚拟货币紧密结合的技术 ,更强调用户对网站数据和信息的自主权,就是去中心化的互联网,人人都可以发布信息。

关于老马识途的思考

马克思主义哲学讲到直接经验和间接经验是人们获得知识的两条途径,两者是“源”与“流”的关系。很多人学到的知识都是间接经验,是从别人直接经验的基础上获取的。一个人的时间、经历有限,不可能所有东西都要去直接实践以获得知识,很多时候,还是要学习别人,从别人那里获得有用的信息。管仲和隰朋都是非常聪明的人,但是迷路了需要让老马认路,找不见水源了需要通过蚂蚁寻找水源,可见遇到不懂的问题,一定要向别人学习。

【典故】管仲、隰朋跟随齐桓公去讨伐孤竹国,春季出征,冬季返回,迷失了道路。管仲说:“老马的才智可以利用。”就放开老马前行,大家跟随在后,于是找到了路。走到山里没有水喝,隰朋说:“蚂蚁冬天住在山的南面,夏天住在山的北面。地上蚁封有一寸高的话,地下八尺深的地方就会有水。”于是掘地,结果找到了水。凭管仲的智慧和隰朋的聪明,碰到他们不知道的,不惜向老马和蚂蚁学习;现在的人不知道用他们的愚蠢之心去向圣人的智慧学习,不是失误了吗?

 

关于子圉推荐孔子的思考

相传晋平公在位时,平公让祁黄羊推举一位南阳县令,祁黄羊却推举了仇人解狐。平公又请祁黄羊推荐一位军中尉,祁黄羊推荐了自己的儿子祁午。结果解狐和祁午工作都干得不错,祁黄羊也由此成了千古以来内举不避亲,外举不避仇的典范。

举贤荐能是一件复杂的事情,即关系到以后推荐对象能不能做好工作,也关系到自己的切身利益。像祁黄羊那样完全出于公心,需要有很高的觉悟,更多地情况下,还是多多少少考虑自身利益的。《韩非子·说林上》中讲到了子圉推荐孔子的故事,最终因为孔子太优秀了,怕推荐后遮住了自己的光芒,而放弃推荐。

【原文】子圉见孔子于商太宰。孔子出,子圉入,请问客。太宰曰:”吾已见孔子,则视子犹蚤虱之细者也。吾今见之于君。”子圉恐孔子贵于君也,因谓太宰曰:”君已见孔子,亦将视子犹蚤虱也。”太宰因弗复见也。

【翻译】子圉把孔子引见给宋国太宰。孔子走后,子圉进来,询问太宰对孔子的看法。太宰说:“我见过孔子之后,再看你就像渺小的跳蚤虱子一样了。我现在就把他引见给君主。”子圉怕孔子被君主看重,因而告诉太宰说:“君主见过孔子后,也会把你看作如同跳蚤虱子一般了。”于是太宰不再向宋君引见孔子。

windows系统C盘满了如何扩容

电脑一直使用的是win7系统,最近遇到了一个问题,C盘满了,无论打开什么应用,甚至使用word或excel都会提示磁盘满了,要清理空间。不知合适windows系统占用的空间越来越大了,记得第一台笔记本C盘分区只有10G,使用xp一点问题都没有,现在win7系统,C盘分配40G都不够用了。

实在没有什么软件可以卸载了,于是想到了对C盘扩容。第一次尝试,用系统自带的磁盘管理器,计划将D盘删除分区,然后分配给C盘,但是尝试失败,在给C盘扩展的时候,选项是灰色的。第二次尝试,使用第三方分区工具,经过搜索了解到一款分区工具“奥梅分区助手”,首先将D盘调整分区,缩小;然后调整C盘的分区,扩大到刚才D盘缩小的空间。

通过“奥梅分区助手”成功进行了分区,执行之后重启,C盘扩展到了100G,再也不用对C盘满了发愁了。

CSV双字符分隔符数据导入数据库的尝试

CSV是逗号分隔符文件,各列数据使用逗号作为分隔符,通用性较强,无论是记事本、EXCEL、各种文本处理工具或者数据库都能处理。曾经遇到过这样的问题,将某CSV文件数据导入数据库处理,该CSV文件分隔符不是逗号,而是两个字符||,为了解决这个问题,进行了一些尝试,成功导入了数据库。现对这些方法进行记录,以供以后使用。

一、该CSV原始数据的特点

接触到的CSV数据是从其他数据库导出的,各列使用双字符||作为分隔符,第一行为标题,但是导出设置应该有问题,例如空列没有任何标记,也就是说存在||||两次分隔符相连的情况,不太规范。

因此最开始尝试用EXCEL打开数据,先看看整体情况时,如果可行的话,将该EXCEL数据直接导入数据库,此方法尝试失败。EXCEL数据分列时有选项“连续分隔符作为单个处理”,由于数据中空列没有任何标记,将连续分隔符作为单个处理显然行不通,会把连续4个、6个、8个等等视为一个。

二、将双分隔符替换成单字符

之后,尝试了一种新方法,将双字符整体替换成单字符,这样直接导入数据库就不存在问题了。计划将分隔符替换成逗号,首先在整个CSV文件中查询不存在逗号,替换掉之后,数据完全变成了逗号分隔符文件,该方法成功。

三、先创建表结构再导入

数据库使用的是MariaDb,客户端是系统自带的HeidiSql,导入CSV数据时,能自动识别标题和数据。其实,在尝试上面的方法时,想过直接导入数据库,分隔符输入||,但是不知为何一直出错。如果使用上面的方法,将数据变成逗号分隔符文件,再直接导入数据库,不存在什么问题。

但是,如果数据量比较大,无法替换成常见的单字符时,如何解决?所以还是要想一个终极解决办法。经过尝试,先在数据库中建立表结构,然后导入CSV数据,并将分隔符输入||,成功导入。注意,前面尝试过直接导入CSV,自动识别标题,失败了。这次能成功,是因为提前建立了表结构。

一次较大规模数据处理的经历 EXCEL版

前一段时间写了一篇文章《一次较大规模数据处理的经历 PYTHON版》,尝试使用PYTHON和PANDAS解决较大规模数据的计算问题,近百万条数据如果使用EXCEL处理,速度比较慢,而且对于复杂的计算,还需要借助VBA程序,因此上次使用了PYTHON。但是EXCEL的优点不容忽视,比如简单直观,能够快速筛选、汇总等等,最终生成报表还得使用EXCEL,此次打算用EXCEL重新处理一遍数据,并寻找合适的方法避免EXCEL的缺点,使得EXCEL能够快速地处理较大规模的数据。

接之前的问题,数据规模在百万条,CSV格式,需要对数据进行计算,根据前三列数据的不同,公式分成四组,均类似于电费的阶梯电价计算方案,只不过具体标准不一样,【问题一】需要计算最终值;【问题二】后面还提出了一种探索的算法,即计算公式增加“次数”的条件,每一次的计算公式又不一样。

【问题一】针对该问题,最初使用if嵌套公式,发现嵌套起来复杂,而且复制公式时,机器非常卡,即使关闭了自动计算亦是如此。于是决定使用VBA编写程序解决,分为两部分:一是分段计算函数;二是调用的主函数。解决问题的思路是通过VBA计算数据,此时表中的数据结果是静态的,没有任何公式,因此避免了卡顿的问题。 继续阅读一次较大规模数据处理的经历 EXCEL版

一次较大规模数据处理的经历 PYTHON版

前一段时间遇到了一次数据处理的问题,原始数据是CSV数据(逗号分隔),近百万条,要根据不同的公式对每一条进行计算。在使用EXCEL进行计算时,只要一动就会重新计算,而且时常出现无响应的状态,有好几次强行关闭导致重头再来。

考虑到数据量大,使用EXCEL计算可能不适合,才导致不停地死机。最初打算使用数据库来计算,没有数据量的限制,在查询和更新的时候速度很快。但是每一行计算的时候,对于结果不是简单地赋值,而是分段乘以比例再累加计算(类似于电费阶梯计算),思来想去,不知道如何使用SQL语句实现,有可能需要很多个不同的语句。与其这么麻烦,不如写程序来实现,于是打算使用现在很流行的PYTHON语言来处理,一是简单易学,二是有丰富的模块,说不定就有解决该问题的方法。

经过了解,有一个模块PANDAS能够方便的处理CSV数据,而且非常灵活,打算试一试,最终成功解决了问题,现将过程记录以便以后再使用。 继续阅读一次较大规模数据处理的经历 PYTHON版

PYTHON学习之sorted函数

PYTHON是一种非常灵活的语言,可以用来快速开发,语言简洁,而且功能强大,最近在处理数据时遇到了排序的问题,使用了SORTED函数,不得不感叹PYTHON的强大。

问题描述:遍历输出一个字典数据,输出前按照KEY的第9至12位数据进行排序。

第一步,认识sorted函数

Sorted可以对所有的可迭代对象进行排序,在PYTHON中,list、tuple、set、dict等数据结构都是可迭代的对象,因此都可以使用sorted函数进行排序,尤其是要进行遍历输出的时候,非常方便。sorted的语法是:

sorted(iterable, key=None, reverse=False)

iterable是可迭代的对象,key是排序的关键字,reverse是排序的顺序,默认是升序

第二步,认识lambda函数

lambda是匿名函数,不用单独定义,使用起来方便,正常的函数必须先定义,再使用。而lambda只用简单定义,即可实现一个函数的功能。

常规函数的定义和使用:

def sum(x,y):
    return x+y

result=sum(5,3)

使用lambda定义匿名函数:

sumFunc=lambda x,y:x+y
result=sumFunc(5,3)

第三步,解决问题

所要排序的数据时一个字典,排序的依据是KEY中的第9至12位数据,然后输出字典里面的数据。

for item in sorted(myDict,key=lambda item:item[9:12])
    print(item,myDict[item])

电子投标回执中的文件指纹或唯一码验证

电子投标不同于纸质投标,纸质投标打印、盖章等一系列环节都能够用眼睛看到,发现了过去也能够修改。但是电子标就不同了,一切操作都在电脑中进行,不如纸质标有把握,就比如说上传投标文件之后,有没有怀疑传错了文件之类的想法?今天就来说说这个问题,以及解决办法。

解决该问题最好的办法就是在电脑上保留唯一的投标文件材料,在电子标书制作过程中,可能保留很多副本,盖章以及生成最终的投标文件时,也可能为了测试,电脑上保存了很多副本。这样的行为很常见,比如此次测试时将电子投标文件保存到了一个地方,下一次再生成时,又放在了另一个地方。切记,不要在电脑上保存多个副本,有时候选择的时候,文件名一样,如果不注意路径,很可能就选错了。

那么上传之后,如何核实该文件跟本地的文件一致呢?答案很简单,就是利用文件指纹验证。大部分系统上传投标文件时,都会有打印回执的地方,回执里面显示了上传的时间,名称等信息,最后面还一个文件指纹或者唯一码,利用该信息就能够验证上传的是否跟本地是同一个文件。

文件指纹是一串大写字母或数字组成的字符串,相同内容生成的文件指纹一样。因此我们只需要将本地投标文件生成文件指纹,然后对比就可以了。生成文件指纹的简单方法是:

第一步,按WIN+R键,运行CMD,打开命令行工具,然后进入投标文件保存的地址。

第二步,生成文件的指纹,常见的是MD5编码或者是SHA编码,具体命令如下:
certutil.exe -hashfile filename -MD5
certutil.exe -hashfile filename -SHA1
certutil.exe -hashfile filename -SHA256
filename就是相应的文件名称。