标签归档:Python

Python 教你3分钟用Bert搭建问答搜索引擎

 

鼎鼎大名的 Bert 算法相信大部分同学都听说过,它是Google推出的NLP领域“王炸级”预训练模型,其在NLP任务中刷新了多项记录,并取得state of the art的成绩。

但是有很多深度学习的新手发现BERT模型并不好搭建,上手难度很高,普通人可能要研究几天才能勉强搭建出一个模型。

没关系,今天我们介绍的这个模块,能让你在3分钟内基于BERT算法搭建一个问答搜索引擎。它就是 bert-as-service 项目。这个开源项目,能够让你基于多GPU机器快速搭建BERT服务(支持微调模型),并且能够让多个客户端并发使用。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install bert-serving-server  # 服务端
pip install bert-serving-client  # 客户端

请注意,服务端的版本要求:Python >= 3.5Tensorflow >= 1.10 。

此外还要下载预训练好的BERT模型,在 https://github.com/hanxiao/bert-as-service#install 上可以下载,如果你无法访问该网站,也可以在 bert-serving 模型及源代码 此处下载。

也可在Python实用宝典后台回复 bert-as-service 下载这些预训练好的模型。

下载完成后,将 zip 文件解压到某个文件夹中,例如 /tmp/uncased_L-24_H-1024_A-16/.

2.Bert-as-service 基本使用

安装完成后,输入以下命令启动BERT服务:

bert-serving-start -model_dir /tmp/uncased_L-24_H-1024_A-16/ -num_worker=4 

-num_worker=4 代表这将启动一个有四个worker的服务,意味着它最多可以处理四个并发请求。超过4个其他并发请求将在负载均衡器中排队等待处理。

下面显示了正确启动时服务器的样子:

使用客户端获取语句的编码

现在你可以简单地对句子进行编码,如下所示:

from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['First do it', 'then do it right', 'then do it better'])

作为 BERT 的一个特性,你可以通过将它们与 |||(前后有空格)连接来获得一对句子的编码,例如

bc.encode(['First do it ||| then do it right'])

远程使用 BERT 服务

你还可以在一台 (GPU) 机器上启动服务并从另一台 (CPU) 机器上调用它,如下所示:

# on another CPU machine
from bert_serving.client import BertClient
bc = BertClient(ip='xx.xx.xx.xx')  # ip address of the GPU machine
bc.encode(['First do it', 'then do it right', 'then do it better'])

3.搭建问答搜索引擎

我们将通过 bert-as-service 从FAQ 列表中找到与用户输入的问题最相似的问题,并返回相应的答案。

FAQ列表你也可以在 Python实用宝典后台回复 bert-as-service 下载。

首先,加载所有问题,并显示统计数据:

prefix_q = '##### **Q:** '
with open('README.md') as fp:
    questions = [v.replace(prefix_q, '').strip() for v in fp if v.strip() and v.startswith(prefix_q)]
    print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split()) for d in questions])))
    # 33 questions loaded, avg. len of 9

一共有33个问题被加载,平均长度是9.

然后使用预训练好的模型:uncased_L-12_H-768_A-12 启动一个Bert服务:

bert-serving-start -num_worker=1 -model_dir=/data/cips/data/lab/data/model/uncased_L-12_H-768_A-12

接下来,将我们的问题编码为向量:

bc = BertClient(port=4000, port_out=4001)
doc_vecs = bc.encode(questions)

最后,我们准备好接收用户的查询,并对现有问题执行简单的“模糊”搜索。

为此,每次有新查询到来时,我们将其编码为向量并计算其点积 doc_vecs;然后对结果进行降序排序,返回前N个类似的问题:

while True:
    query = input('your question: ')
    query_vec = bc.encode([query])[0]
    # compute normalized dot product as score
    score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
    topk_idx = np.argsort(score)[::-1][:topk]
    for idx in topk_idx:
        print('> %s\t%s' % (score[idx], questions[idx]))

完成!现在运行代码并输入你的查询,看看这个搜索引擎如何处理模糊匹配:

完整代码如下,一共23行代码(在后台回复关键词也能下载):

import numpy as np
from bert_serving.client import BertClient
from termcolor import colored

prefix_q = '##### **Q:** '
topk = 5

with open('README.md') as fp:
    questions = [v.replace(prefix_q, '').strip() for v in fp if v.strip() and v.startswith(prefix_q)]
    print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split()) for d in questions])))

with BertClient(port=4000, port_out=4001) as bc:
    doc_vecs = bc.encode(questions)

    while True:
        query = input(colored('your question: ', 'green'))
        query_vec = bc.encode([query])[0]
        # compute normalized dot product as score
        score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
        topk_idx = np.argsort(score)[::-1][:topk]
        print('top %d questions similar to "%s"' % (topk, colored(query, 'green')))
        for idx in topk_idx:
            print('> %s\t%s' % (colored('%.1f' % score[idx], 'cyan'), colored(questions[idx], 'yellow')))

够简单吧?当然,这是一个基于预训练的Bert模型制造的一个简单QA搜索模型。

你还可以微调模型,让这个模型整体表现地更完美,你可以将自己的数据放到某个目录下,然后执行 run_classifier.py 对模型进行微调,比如这个例子:

https://github.com/google-research/bert#sentence-and-sentence-pair-classification-tasks

它还有许多别的用法,我们这里就不一一介绍了,大家可以前往官方文档学习:

https://github.com/hanxiao/bert-as-service

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

股市市盈率分析:A股与美股之间的差异(附Python代码)

股市市盈率分析:A股与美股之间的差异

股市市盈率是衡量股票相对估值的重要指标之一。A股是中国的股票市场,而美股是美国的股票市场。尽管两国的股票市场都使用市盈率来评估股票的估值,但A股与美股之间存在着一些显著的差异。本文旨在分析这些差异的原因,并评估重要因素对A股与美股市盈率差异的影响。

股市市盈率分析:A股与美股之间的差异的原因分析

1. 经济发展水平

A股和美股所代表的经济发展水平存在差异,这是影响两者市盈率差异的重要因素之一。美国是全球最大的经济体之一,拥有发达的金融市场和大量的高科技企业,使得美股的市盈率相对较高。而A股市场相对较年轻,国内经济相对不发达,因此A股的市盈率普遍较低。

2. 法律法规差异

法律法规对股票市场的监管具有重要影响。美国的股票市场监管相对成熟,有严格的法律法规体系保护投资者权益,使得美股市盈率相对较高。相比之下,A股市场的监管相对较弱,法律法规体系仍在完善中,这导致了A股市盈率相对较低。

3. 投资者结构

A股和美股的投资者结构也是市盈率差异的一个重要原因。美股市场有大量的机构投资者,如养老基金、对冲基金等,这些机构投资者通常具有较高的投资能力和更长的投资周期,从而推高了市盈率。相比之下,A股市场的散户投资者占比较高,他们的投资能力和投资效用往往较低,因此A股的市盈率相对较低。

4. 市场流动性

市场流动性也是影响市盈率差异的重要因素之一。美股市场交易活跃,流动性较高,这使得市场能够更快地反应投资者的情绪和预期,从而推高了市盈率。与之相比,A股市场的流动性相对较低,交易活跃度不高,导致市盈率相对较低。

5. 市值结构差异

A股和美股的市值结构也对市盈率差异产生影响。美股市值较大的科技公司比例较高,而这些公司通常拥有较高的市盈率。相比之下,A股市场以制造业和金融业为主,这些行业的市盈率普遍较低,因此导致了A股的市盈率相对较低。

6. 财务质量和盈利能力

公司的财务质量和盈利能力也是影响市盈率差异的重要因素。美股市场上的公司普遍拥有较高的财务质量和盈利能力,从而使得市盈率相对较高。而A股市场上的公司财务质量和盈利能力相对较低,导致市盈率较低。

7. 技术驱动与传统产业比例

美股市场有较高比例的技术驱动型公司,而这些公司往往拥有较高的市盈率。相反,A股市场以传统产业为主导,这些行业的市盈率普遍较低,因此导致了A股的市盈率相对较低。

8. 宏观经济因素

宏观经济因素也会对市盈率差异产生影响。美国的宏观经济相对稳定,这使得美股市盈率相对较高。与之相比,中国的宏观经济相对不稳定,因此A股市盈率相对较低。

9. 盈利预期差异

不同投资者对未来盈利预期的差异也会影响市盈率差异。美股市场上的投资者普遍对公司未来盈利有较高的预期,从而推高了市盈率。而A股市场上的投资者对盈利预期较为保守,因此A股的市盈率相对较低。

10. 其他因素

除上述因素外,还有一些其他因素也会对A股与美股市盈率差异产生影响,如政策因素、人口因素等。

重要因素对A股与美股市盈率差异的影响评估

通过分析上述差异的原因,可以得出以下评估:

首先,经济发展水平是影响A股与美股市盈率差异的重要因素之一。随着中国经济的不断发展,A股市盈率有望逐渐提升。

其次,加强法律法规建设和市场监管是提高A股市盈率的关键。完善法律法规体系,保护投资者权益,将有助于提高A股市盈率。

此外,提升A股市场的流动性和吸引更多机构投资者参与也是提高A股市盈率的重要途径。加大市场宣传力度,改革市场交易机制,将有助于提高A股市盈率。

最后,提高公司财务质量和盈利能力,引入更多高科技企业,将有助于提高A股市盈率。

综上所述,A股与美股市盈率之间存在着多个因素的差异。通过深入分析这些差异的原因,我们可以更好地理解为什么A股与美股之间存在市盈率差异,并评估了重要因素对差异产生的影响。进一步改善A股市场的监管、流动性和财务状况,有助于提高A股市盈率,推动中国股市的健康发展。

Python计算市盈率代码解析

计算市盈率需要使用两个关键数据:公司的市值(Market Cap)和公司的净利润(Net Profit)。市值是指公司的市场价值,即公司的总市值。净利润是指公司在一定时期内的净收入,即公司的盈利。下面是Python中计算市盈率的代码示例:

def calculate_pe_ratio(market_cap, net_profit):
    pe_ratio = market_cap / net_profit
    return pe_ratio

# 示例用法
market_cap = 1000000000  # 市值为10亿美元
net_profit = 50000000  # 净利润为5000万美元
pe_ratio = calculate_pe_ratio(market_cap, net_profit)
print("市盈率为:", pe_ratio)

上述代码中,calculate_pe_ratio函数接受市值和净利润作为参数,并计算出市盈率。市盈率的计算方法是将市值除以净利润。函数返回计算得到的市盈率值。在示例中,我们假设公司的市值为10亿美元,净利润为5000万美元,通过调用calculate_pe_ratio函数,我们可以得到市盈率的值。

OpenAI又一神器!Whisper 语音转文字手把手教程

语音转文字在许多不同领域都有着广泛的应用,其中一些应用与金钱相关。以下是一些例子:

1.字幕制作:语音转文字可以帮助视频制作者快速制作字幕,这在影视行业和网络视频领域非常重要。通过使用语音转文字工具,字幕制作者可以更快地生成字幕,从而缩短制作时间,节省人工成本,并提高制作效率。

2.法律文书:在法律领域,语音转文字可以帮助律师和律所将听证会、辩论和其他法律活动的录音转化为文字文档。这些文档可以用于研究、起草文件和法律分析等目的,从而提高工作效率。

3.医疗文档:医疗专业人员可以使用语音转文字技术来记录病人的医疗记录、手术记录和其他相关信息。这可以减少错误和遗漏,提高记录的准确性和完整性,为患者提供更好的医疗服务。

4.市场调查和分析:语音转文字可以帮助企业快速收集和分析消费者反馈、电话调查和市场研究结果等数据。这可以帮助企业更好地了解其目标受众和市场趋势,从而制定更有效的营销策略和商业计划。

总之,语音转文字技术在许多不同的行业和场景中都有着广泛的应用,可以提高工作效率、减少成本和错误,并为企业和个人带来更多商业价值。

语音转文字是一项重要的技术,但市场上大部分语音转文字工具存在诸多问题。很多人会遇到付费工具难用的情况,效果非常差。如果你需要高效而准确的语音转文字解决方案,你应该考虑使用Whisper。下面是whisper的一段转换示例:

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2023/04/2023042306165455.wav
", ".join([i["text"] for i in result["segments"] if i is not None])
# Out[12]: '我赢了啊你说你看到没有没有这样没有减息啊我们后面是降息, 你不要去博这个东西, 我真是害怕你啊, 你不要去博不确定性, 是不是不确定性是我们的敌人, 听到没有朋友们, 好吧, 来朋友们, 你们的预约点好了啊, 朋友们, 你们的预约一定要给我点好了吧, 晚上八点钟是准时开播的, 朋友们关注点好了, 我们盘中视频见啊, 朋友们大家再见'

可以看到,即便是语速这么快的情况下,Whisper 依然实现了近乎完美的转换。

在接下来的教程中,我们将介绍如何使用Whisper来轻松地完成语音转文字任务。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install openai-whisper

此外你还需要安装ffmpeg:

安装ffmpeg

Mac (打开终端(Terminal), 用 homebrew 安装):

brew install ffmpeg --with-libvorbis --with-sdl2 --with-theora

Linux:

apt-get install ffmpeg libavcodec-extra

Windows:

1. 进入 http://ffmpeg.org/download.html#build-windows,点击 windows 对应的图标,进入下载界面点击 download 下载按钮,
2. 解压下载好的zip文件到指定目录
3. 将解压后的文件目录中 bin 目录(包含 ffmpeg.exe )添加进 path 环境变量中
4. DOS 命令行输入 ffmpeg -version, 出现以下界面说明安装完成:

2.使用Whisper进行语音转文字

简单的使用例子:

import whisper
whisper_model = whisper.load_model("large")
result = whisper_model.transcribe(r"C:\Users\win10\Downloads\test.wav")
print(", ".join([i["text"] for i in result["segments"] if i is not None]))

首先,我们建议使用Whisper的large-v2模型。根据我的实测结果,这个模型的表现非常优秀,它可以识别多种语言,包括中文,而且中文识别效果非常出色。在某些文字转换的场景中,它的表现甚至优于腾讯云、阿里云。

如果你无法下载到模型,可以用我们的模型镜像下载地址:https://pythondict.com/download/openai-whisper-large-v2/

使用前将模型文件放到指定位置:

Windows: C:\Users\你的用户名\.cache\whisper/large-v2.pt

Linux/MacOS: ~/.cache/whisper/large-v2.pt

然后重新运行程序即可得到转换结果。比如我们转换下面这个音频:

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2023/04/2023042306165455.wav

效果如下:

import whisper
whisper_model = whisper.load_model("large")
result = whisper_model.transcribe(r"C:\Users\win10\Downloads\test.wav")
print(", ".join([i["text"] for i in result["segments"] if i is not None]))
# 我赢了啊你说你看到没有没有这样没有减息啊我们后面是降息, 你不要去博这个东西, 我真是害怕你啊, 你不要去博不确定性, 是不是不确定性是我们的敌人, 听到没有朋友们, 好吧, 来朋友们, 你们的预约点好了啊, 朋友们, 你们的预约一定要给我点好了吧, 晚上八点钟是准时开播的, 朋友们关注点好了, 我们盘中视频见啊, 朋友们大家再见

此外,不建议一次性转换长音频。如果你要转换长度很长的音频,建议先做切割并降低码率。

3.Whisper转换结果分析

Whisper的生成结果是一个字典:

{'text': '我赢了啊你说你看到没有没有这样没有减息啊我们后面是降息你不要去博这个东西我真是害怕你啊你不要去博不确定性是不是不确定性是我们的敌人听到没有朋友们好吧来朋友们你们的预约点好了啊朋友们你们的预约一定要给我点好了吧晚上八点钟是准时开播的朋友们关注点好了我们盘中视频见啊朋友们大家再见', 'segments': [{'id': 0, 'seek': 0, 'start': 0.0, 'end': 4.8, 'text': '我赢了啊你说你看到没有没有这样没有减息啊我们后面是降息', 'tokens': [50364, 1654, 5266, 95, 2289, 4905, 42405, 16529, 4511, 17944, 17944, 21209, 17944, 6336, 237, 26460, 4905, 15003, 13547, 8833, 1541, 47421, 26460, 50604], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 1, 'seek': 0, 'start': 4.8, 'end': 6.7, 'text': '你不要去博这个东西', 'tokens': [50604, 2166, 11962, 6734, 5322, 248, 15368, 38409, 16220, 50699], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 2, 'seek': 0, 'start': 6.7, 'end': 8.2, 'text': '我真是害怕你啊', 'tokens': [50699, 1654, 6303, 1541, 14694, 21164, 2166, 4905, 50774], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 3, 'seek': 0, 'start': 8.2, 'end': 10.9, 'text': '你不要去博不确定性', 'tokens': [50774, 2166, 11962, 6734, 5322, 248, 1960, 38114, 106, 12088, 21686, 50909], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 4, 'seek': 0, 'start': 10.9, 'end': 13.200000000000001, 'text': '是不是不确定性是我们的敌人', 'tokens': [50909, 23034, 1960, 38114, 106, 12088, 21686, 1541, 15003, 1546, 7017, 234, 4035, 51024], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 5, 'seek': 0, 'start': 13.200000000000001, 'end': 14.4, 'text': '听到没有朋友们', 'tokens': [51024, 31022, 4511, 17944, 19828, 9497, 51084], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 6, 'seek': 0, 'start': 14.4, 'end': 15.1, 'text': '好吧', 'tokens': [51084, 40221, 51119], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 7, 'seek': 0, 'start': 15.1, 'end': 15.6, 'text': '来朋友们', 'tokens': [51119, 6912, 19828, 9497, 51144], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 8, 'seek': 0, 'start': 15.6, 'end': 17.0, 'text': '你们的预约点好了啊', 'tokens': [51144, 29806, 1546, 12501, 226, 16853, 99, 12579, 12621, 4905, 51214], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 9, 'seek': 0, 'start': 17.0, 'end': 17.3, 'text': '朋友们', 'tokens': [51214, 19828, 9497, 51229], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 10, 'seek': 0, 'start': 17.3, 'end': 18.900000000000002, 'text': '你们的预约一定要给我点好了吧', 'tokens': [51229, 29806, 1546, 12501, 226, 16853, 99, 48161, 49076, 12579, 12621, 6062, 51309], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 11, 'seek': 0, 'start': 18.900000000000002, 'end': 21.0, 'text': '晚上八点钟是准时开播的', 'tokens': [51309, 50157, 33453, 12579, 50064, 1541, 6336, 228, 15729, 18937, 49993, 1546, 51414], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 12, 'seek': 0, 'start': 21.0, 'end': 22.6, 'text': '朋友们关注点好了', 'tokens': [51414, 19828, 9497, 28053, 26432, 12579, 12621, 51494], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 13, 'seek': 0, 'start': 22.6, 'end': 24.1, 'text': '我们盘中视频见啊', 'tokens': [51494, 15003, 5419, 246, 5975, 40656, 39752, 23813, 4905, 51569], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 14, 'seek': 0, 'start': 24.1, 'end': 25.400000000000002, 'text': '朋友们大家再见', 'tokens': [51569, 19828, 9497, 6868, 44176, 51634], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}], 'language': 'zh'}

text参数是没有做任何分词处理的纯语音原文本。

我们要重点关注的是segments参数。segments参数对音频内人物语言做了”分段”操作,比如这一段话:

{
  'id': 1,
  'seek': 0, 
  'start': 4.8, 
  'end': 6.7,
  'text': '你不要去博这个东西', 
  'tokens': [50604, 2166, 11962, 6734, 5322, 248, 15368, 38409, 16220, 50699],
  'temperature': 0.0, 
  'avg_logprob': -0.2088493855794271,
  'compression_ratio': 1.649402390438247, 
  'no_speech_prob': 0.5881261825561523
}

它就相当于人一样,去一帧帧校对每个词说话的时间:start是起始时间,end是结束时间。即”你不要去博这个东西”发生在音频的4.8秒到6.7秒之间。其他参数:

temperature 是指在语音转文本模型生成结果时,控制输出随机性和多样性的参数。

avg_logprob参数是语音转文字模型预测的置信度评分的平均值。

compression_ratio参数是指音频信号压缩的比率。

no_speech_prob参数是指模型在某段时间内检测到没有语音信号的概率。

重点在于如何应用。start和end参数你可以用来直接生成视频的字幕。大大提高生产效率。

置信度参数你可以用来提高识别准确率,如果说置信度一直不高,可以单独拎出来人工优化。

总之,Whisper的Large-v2模型绝对是目前中文语音转文字的顶级存在,有兴趣的朋友赶紧试试吧。

模型镜像下载地址:https://pythondict.com/download/openai-whisper-large-v2/

如果你存在算力计算或使用上的困难,也可以私信联系我帮你处理。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

关于shortcut learning,是否可以用于股市数据?

什么是shortcut learning(快捷学习)

快捷学习(shortcut learning)是指神经网络在训练期间使用某些特定的捷径(shortcut)来完成任务,而这些捷径可能并没有真正理解任务的本质,而是通过记忆一些特定的输入-输出对来完成任务。这种学习方式可能会导致过拟合问题,并且对于新的输入数据可能会产生不准确的预测。

例如,在图像分类任务中,一个神经网络可能会倾向于使用一些表面特征(如颜色或形状)来判断图像属于哪个类别,而没有真正理解该类别的本质特征。这样的模型可能会在训练集上表现出色,但在测试集上的表现可能会受到影响,因为测试集中可能包含了一些不同于训练集的样本。

为了解决快捷学习问题,一些方法包括增加训练数据,使用正则化技术(如dropout),以及设计更复杂的神经网络架构等。

shortcut learning 适合哪些场景

快捷学习通常适用于一些具有高度结构化和规则化特征的任务,例如语音识别、图像分类和机器翻译等。在这些任务中,数据的结构和规律性可以被网络用来发现一些规则和模式,以加速学习过程。此外,快捷学习在一些数据较少的任务中也可以得到较好的表现,因为模型可以从有限的数据中学习并利用一些常见的输入-输出模式来加快训练速度。

但是,快捷学习也存在一些问题,如过拟合和对新数据的泛化性能不佳等问题。因此,在应用快捷学习技术时需要谨慎选择并结合其他方法来提高模型的泛化性能和稳健性。

股市分类问题通常是一个高度复杂和非线性的问题,由于股票市场的复杂性,快捷学习可能并不适合用于该领域的任务。

shortcut learning 适合股市的分类问题吗

股票市场的特征和趋势是难以预测和解释的,因此需要更深入和细致的分析和建模。相反,快捷学习更适合处理具有明显规则和结构的数据,例如语音、图像和自然语言处理等领域。

在股票市场的分类问题中,需要考虑各种不同的影响因素,例如市场走势、经济政策、公司业绩等等。因此,更适合使用一些复杂的深度学习方法来处理这些数据,例如循环神经网络(RNN)和卷积神经网络(CNN)。这些方法可以更好地捕捉到不同特征之间的复杂关系,并提高模型的泛化性能。

比如对于450W数据量的股市数据,由于数据量较大,可以考虑使用一些比较复杂的深度学习模型来进行建模。以下是几种可能适合的模型:

  1. 卷积神经网络(CNN):CNN适用于处理图像等具有空间结构的数据,可以学习到数据中的空间特征。在股票数据中,也可以将数据视为二维数据,其中一个维度表示时间,另一个维度表示不同的特征(如开盘价、收盘价等)。通过使用CNN,可以从这些二维数据中学习到时间序列上的模式,以及不同特征之间的关系。
  2. 长短时记忆网络(LSTM):LSTM适用于处理序列数据,能够捕捉到时间序列上的长期依赖关系。在股票数据中,LSTM可以用于学习和预测未来的股价走势。通过使用LSTM,可以从历史数据中学习到市场的趋势和规律,以及不同特征之间的关系,以便进行未来的预测。
  3. 注意力机制(Attention):注意力机制是一种可以自动学习不同特征之间的权重分配的技术。在股票数据中,可以使用注意力机制来学习哪些特征对于预测股价变化更加重要。通过使用注意力机制,可以从海量数据中自动选择对预测最有用的特征,提高预测的准确性。

综上所述,对于450W数据量的股市数据,可以尝试使用一些复杂的深度学习模型,例如CNN、LSTM和注意力机制等,以提高预测的准确性和稳定性。但是,选择哪种模型还需要考虑具体的问题和数据特征,需要进行实验和调整来选择最适合的模型。

教你如何用Python自动发wordpress文章

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install xmlrpc

2.编写代码

import xmlrpc.client

# WordPress的XML-RPC API URL
url = 'https://yourwebsite.com/xmlrpc.php'

# WordPress登录凭证
username = 'your_username'
password = 'your_password'

# 创建XML-RPC客户端对象
wp = xmlrpc.client.ServerProxy(url)

# 创建文章的字典对象
post = {
    'post_title': 'My New Post',
    'post_content': 'This is the content of my new post.',
    'post_status': 'publish'
}

# 使用XML-RPC API发布文章
post_id = wp.wp.newPost('', username, password, post)

# 输出新发布文章的ID
print('New post published with ID:', post_id)

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

如何发现数据的规律?教你4种Python方法!

发现数据的规律是数据分析和数据科学中非常重要的一个步骤。以下是一些常用的方法和技巧:

  1. 统计描述:使用基本的统计工具(如均值、中位数、标准差、百分位数等)对数据进行描述和总结,以便了解数据的分布和趋势。
  2. 数据可视化:将数据绘制成图表或图形,例如直方图、散点图、箱线图等,以便更清晰地展现数据的分布和趋势。可以使用Python中的Matplotlib、Seaborn或R中的ggplot2等可视化工具。
  3. 分组和聚合:将数据按照某个变量进行分组,然后对每组数据进行聚合(如计算平均值、中位数、最大值、最小值等),以便找到变量之间的相关性和趋势。
  4. 机器学习算法:使用机器学习算法(如线性回归、决策树、聚类等)对数据进行建模和预测,以便更深入地了解数据的规律和趋势。

综合使用以上方法可以更全面地了解数据的规律,以便更好地进行数据分析和决策。

下面用Python逐一介绍分析方法。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install pandas
pip install numpy
pip install scipy
pip install seaborn
pip install matplotlib

# 机器学习部分
pip install scikit-learn

2.统计描述发现规律

使用Python进行统计描述可以使用一些内置库,例如Numpy和Pandas。

以下是一些基本的统计描述函数:

  1. 平均值(mean): 计算一组数据的平均值。
import numpy as np

data = [1, 2, 3, 4, 5]
mean = np.mean(data)
print(mean)

输出结果为:3.0

  1. 中位数(median): 计算一组数据的中位数。
import numpy as np

data = [1, 2, 3, 4, 5]
median = np.median(data)
print(median)

输出结果为:3.0

  1. 众数(mode): 计算一组数据的众数。
import scipy.stats as stats

data = [1, 2, 2, 3, 4, 4, 4, 5]
mode = stats.mode(data)
print(mode)

输出结果为:ModeResult(mode=array([4]), count=array([3]))

  1. 方差(variance): 计算一组数据的方差。
import numpy as np

data = [1, 2, 3, 4, 5]
variance = np.var(data)
print(variance)

输出结果为:2.0

  1. 标准差(standard deviation): 计算一组数据的标准差。
import numpy as np

data = [1, 2, 3, 4, 5]
std_dev = np.std(data)
print(std_dev)

输出结果为:1.4142135623730951

以上是一些基本的统计描述函数,还有其他函数可以使用,具体使用方法可查看相应的文档。

3.数据可视化分析规律

Python有很多库可以用来进行数据可视化,其中最常用的有Matplotlib和Seaborn。以下是一些基本的数据可视化方法:

  1. 折线图(line plot): 可以用来展示随时间或某个变量的趋势。
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.show()
  1. 散点图(scatter plot): 可以用来展示两个变量之间的关系。
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.scatter(x, y)
plt.show()
  1. 直方图(histogram): 可以用来展示数值型数据的分布情况。
import matplotlib.pyplot as plt

data = [1, 2, 2, 3, 4, 4, 4, 5]

plt.hist(data, bins=5)
plt.show()
  1. 箱线图(box plot): 可以用来展示数值型数据的中位数、四分位数和异常值等信息。
import seaborn as sns

data = [1, 2, 2, 3, 4, 4, 4, 5]

sns.boxplot(data)
plt.show()
  1. 条形图(bar chart): 可以用来展示分类变量之间的差异或比较。
import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D']
values = [10, 20, 30, 40]

plt.bar(categories, values)
plt.show()

以上是一些基本的数据可视化方法,Matplotlib和Seaborn都提供了更丰富的功能,可以用来创建更复杂的图表和图形。

4.分组和聚合分析发现规律

在Python中,使用pandas库可以方便地对数据进行分组和聚合操作,以发现数据的规律。以下是一个基本的分组和聚合示例:

假设我们有一个数据集,包含销售日期、销售金额和销售员名称,我们想要了解每个销售员的总销售额。我们可以按销售员名称进行分组,并对每个组应用聚合函数,如求和、平均值等。以下是一个示例代码:

import pandas as pd

# 创建数据集
data = {'sales_date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08', '2022-01-09', '2022-01-10'],
        'sales_amount': [100, 200, 150, 300, 250, 400, 350, 450, 500, 600],
        'sales_person': ['John', 'Jane', 'John', 'Jane', 'John', 'Jane', 'John', 'Jane', 'John', 'Jane']}

df = pd.DataFrame(data)

# 按销售员名称分组,并对每个组的销售金额求和
grouped = df.groupby('sales_person')['sales_amount'].sum()

print(grouped)

输出结果为:

sales_person
Jane    2200
John    1800
Name: sales_amount, dtype: int64

可以看到,我们成功地按销售员名称进行了分组,并对每个组的销售金额求和。这样我们就可以发现每个销售员的总销售额,从而了解数据的规律。

5.机器学习算法分析发现规律

可以使用scikit-learn库来实现机器学习算法,发现数据的规律。以下是一个基本的示例,展示如何使用决策树算法对数据进行分类,并发现数据的规律:

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 创建数据集
data = {'age': [22, 25, 47, 52, 21, 62, 41, 36, 28, 44],
        'income': [21000, 22000, 52000, 73000, 18000, 87000, 45000, 33000, 28000, 84000],
        'gender': ['M', 'F', 'F', 'M', 'M', 'M', 'F', 'M', 'F', 'M'],
        'bought': ['N', 'N', 'Y', 'Y', 'N', 'Y', 'Y', 'N', 'Y', 'Y']}

df = pd.DataFrame(data)

# 将文本数据转换成数值数据
df['gender'] = df['gender'].map({'M': 0, 'F': 1})
df['bought'] = df['bought'].map({'N': 0, 'Y': 1})

# 将数据集分成训练集和测试集
X = df[['age', 'income', 'gender']]
y = df['bought']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 创建决策树模型
model = DecisionTreeClassifier()

# 训练模型
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算模型的准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {:.2f}%".format(accuracy*100))

输出结果为:

Accuracy: 50.00%

可以看到,我们使用决策树算法对数据进行分类,并在测试集上计算了模型的准确率。这样我们就可以发现数据的规律,例如哪些因素会影响购买决策等。需要注意的是,这只是一个简单的示例,实际应用中需要根据具体问题选择合适的机器学习算法和特征工程方法。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 切割mp3为每30秒一个片段并降低文件码率

MoviePy是一个基于Python的视频编辑库,它提供了创建、编辑、合并、剪辑和转换视频的功能。以下是MoviePy的主要作用:

  1. 视频剪辑:MoviePy可以剪辑视频、分离视频和音频流、添加和删除视频和音频段等。
  2. 视频合并:MoviePy可以将多个视频和音频文件合并成一个。
  3. 视频转码:MoviePy可以转换视频格式和编码方式,例如将mp4转换为avi或者将H.264编码转换为H.265编码等。
  4. 视频编辑:MoviePy可以添加视频特效、动画和字幕等,让视频更生动和富有创意。
  5. 视频生成:使用MoviePy可以创建自定义的视频,如生成幻灯片、动画等。
  6. 视频处理:MoviePy可以对视频进行一些处理,如裁剪、缩放、旋转和颜色调整等。

总之,MoviePy为Python开发者提供了一个简单易用的框架来处理视频,而不必学习复杂的视频编辑软件。它的功能强大,可以轻松地进行视频处理、编辑和生成。

本文主要介绍如何使用moviepy来分割音频流并降低码率。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install moviepy

2.Moviepy分割音频

要使用MoviePy库按每30秒一个切割上传上来的mp3/wav并降低文件码率,我们可以按照以下步骤操作。

1、导入MoviePy库和所需的其他库:

import os
from moviepy.editor import *

2、定义一个函数来切割音频文件并降低码率:

def split_audio_file(filename, split_duration=30, bitrate=16000):
    # 读取音频文件
    audio = AudioFileClip(filename)

    # 计算文件总时长和切割点
    total_duration = audio.duration
    split_points = list(range(0, int(total_duration), split_duration))
    split_points.append(int(total_duration))
    filelist = []
    # 切割音频文件并降低码率
    for i in range(len(split_points) - 1):
        start_time = split_points[i]
        end_time = split_points[i+1]
        split_audio = audio.subclip(start_time, end_time)
        split_audio.write_audiofile(f"{os.path.splitext(filename)[0]}_{i}.wav", fps=bitrate)
        filelist.append(f"{os.path.splitext(filename)[0]}_{i}.wav")
    audio.close()
    return filelist

函数接受三个参数:filename表示要处理的音频文件名,split_duration表示要按照多长时间切割文件(单位为秒),bitrate表示要设置的输出码率(单位为比特率)。

在函数中,我们先读取音频文件,然后计算切割点。接着,我们用循环遍历每个切割点,将音频文件切割成小文件并降低码率,最后输出为新的音频文件。

3、调用函数处理音频文件:

filename = "your_audio_file.mp3"  # 要处理的音频文件名
split_duration = 30  # 按每30秒一个切割文件
bitrate = "64k"  # 设置输出码率为64kbps
split_audio_file(filename, split_duration, bitrate)

在调用函数时,将要处理的音频文件名、切割文件的时长和输出码率作为参数传递给函数即可。该函数将把处理后的音频文件输出到当前目录下。

3.Mp3的输出码率

请注意,不能把输出码率调的太低。MP3文件的输出码率会影响音频的质量和文件大小。输出码率越高,音频的质量越好,但文件大小也会越大。相反,输出码率越低,音频的质量会降低,但文件大小会更小。

MP3文件的码率是指每秒钟所需的比特数(即比特率)。在进行编码时,MP3算法会根据设置的码率来决定压缩音频数据的量,从而影响输出文件的大小和质量。通常,较高的码率会产生更高的音频质量,但也会占用更多的存储空间和带宽。

如果输出码率设置得太低,会导致音频质量受到明显的损失,可能会出现音频杂音、失真和低频截断等问题。如果输出码率设置得太高,文件大小会变得非常大,可能会使传输和存储变得困难。

因此,在选择输出码率时,需要根据具体情况权衡音频质量和文件大小的要求,以及传输和存储的限制。一般来说,128 kbps是常用的MP3输出码率,可产生较好的音质和适当的文件大小。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 企业微信群通知原来这么简单

上次介绍了如何通过钉钉进行群通知,有同学反馈自己更习惯使用企业微信或公司使用了企业微信,希望也能出个基于Python的企业微信的群通知教程,于是便有了本文。

事实上两者的配置方法和使用方法非常相似,都是通过机器人进行通知,下面就教大家如何使用Python对企业微信进行群通知。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install requests

2.配置企业微信机器人

为了能够通过Python发送企业微信通知,首先我们需要在企业微信群聊(这个群里可以只有你和机器人)中添加一个群机器人:

然后填写机器人名称:

最后会获得一个webhook地址:

通过这个webhook地址,我们就能通过Python给企业微信发送通知了。

3.Python 发送企业微信通知

通过requests模块对webhook地址发送post请求就能发送通知:

# 公众号:Python实用宝典
import requests
def send_weixin(content):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "text",
        "text": {
            "content": content,  # 让群机器人发送的消息内容。
            "mentioned_list": [],
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("人工智能: 175")

效果如下:

在 menthoned_list 参数中,你还可以增加 @所有人 的选项:

# 公众号:Python实用宝典
import requests
def send_weixin(content):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "text",
        "text": {
            "content": content,  # 让群机器人发送的消息内容。
            "mentioned_list": ["@all", ],  # @全体成员
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("人工智能: 175")

这样会在消息发出的同时,提醒所有人查看信息。

此外,机器人的msgtype支持文本(text)、markdown(markdown)、图片(image)、图文(news)四种消息类型。

Markdown的发送方法如下:

# 公众号:Python实用宝典
import requests
def send_weixin_md(content):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "markdown",
        "markdown": {
            "content": content,
            "mentioned_list": ["@all", ],  # @全体成员
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("实时新增用户反馈<font color=\"warning\">132例</font>,请相关同事注意。\n
         >类型:<font color=\"comment\">用户反馈</font>
         >普通用户反馈:<font color=\"comment\">117例</font>
         >VIP用户反馈:<font color=\"comment\">15例</font>")

如果你需要发单独的图片,请使用image类型,并将图片的md5和base64传入到image参数,完整的data的格式如下:

# 公众号:Python实用宝典
import requests
def send_weixin_images(MD5, base64data):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "image",
        "image": {
            "base64": base64data,
            "md5": MD5
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin(MD5, base64data)

注:图片(base64编码前)最大不能超过2M,支持JPG,PNG格式,效果如下:

图文类型你只需要配置图片、说明文字及跳转链接,也非常方便:

# 公众号:Python实用宝典
import requests
def send_weixin_images(title, description, url, picurl):
    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的webhook密钥"  # 这里就是群机器人的Webhook地址
    headers = {"Content-Type": "application/json"}  # http数据头,类型为json
    data = {
        "msgtype": "news",
        "news": {
           "articles" : [
               {
                   "title" : title,
                   "description" : description,
                   "url" : url, 
                   "picurl" : picurl
               }
            ]
        }
    }
    r = requests.post(url, headers=headers, json=data)  # 利用requests库发送post请求
send_weixin("中秋节礼品领取", "今年中秋节公司有豪礼相送", "www.qq.com", "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png")

怎么样,上述四种通知类型中有你需要的吗?有的话就赶快拿去使用吧!

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

教你纯原生实现Redis简易客户端(绕过Qmt白名单)

Redis 是我们在开发过程中经常会用到的内存数据库,尤其是在Python的第三方模块Redis-py的支持下,在Python中使用Redis及其方便。

但是在有些情况下,我们无法使用像Redis-py这样的第三方模块(比如QMT),这时候就需要自己实现一个简易版的Redis-py了。

本文将教大家如何用20行代码,制作一个简易版的Redis客户端,不过仅以GET命令为例,其他命令的用法也差不多。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

2.原理剖析

其实通过Redis GET返回的数据就是一些字符串,这些字符串的格式如下:

b'$466\r\n\x80\x04\x95\xc7\x01\x00\x00\x00\x00\x00\x00]\x94(\x8c\x06000957\x94\x8c\x06002031\x94\x8c\x06000899\x94\x8c\x06300339\x94\x8c\x06002090\x94\x8c\x06601016\x94\x8c\x06002547\x94\x8c\x06002863\x94\x8c\x06002591\x94\x8c\x06002514\x94\x8c\x06000629\x94\x8c\x06002204\x94\x8c\x06000544\x94\x8c\x06002374\x94\x8c\x06000821\x94\x8c\x06000625\x94\x8c\x06000158\x94\x8c\x06002703\x94\x8c\x06002866\x94\x8c\x06600686\x94\x8c\x06002796\x94\x8c\x06300598\x94\x8c\x06002101\x94\x8c\x06002454\x94\x8c\x06000970\x94\x8c\x06000631\x94\x8c\x06002121\x94\x8c\x06600348\x94\x8c\x06600996\x94\x8c\x06002080\x94\x8c\x06002194\x94\x8c\x06002466\x94\x8c\x06300663\x94\x8c\x06002616\x94\x8c\x06000665\x94\x8c\x06600992\x94\x8c\x06300750\x94\x8c\x06300059\x94\x8c\x06002047\x94\x8c\x06002997\x94\x8c\x06000521\x94\x8c\x06002594\x94\x8c\x06002261\x94\x8c\x06002125\x94\x8c\x06002085\x94\x8c\x06002168\x94\x8c\x06002665\x94\x8c\x06002523\x94\x8c\x06603067\x94\x8c\x06002432\x94e.\r\n'

可见其是一个bytes字符串,开头$xxx是此数据的长度,\r\n作为分割符,后面紧跟着的就是你的原始数据内容,最后才是\r\n作为结尾。

根据这个返回内容,我们就可以制作一个简易的客户端用于在无法引用第三方模块的环境中接收Redis信息。

3.编写简易Redis客户端

与Redis通信,我们只需要用Python原生的socket模块即可。

import socket
import pickle

REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务,指定主机和端口
s.connect((REDIS_HOST, REDIS_PORT))
s.close()

这样就与你的Redis服务器连接上了,接下来只需要向socket发送你的命令并receive即可获取对应的内容:

import socket
import pickle

REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务,指定主机和端口
s.connect((REDIS_HOST, REDIS_PORT))
# GET 某个 KEY 的内容
s.send("GET RQB_keys_20220719 \r\n".encode("utf-8"))
# 接收小于 1M 的数据
msg = s.recv(1024 * 1024) 
s.close()
print(msg)
# b'$466\r\n\x80\x04\x95\xc7\x01\x00\x00\x00\x00\x00\x00]\x94(\x8c\x06000957\x94\x8c\x06002031\x94\x8c\x06000899\x94\x8c\x06300339\x94\x8c\x06002090\x94\x8c\x06601016\x94\x8c\x06002547\x94\x8c\x06002863\x94\x8c\x06002591\x94\x8c\x06002514\x94\x8c\x06000629\x94\x8c\x06002204\x94\x8c\x06000544\x94\x8c\x06002374\x94\x8c\x06000821\x94\x8c\x06000625\x94\x8c\x06000158\x94\x8c\x06002703\x94\x8c\x06002866\x94\x8c\x06600686\x94\x8c\x06002796\x94\x8c\x06300598\x94\x8c\x06002101\x94\x8c\x06002454\x94\x8c\x06000970\x94\x8c\x06000631\x94\x8c\x06002121\x94\x8c\x06600348\x94\x8c\x06600996\x94\x8c\x06002080\x94\x8c\x06002194\x94\x8c\x06002466\x94\x8c\x06300663\x94\x8c\x06002616\x94\x8c\x06000665\x94\x8c\x06600992\x94\x8c\x06300750\x94\x8c\x06300059\x94\x8c\x06002047\x94\x8c\x06002997\x94\x8c\x06000521\x94\x8c\x06002594\x94\x8c\x06002261\x94\x8c\x06002125\x94\x8c\x06002085\x94\x8c\x06002168\x94\x8c\x06002665\x94\x8c\x06002523\x94\x8c\x06603067\x94\x8c\x06002432\x94e.\r\n'

请注意,recv里你设定的大小会直接占用内存,所以请设定一个适宜的数目,或者从返回值中的美元符后的数字判断你需要接收的数据大小。

比如第一次请求,你只接收1024个字节,拿到 $xxx 这个长度后,重新send一次命令,再 s.recv(xxx) 长度。

上述例子中得到的内容是redis的格式,我们需要把\r\n给去除掉,并只取中间的数据便是我们存入redis的原始数据。

import pickle
def get_msg(msg):
    msg_new = msg.split(b"\r\n")[1]
    msg = pickle.loads(msg_new)
    return msg

因为我的原始内容是pickle格式,因此我在取出原始数据后使用pickle.loads便能拿到我想要的内容,完整代码如下:

import socket
import pickle

REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务,指定主机和端口
s.connect((REDIS_HOST, REDIS_PORT))
# GET 某个 KEY 的内容
s.send("GET RQB_keys_20220719 \r\n".encode("utf-8"))
# 接收小于 1M 的数据
msg = s.recv(1024 * 1024) 
s.close()

def get_msg(msg):
    msg_new = msg.split(b"\r\n")[1]
    msg = pickle.loads(msg_new)
    return msg

print(get_msg(msg))

效果如下:

['000957', '002031', '000899', '300339', '002090', '601016', '002547', '002863', '002591', '002514', '000629', '002204', '000544', '002374', '000821', '000625', '000158', '002703', '002866', '600686', '002796', '300598', '002101', '002454', '000970', '000631', '002121', '600348', '600996', '002080', '002194', '002466', '300663', '002616', '000665', '600992', '300750', '300059', '002047', '002997', '000521', '002594', '002261', '002125', '002085', '002168', '002665', '002523', '603067', '002432']

在QMT等会限制第三方模块的软件中,使用这样的方式访问Redis,就不会再遇到白名单的限制了。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Bulbea 让你轻而易举实现股票的深度学习量化

Bulbea 是一个基于深度学习开发的,用于股票市场预测和建模的Python库。

Bulbea 自带了不少可用于股票深度学习训练及测试的API,并且易于对数据进行扩展和延申,构建属于我们自己的数据及模型。

下面就来介绍一下这个模块。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

git clone https://github.com/achillesrasquinha/bulbea.git && cd bulbea
pip install -r requirements.txt
python setup.py install

如果你无法访问Github,请在二七阿尔量化后台回复Bulbea下载项目镜像(2022-11-28).

此外,你还需要安装 Tensorflow 的CPU版本或GPU版本:

pip install tensorflow     # CPU 版本
pip install tensorflow-gpu # GPU 版本 - 需要 CUDA, CuDNN

2.Bulbea 基本使用方法

Bulbea 和普通的深度学习研究项目一样,在做训练和测试时,分为四步(加载数据,预处理,建模,测试)。

2.1 加载数据

Bulbea内置了数据下载模块,让你很轻易地能够下载雅虎财经的股票数据,比如下面下载雅虎财经源的GOOGL股票数据:

>>> import bulbea as bb
>>> share = bb.Share('YAHOO', 'GOOGL')
>>> share.data
# Open        High         Low       Close      Volume  \
# Date                                                                     
# 2004-08-19   99.999999  104.059999   95.959998  100.339998  44659000.0   
# 2004-08-20  101.010005  109.079998  100.500002  108.310002  22834300.0   
# 2004-08-23  110.750003  113.479998  109.049999  109.399998  18256100.0   
# 2004-08-24  111.239999  111.599998  103.570003  104.870002  15247300.0   
# 2004-08-25  104.960000  108.000002  103.880003  106.000005   9188600.0
...

2.2 预处理

Bulbea 同样也内置了预处理模块,让你能够轻易地分割训练集和测试集:

>>> from bulbea.learn.evaluation import split
>>> Xtrain, Xtest, ytrain, ytest = split(share, 'Close', normalize = True)

2.3 建模

Bulbea自带了RNN模型可供使用:

>>> import numpy as np
>>> Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], Xtrain.shape[1], 1))
>>> Xtest  = np.reshape( Xtest, ( Xtest.shape[0],  Xtest.shape[1], 1))

>>> from bulbea.learn.models import RNN
>>> rnn = RNN([1, 100, 100, 1]) # number of neurons in each layer
>>> rnn.fit(Xtrain, ytrain)
# Epoch 1/10
# 1877/1877 [==============================] - 6s - loss: 0.0039
# Epoch 2/10
# 1877/1877 [==============================] - 6s - loss: 0.0019
...

2.4 测试

通过调用sklearn的metrics就能对数据实现测试:

>>> from sklearn.metrics import mean_squared_error
>>> p = rnn.predict(Xtest)
>>> mean_squared_error(ytest, p)
0.00042927869370525931
>>> import matplotlib.pyplot as pplt
>>> pplt.plot(ytest)
>>> pplt.plot(p)
>>> pplt.show()

3.情感分析

Bulbea 能自动爬取相关股票在推特上的文字,并对这些文字做一个情感分析。

你只需要给Bulbea提供以下环境变量就能够进行感情色彩分析:

export BULBEA_TWITTER_API_KEY="<YOUR_TWITTER_API_KEY>"
export BULBEA_TWITTER_API_SECRET="<YOUR_TWITTER_API_SECRET>"

export BULBEA_TWITTER_ACCESS_TOKEN="<YOUR_TWITTER_ACCESS_TOKEN>"
export BULBEA_TWITTER_ACCESS_TOKEN_SECRET="<YOUR_TWITTER_ACCESS_TOKEN_SECRET>"

测试一下:

>>> import bulbea as bb
>>> share = bb.Share('YAHOO', 'GOOGL')
>>> bb.sentiment(share)
0.07580128205128206

当然,这个分析仅供参考,太粗略了。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典