Python

Node js 里有没有像selenium类似的framework?

在Node.js中,有一个类似于Selenium的自动化测试框架叫做Puppeteer。Puppeteer是一个由Google开发的Node.js库,提供了一个API来控制和操作浏览器。它可以用于模拟用户行为、进行页面导航、执行JavaScript、提取数据等等。 Puppeteer具有以下特点: 可以通过无头模式运行,即在没有界面的情况下运行浏览器操作。 可以与Chrome浏览器无缝集成。 支持对页面进行截图和PDF生成。 允许模拟键盘和鼠标输入。 可以进行页面自动化测试和爬虫等任务。 你可以使用Puppeteer来实现类似于Selenium的自动化测试和浏览器操作。它提供了丰富的API,使得控制和操作浏览器变得非常方便。你可以使用Puppeteer来加载网页、填写表单、点击按钮、抓取数据等等操作。 要开始使用Puppeteer,你需要先安装它。可以使用npm(Node.js的包管理器)来安装Puppeteer。在命令行中运行以下命令: 安装完成后,你可以在Node.js脚本中引入Puppeteer并开始使用它。以下是一个简单的示例,展示了如何使用Puppeteer来打开网页并截取页面截图: 这段代码会启动一个无头Chrome浏览器实例,创建一个新的页面,然后导航到指定的网址,并最后保存页面截图为example.png。 这只是Puppeteer的一个简单示例,它还有很多功能和API可以探索。你可以查阅Puppeteer的官方文档来了解更多信息和示例:https://pptr.dev/

用python给文件生成bloom filter

bloom filter是什么? Bloom filter(布隆过滤器)是一种概率型数据结构,用于判断一个元素是否属于一个集合,具有高效的插入和查询操作。它可以快速告诉你某个元素“可能存在”或“一定不存在”于一个集合中,但无法确定元素的确切存在与否。 Bloom filter 由布隆提出并在1970年发表,它基于哈希函数的应用。它的核心是一个位数组(bit array)和一组哈希函数。位数组用于表示集合,初始时所有的位都被置为0。哈希函数用于将元素映射为位数组的索引,并将对应位置的位设置为1。 插入元素时,通过对元素应用一组哈希函数,可以得到多个位数组索引,然后将这些索引对应的位设置为1。查询元素时,同样对元素应用哈希函数,得到相应的位数组索引,如果所有的索引位置的位都为1,则说明元素“可能存在”于集合中;如果任何一个索引位置的位为0,则可以确定元素“一定不存在”于集合中。 由于使用了多个哈希函数和位数组,Bloom filter 具有较低的内存占用和快速的查询速度。然而,它也存在一定的误判率(false positive),即在判断元素存在时可能会出现错误判断。这是因为不同元素的哈希函数映射到位数组时可能产生冲突,导致位数组的某些位置同时被设置为1,从而影响判断结果。 Bloom filter 主要应用于那些对查询速度要求较高、可以容忍一定的误判率的场景,例如网络缓存、大规模数据集的去重、垃圾邮件过滤等。通过适当调整位数组大小和哈希函数的数量,可以在一定程度上控制误判率和内存占用。 bloom filter 和 hash function有什么不同? Bloom filter(布隆过滤器)和哈希函数在使用方式和目的上有一些不同之处: 目的:Bloom filter 的主要目的是判断一个元素是否属于一个集合,它提供了一种快速的判断方式,可以告诉你元素“可能存在”或“一定不存在”于集合中。而哈希函数的主要目的是将数据映射为较短的固定长度值,常用于加密、数据唯一性校验、散列查找等方面。 数据结构:Bloom filter 是一种概率型数据结构,它由一个位数组(bit array)和一组哈希函数组成。位数组用于表示集合,哈希函数用于将元素映射到位数组的索引。哈希函数通常是不可逆的,将输入映射到固定长度的输出。而哈希函数本身并不包含数据结构,它只是一个单独的函数。 功能:Bloom filter 用于判断元素是否属于一个集合,具有高效的插入和查询操作。它可以给出“可能存在”或“一定不存在”的答案,但无法确定元素的确切存在与否。哈希函数则是将数据进行转换和计算,通常用于唯一标识、散列查找、数据完整性校验等。 冲突和误判:Bloom filter 可能存在哈希冲突,即不同元素经过哈希函数计算后映射到相同的位数组位置,这可能导致误判。而哈希函数应该尽量避免冲突,以确保在不同的输入上产生不同的输出,但在实际应用中,哈希冲突是难以完全避免的。 总的来说,Bloom filter 是基于哈希函数的一种数据结构,它利用哈希函数将元素映射到位数组,并通过多次哈希映射来提供快速的元素判断。哈希函数则是独立的计算函数,用于将数据映射为固定长度的值,常用于唯一标识、散列查找、数据完整性校验等场景。 用Python给文件生成bloom…
Read more

怎样计算cosine similarity? Python实例

1 使用Tensorflow / Keras Keras提供的loss function有cosine similarity 输出结果 需要注意的是,Keras算出来的结果是负的。因为它是作为一种loss function,如果2个向量越相似,他们越接近1,所以loss越小,那么Keras就把一般意义上的Consine similarity加了个负号。 2 只使用Raw Python 只用Raw Python写个函数也不难,代码如下 输出结果 这样就没有负数问题了。

旧金山湾区时间与北京时间转换,用python实现时区转换例子

San Francisco Time ?? Beijing Time ?? 把一个时区的时间,比如湾区9:00am,转换成另一个时区的时间,比如北京/香港/新加坡时间,应该是很简单的问题。用Python做时区转换好像挺麻烦的,容易出错。Google出来的前几条结果都不是很让人满意,本文总结我测试过可靠可行不太复杂的方法,以及一些容易出错的地方。 先上可行的Python例子,把三藩(SF)湾区时间9am, 转换成对应的北京时间,用了datetime和pytz。先构造一个湾区时间的对象,然后转化成北京/香港/新加坡时间。 加上注解和debug信息。 可以看到建立的湾区时间时区为-0700而北京时间为0800,可以验证湾区和中国时差为15小时。 时区行话解释 全球标准时间用的是位于英国的格林威治时间(GMT, Greenwich Mean Time)。因为以前格林威治天文台是世界中心,本初子午线或者0度经线就定义为穿过它的经线。然后又有了一个叫世界协调时间的东西(UTC, Coordinated Universal Time)。这个和GMT基本一致,大概就是北京话和普通话的区别吧。北京在Greenwich的东边,时间领先GMT/UTC 8小时,所以叫东八区,代号0800。而湾区在格林威治的西边,时间滞后7个小时(美国国会通过了永久使用夏令时法案),所以叫西7区,代号-0700。而两地时差为7+9=15,北京时间比湾区时间领先15个小时。 同理,日本和韩国位于东9区,代号为0900,那么时间就比为与东八区的中国早1小时。 当地真实时间和约定标准时间 一个地方的真实时间只取决于太阳相对当地的位置,也就是取决于当地经度。但是为了方便,每个国家可以人为规定用什么时间。比如整个中国虽然跨了几个纬度,确人为规定了各地都使用北京时间。新加坡真实时间应该为0655,确规定使用0800,也许是和大中华区保持一致比较方便。 回到Python上,这也正是pytz包的一些坑的来源。pytz用的是地理意义上的真实时间,而人们真正使用的是当地法律约定的时间,这两者是有差别的。 Python datetime不设时区是什么时间? 如果新建一个datetime对象,不设时区的话,会是当地时间。 用epochconverter转换1656658800.0,正是湾区时间2022-07-01 00:00:00 如果replace了timezone,就把底下的timestamp变了,而不是保持timestamp而改变时间表示形式(日期,小时/分/秒)。所以replace(tzinfo=…)并不是做时区变换。而且注意下面例子里上海时间是0806,并不是0800,应该用了地理意义上的真实时间而不是法定时间。这个地理时间在生活中基本没用,这个pytz的坑之一。 参考 Python3中datetime时区转换介绍与踩坑 python datetime时区转换 技巧:用datetime模块处理时区转换,不要用time模块 将UTC、EST时区的时间转化成北京时间(python) pytz库时区的坑(转) The Solution…
Read more

Python Pathlib生存手册,几个短例子极速上手

Pathlib是Python里自带的处理OS路径的library,功能非常强大,可以代替原来的os.path。本文提供几个简单的例子供查询,帮您极速上手,引用到自己的python project里。 创建操作Path对象例子 可以用”/“直接得到下一层目录或文件的Path对象 Home Path对象例子 需要注意的是,Path constructor的参数不认识~。需要用Path.home()。 验证tilda不work 验证Path.home() work 当前目录例子 如果需要当前目录的对象可以用cwd函数或者.加resolve函数 遍历文件夹例子 也就是implement bash命令 用pathlib实现如下 外面函数python_find接受path string,里面的递归函数_python_find接受pathlib.Path object。用iterdir列出当前input path下的所有对象,先打印它们的路径,如果是目录,就继续调用递归函数_python_find打印下一层目录里面的内容。 Pathlib删除文件例子 删除文件 删除目录/文件夹 rmdir只能删除空的文件夹/目录,如果内部还有其他文件或目录会报错。 删除非空目录/文件夹 这个只能自己用上面两个函数用递归实现。这里我增加了显示被删除文件size的信息。 参考 一分钟学一个 Python 标准库之 Pathlib PathLib recursively remove directory? pathlib — Object-oriented filesystem paths…
Read more

安装IBKR python API

到IB官网下载最新API,选Software: TWS API,然后”I Agree” License aggreement。然后选平台,比如TWS API Latest for Mac / Unix。 cd 到下载地址。 根据README.md里说的 具体版本可能有点不一样。我安装的时候README.md里的版本有点过时,不是下载的现有版本。 安装完成后就可以读User’s Guide了。

Python/Pandas实战: 处理IBKR Statement

Python/Pandas实战: 处理盈透Statement

Pandas是一个非常强大的数据分析方面的Python package. 如果是做Machine Learning或者数据分析, 掌握Pandas很省去很多麻烦. 许多Machine Learning前期的数据处理也是用Pandas做得. IBKR(Interactive Brokers, 有时简称IB, 中文叫盈透证券)是美国老牌券商, 也是我的主要使用的券商. 又到了辞旧迎新的时候, 需要看看2020投资收益, 于是趁新年长周末写点小程序做点数据分析. 而这正好覆盖了Pandas的各种常用functions. 下载IB Statement IB Statement提供多种方式下载, 比如html, pdf, csv. 用作数据处理选csv. 内容大概长这样 Statement这个column是内容, 里面有很多项, 而这里我只看“Realized & Unrealized Performance Summary”, 然后相同的第一列后面的列数都是一样的. 上图是Jupyter Lab的显示有问题. 因为文件其实可以看成很多CSV files连在一起, 而第一列可以看成是小csv的文件名. 然后第二列是Header或者Data. Header那行就是告诉你后面的Data行里每一列都是什么….
Read more