分类目录归档:Python 数据分析

Python MySQL与Influxdb对比及迁移方案

最近遇到一个新的应用场景:将MySQL存放的时序数据迁移到influxDB中。

这么做的好处在于:

1.Influxdb 读写速度更快。

写数据对比

读数据对比

2.在磁盘占用率上,Influxdb更低。

3.此外,Influxdb的数据可以使用Chronograf进行实时预览

如果以前是将时序数据存放在MySQL,现在为了获取更好的性能和使用更优的可视化工具,我们需要将数据从MySQL迁移到Influxdb中。

这看起来是一个常见场景,经过我一番查阅,发现了 GreatLakesEnergy/Mysql-to-influxdb 这个项目。

可惜的是,作者是基于Python2进行开发的,而且用了几个非常难搭建的模块。想在Python3中重新使用这个项目比较困难,因此我对它进行了改造,改造后的代码如下:

https://github.com/Ckend/Mysql-to-influxdb

如果你有这样的迁移需求,可以继续看下面的详细教程。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

下载或Git Clone我修改好的代码:
https://github.com/Ckend/Mysql-to-influxdb

进入该目录后,输入以下命令安装依赖:

pip install -r requirements.txt

看到 Successfully installed xxx 则说明安装成功。

2.迁移配置

在迁移开始前,请在你需要迁移的表里加一个字段 transfered,这个字段用于检测某条数据是否被迁移,默认设为0。一旦迁移完成,这个字段会被设为1.

此外,你需要找到你表里的时间序列字段(time)和分类字段(tag)。

分类字段可能比较难理解,比如说你有一张表记录了每支股票每天的开盘价,那么股票id字段便可理解为一个tag,即下面配置中的siteid_field.

在解压后的目录里新建一个settings.ini, 配置以下信息:

[mysql]
host : mysql host # (本地为127.0.0.1)
port : mysql 端口号 # Default is3306
username : 用户名
password : 密码
db : 数据库
table : 要迁移的表
check_field : 检测字段,默认为0,如果迁移完成,该字段会被设为1
time_field : 时间字段
siteid_field : 分类字段(tag)


[influx]
host : influxdb host # (本地为127.0.0.1)
port : 端口号 # Default:8086
username : 用户名
password : 密码
db : 要迁移进入的数据库

[server]
interval : 5 

配置完上述信息后,执行命令即可开始迁移:

python mysql2influx.py -d -c settings.ini -s

3.迁移是否完成

如何检测迁移任务是否完成,还记得我们刚新增了一个字段 transfered 用于检测某条数据是否被迁移吗?

你只需要在mysql中输入以下sql查询是否还有未被迁移的数据即可:

SELECT count(1) FROM your_table where transfered = 0;

若不为0则说明还有数据未被迁移成功。

不过值得注意的是,迁移脚本里是先进行数据迁移,再回来修改transfered的值。

如果你的数据量非常大,更新MySQL数据有可能会耗时极长,因此查询transfered数量的结果有可能不正确。这点需要特别关注。

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

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

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


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

Python celery异步快速下载股票数据

上一篇股票文章中,我们讲了如何通过tushare下载股票数据,并存入mongodb:

Python 获取股票数据并存入MongoDB实战教程

其中有非常大的优化空间,比如,单线程的下载速度太慢了,能不能用多线程的方式?有时候网络连接会失败,能不能增加重试机制?

这些问题,我们将在这篇文章里进行优化。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

此外,本文章是 Python 获取股票数据并存入MongoDB实战教程 的优化版,请根据该文章提前装好tushare和mongodb.

除此之外,你还需要安装celery和eventlet:

pip install celery
pip install eventlet

看到 Successfully installed xxx 则说明安装成功。

2.使用Celery异步下载股票数据

Celery是一个强大的异步任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。

我们通常使用它来实现异步任务(async task)和定时任务(crontab)。

为了能异步下载股票,我们需要将上篇文章的内容拆分为两个部分:

1.Celery任务:获得某股票的日线数据
2.分发任务:分发获取指定股票的日线数据

这样,在我们的场景中,使用Celery实现异步任务主要包含三个步骤:

1.创建Celery任务实例(获得某股票的日线数据)
2.启动Celery Worker,用于运行任务
3.应用程序分发任务(分发获取指定股票的日线数据)

思路已经理清楚了,下面动手实践一下:

2.1 创建Celery任务实例:

此处大部分代码和上篇文章相似,因此下面仅显示和celery相关的核心代码:

# Python实用宝典
# https://pythondict.com
from celery import Celery

# 设置BROKER
BROKER_URL = 'mongodb://127.0.0.1:27017/celery'
# 新建celery任务
app = Celery('my_task', broker=BROKER_URL)

@app.task
def get_stock_daily(start_date, end_date, code):
    """
    Celery任务:获得某股票的日数据

    Args:
        start_date (str): 起始日
        end_date (str): 结束日
        code (str): 指定股票
    """


    # 请求tushare数据,并转化为json格式
    df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)
    data = json.loads(df.T.to_json()).values()

    # 这里为了保证数据的绝对稳定性,选择一条条创建
    for row in data:
        daily.update({"_id": f"{row['ts_code']}-{row['trade_date']}"}, row, upsert=True)

    print(f"{code}: 插入\更新 完毕 - {start_date} to {end_date}")

2.2 启动worker

在cmd执行以下命令启动celery worker:

python -m celery worker -A tasks --loglevel=info --pool=eventlet

注意,这里使用了–pool=eventlet,是为了让windows机器具有并行运行的能力。

2.3 分发获取指定股票的日数据

遍历一遍股票列表,通过delay调用Celery任务实例,将任务分发给worker:

# Python实用宝典
# https://pythondict.com
from tasks import get_stock_daily

def delay_stock_data(start_date, end_date):
    """
    获得A股所有股票日数据

    Args:
        start_date (str): 起始日
        end_date (str): 结束日
    """

    codes = open('./codes.csv', 'r', encoding='utf-8').readlines()

    # 遍历所有股票ID
    for code in codes:
        get_stock_daily.delay(start_date, end_date, code)

delay_stock_data("20180101", "20200725")

这样,worker就会在后台异步执行这些任务,切换到worker的命令行中,你会看到输出如丝般润滑:

好景不长,不久后你肯定会受到tushare发送回来的CPS限制错误:

Exception: 抱歉,您每分钟最多访问该接口800次,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108。

3.限制访问次数与重试机制

为了解决这个CPS问题,我确实花了不少时间,尝试控制worker频率,无果,最终选择了一个不是办法的办法:

在Tushare报错的时候,捕捉起来,控制其60秒后重试

    # 请求tushare数据,并转化为json格式
    try:
        df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)
    except Exception as e:
        # 触发普通用户CPS限制,60秒后重试
        print(e)
        get_stock_daily.retry(countdown=60)

简单,但有效。

此外,为了防止网络请求出现问题,导致某个任务丢失,我们还可以在下发任务的时候使用apply_async配置失败重试。默认重试三次:

def delay_stock_data(start_date, end_date):
    """
    获得A股所有股票日数据

    Args:
        start_date (str): 起始日
        end_date (str): 结束日
    """

    codes = open('./codes.csv', 'r', encoding='utf-8').readlines()

    # 遍历所有股票ID
    for code in codes:
        get_stock_daily.apply_async(
            (start_date, end_date, code), retry=True
        )

这样,一个相对健壮的股票数据异步下载器就完成了。

用该方法把A股所有股票下载一遍,应该不会超过5分钟。

如果你给tushare氪了金,没有cps限制,下载时间不会超过1分钟。

目前github上好像缺少这样的项目,因此我将该项目开源到了GitHub上:

https://github.com/Ckend/stock_download_celery

目前仅支持日线数据,欢迎补充。

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

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

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


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

Python moviepy 一个快速视频剪辑编辑神器

你知道吗,用moviepy一行代码就能够快速剪辑视频中某个区间的片段:

clip = VideoFileClip("videoplayback.mp4").subclip(50,60)

这一段代码,能够在3秒内将videoplayback.mp4的50秒-60秒的视频片段提取出来,非常方便。

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/06/2020062216500711.webm

不仅如此,moviepy还支持添加字幕、调整音量、片段链接等功能。下面看看详细的操作方法。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

在终端输入以下命令安装我们所需要的依赖模块:

pip install moviepy

看到 Successfully installed xxx 则说明安装成功。

2.视频剪辑

剪辑个视频,多大点事,比起下载PR,用Python 写3行代码,3秒剪辑不香吗?

from moviepy.editor import *

# 剪辑50-60秒的音乐 00:00:50 - 00:00:60
video = CompositeVideoClip([VideoFileClip("videoplayback.mp4").subclip(50,60)])

# 写入剪辑完成的音乐
video.write_videofile("done.mp4")

3.视频拼接

“哦?Python?哼,那你肯定很难进行拼接工作吧,PR多方便,拖拽即可完成拼接。”

那你可真是太小看Python了,moviepy几行代码随随便便就能拼接许多片段:

from moviepy.editor import VideoFileClip, concatenate_videoclips
clip1 = VideoFileClip("myvideo.mp4")

# 结合剪辑,你甚至能够完全自动化剪辑拼接视频的操作
clip2 = VideoFileClip("myvideo2.mp4").subclip(50,60)

clip3 = VideoFileClip("myvideo3.mp4")
final_clip = concatenate_videoclips([clip1,clip2,clip3])
final_clip.write_videofile("my_concatenation.mp4")

结合剪辑,你甚至能够完全自动化剪辑拼接视频的操作。

4.逐帧变化

“那你能完成针对每一帧图像的快速图像处理吗?PR可是做得到的哦”

我擦,你简直是在侮辱Python,教你如何反转视频每一帧的绿色和蓝色通道:

from moviepy.editor import VideoFileClip
my_clip = VideoFileClip("videoplayback.mp4")

def scroll(get_frame, t):
    """
    处理每一帧图像
    """
    frame = get_frame(t)
    frame_region = frame[:,:,[0,2,1]]
    return frame_region

modifiedClip = my_clip.fl(scroll)
modifiedClip.write_videofile("test.mp4")

5.导出GIF

哇,听起来好像挺牛逼的,那用来导出到GIF吗

当然可以:

from moviepy.editor import *

# 剪辑50-60秒的音乐 00:00:50 - 00:00:60
video = CompositeVideoClip([VideoFileClip("videoplayback.mp4").subclip(50,60)])

my_clip.write_gif('test.gif', fps=12)

扫描下方二维码,可以加入我们的Python互助群哦:

我们的文章到此就结束啦,如果你喜欢我们今天的Python 实战教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


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

Python 流程图 — 一键转化代码为流程图

Graphviz是一个可以对图进行自动布局的绘图工具,由贝尔实验室开源。我们在上次 Python 快速绘制画出漂亮的系统架构图 提到的diagrams,其内部的编排逻辑就用到了这个开源工具包。

而今天我们要介绍的项目,就是基于Python和Graphviz开发的,能将源代码转化为流程图的工具:pycallgraph

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

输入以下命令安装 pycallgraph 模块。

pip install pycallgraph

看到 Successfully installed xxx 则说明安装成功。除此之外,你还需要安装graphviz

macOS用户请使用brew安装:

brew install graphviz

windows用户请点击链接:graphviz-2.38.msi 下载安装,安装完成后需要将其写入到环境变量中:

2.生成流程图

该模块有两种调用方式,一种是在代码里通过上下文调用:

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

with PyCallGraph(output=GraphvizOutput()):
    # 需要绘制流程图的代码,可以是函数
    # ... ...

比如说,绘制一下咱上回的《Python 我的世界》源代码的流程图:

# ...省略大部分代码...
if __name__ == '__main__':
    from pycallgraph import PyCallGraph
    from pycallgraph.output import GraphvizOutput

    with PyCallGraph(output=GraphvizOutput()):
        main()

在运行该Python文件后,会在当前文件夹下产生一个pycallgraph.png的文件,这个就是该代码的流程图:

还有一种是使用命令的方式调用,这个方式必须使用bash才能运行,macOS用户可以忽视这个问题,但如果你是windows用户,请通过以下方式打开bash(以VS Code为例):

然后通过Ctrl + shift + ` 打开一个新的终端,即可看到以bash启动的命令行。

通过输入以下命令生成流程图:

pycallgraph graphviz -- ./你需要生成流程图的.py文件

完成后会在当前文件夹下生成一个pycallgraph.png的文件,这个就是这份代码的流程图。

通过这个方法,你可以清晰地看到这份源代码里面的调用逻辑和其每个模块的运行时间,是一个很方便的小工具,非常适合初学者学习他人的开源模块。大家有需要研究的代码可以用这个工具试一试,说不定有意外的收获呢。

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

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

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

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

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

Python 快速绘制画出漂亮的系统架构图

Diagrams  是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能绘制画出可视化架构,其支持使用以下6种云产品的图标:

AWSAzureGCPKubernetes阿里云, Oracle Cloud

基于Diagrams提供的节点,你只需要指定一个云产品(实际上选哪个都一样,我们只需要那个产品相应的图标,你可以选一个自己觉得好看的),使用其内部自带的云产品的图标,就能简单绘制基于某云产品图标的架构图,比如下面的代码,绘制了一个简单的基于数据库集群的网络服务架构:

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS
from diagrams.aws.database import RDS
from diagrams.aws.network import Route53

with Diagram("Simple Web Service with DB Cluster", show=False):
    dns = Route53("dns")
    web = ECS("service")

    with Cluster("DB Cluster"):
        db_master = RDS("master")
        db_master - [RDS("slave1"),
                     RDS("slave2")]

    dns >> web >> db_master

非常适合用来做毕业论文的架构图绘制,强烈推荐。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

在终端输入以下命令安装我们所需要的依赖模块:

pip install diagrams

看到 Successfully installed xxx 则说明安装成功。

2.基本使用与例子

2.1 初始化与导出

使用 Diagram 类初始化一个绘图上下文,这个类接收到的第一个参数将会成为架构图的文件名,而一当代码运行完毕,它将会以该文件名保存(空格会被下划线所替代):

from diagrams import Diagram
from diagrams.aws.compute import EC2

with Diagram("Simple Diagram"):
    EC2("web")

此外,它还可以选择导出的文件格式,在Diagram类里增加outformat参数,也可以不以第一个参数为文件保存名称,增加filename参数指定名称即可:

with Diagram("Simple Diagram", outformat="jpg", filename="my_diagram")

2.2 节点类型

由于节点类型比较多,我们无法一一展示出来,所有类型的节点里都可以在官方文档里找到,比如:

阿里云:https://diagrams.mingrammer.com/docs/nodes/alibabacloud
K8S: https://diagrams.mingrammer.com/docs/nodes/k8s
AWS: https://diagrams.mingrammer.com/docs/nodes/aws

接下来以AWS为例子,讲解几个基本的数据流例子:

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB
from diagrams.aws.storage import S3

# show参数表示是否自动打开图像
with Diagram("Web Services", show=False):
    ELB("lb") >> EC2("web") >> RDS("userdb") >> S3("store")
    ELB("lb") >> EC2("web") >> RDS("userdb") << EC2("stat")
    (ELB("lb") >> EC2("web")) - EC2("web") >> RDS("userdb")

几个操作符:

>> 表示从左到右的数据流
<< 表示从右到左的数据流
– 表示没有箭头的数据流

可以用变量赋值的形式简化代码:

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Workers", show=False, direction="TB"):
    lb = ELB("lb")
    db = RDS("events")
    lb >> EC2("worker1") >> db
    lb >> EC2("worker2") >> db
    lb >> EC2("worker3") >> db
    lb >> EC2("worker4") >> db
    lb >> EC2("worker5") >> db

可以看到这里箭头的方向变了,这是因为Diagram加了direction参数,TB 表示数据流向 top to bottm, 即从上到下,可选的其他参数还有:LR(左至右)、BT(底至上)、RL(右至左)。

上面的代码还可以用数组的形式进一步简化:

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Grouped Workers", show=False, direction="TB"):
    ELB("lb") >> [EC2("worker1"),
                  EC2("worker2"),
                  EC2("worker3"),
                  EC2("worker4"),
                  EC2("worker5")] >> RDS("events")

2.3 集群块

使用Cluster 类 并用with以上下文的形式,你可以非常方便地生成一个集群块:

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS
from diagrams.aws.database import RDS
from diagrams.aws.network import Route53

with Diagram("Simple Web Service with DB Cluster", show=False):
    dns = Route53("dns")
    web = ECS("service")

    with Cluster("DB Cluster"):
        db_master = RDS("master")
        db_master - [RDS("slave1"),
                     RDS("slave2")]

    dns >> web >> db_master

而且还可以做得相当复杂:

这里代码很简单,但是比较长,不展示了,有兴趣的话可以点击最下方阅读原文进行查看。

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS, EKS, Lambda
from diagrams.aws.database import Redshift
from diagrams.aws.integration import SQS
from diagrams.aws.storage import S3

with Diagram("Event Processing", show=False):
    source = EKS("k8s source")

    with Cluster("Event Flows"):
        with Cluster("Event Workers"):
            workers = [ECS("worker1"),
                       ECS("worker2"),
                       ECS("worker3")]

        queue = SQS("event queue")

        with Cluster("Processing"):
            handlers = [Lambda("proc1"),
                        Lambda("proc2"),
                        Lambda("proc3")]

    store = S3("events store")
    dw = Redshift("analytics")

    source >> workers >> queue >> handlers
    handlers >> store
    handlers >> dw

2.4 自定义线的颜色与属性

使用Edge函数,你可以自定义线的颜色与属性以及备注,比如:

Edge(color="firebrick", style="dashed", label="test")
# 火砖色的虚线,备注为test

一个比较复杂,但是阅读起来很简单的例子如下:

from diagrams import Cluster, Diagram, Edge
from diagrams.onprem.analytics import Spark
from diagrams.onprem.compute import Server
from diagrams.onprem.database import PostgreSQL
from diagrams.onprem.inmemory import Redis
from diagrams.onprem.logging import Fluentd
from diagrams.onprem.monitoring import Grafana, Prometheus
from diagrams.onprem.network import Nginx
from diagrams.onprem.queue import Kafka

with Diagram(name="Advanced Web Service with On-Premise (colored)", show=False):
    ingress = Nginx("ingress")

    metrics = Prometheus("metric")
    metrics << Edge(color="firebrick", style="dashed") << Grafana("monitoring")

    with Cluster("Service Cluster"):
        grpcsvc = [
            Server("grpc1"),
            Server("grpc2"),
            Server("grpc3")]

    with Cluster("Sessions HA"):
        master = Redis("session")
        master - Edge(color="brown", style="dashed") - Redis("replica") << Edge(label="collect") << metrics
        grpcsvc >> Edge(color="brown") >> master

    with Cluster("Database HA"):
        master = PostgreSQL("users")
        master - Edge(color="brown", style="dotted") - PostgreSQL("slave") << Edge(label="collect") << metrics
        grpcsvc >> Edge(color="black") >> master

    aggregator = Fluentd("logging")
    aggregator >> Edge(label="parse") >> Kafka("stream") >> Edge(color="black", style="bold") >> Spark("analytics")

    ingress >> Edge(color="darkgreen") << grpcsvc >> Edge(color="darkorange") >> aggregator

3.总结

不得不说,这真是一个基于Python,且非常简单好用的开源免费架构图设计模块,用途其实非常广,包括不仅限于:计算机应用的架构图、毕业设计架构等等。希望大家能够学以致用。

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

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

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

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

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

Python 使用tablib库快速导出数据

Tablib是一个Python的第三方数据导出模块,它支持以下文件格式的导出:

  • Excel
  • JSON
  • YAML
  • Pandas DataFrames
  • HTML
  • Jira
  • TSV
  • ODS
  • CSV
  • DBF

这个工具能做到的东西,Pandas都能做到,但是有时候Pandas实在是过重了,如果我们只想实现轻量数据的导出,而非上千万级别的数据导出,该工具更能体现它的优势。

1.准备

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装本文所需要的依赖模块:

pip install tablib

看到 Successfully installed xxx 则说明安装成功。

2.基本使用

这一块,官方文档已经有详细介绍,这里转载自xin053的翻译与介绍,有部分修改。

创建Dataset对象

import tablib
headers = ('first_name', 'last_name')
data = [
    ('John', 'Adams'),
    ('George', 'Washington')
]
data = tablib.Dataset(*data, headers=headers)

这样相当于构造了一张表:

first_namelast_name
JohnAdams
GeorgeWashington

其中最重要的就是Dataset对象,当然该对象的创建也可以不输入参数,直接

data = tablib.Dataset()

创建出一个Dataset对象,然后通过

data.headers = ['first_name', 'last_name']

设置表头,当然也可以使用

data.headers = ('first_name', 'last_name')

因为不管是用列表还是元组,tablib都会自动帮我们处理好,我们可以通过

data.append(['Henry', 'Ford'])

或者

data.append(('Henry', 'Ford'))

来向表中添加一条记录。

我们可以通过data.dict来查看目前表中的所有数据:

>>> data.dict
[OrderedDict([('First Name', 'John'), ('Last Name', 'Adams')]), OrderedDict([('First Name', 'George'), ('Last Name', 'Washington')]), OrderedDict([('First Name', 'Henry'), ('Last Name', 'Ford')])]

也可以通过print(data)显示更人性化的输出:

>>> print(data)
First Name|Last Name 
----------|----------
John      |Adams     
George    |Washington
Henry     |Ford 

Dataset属性

data.height输出当前记录(行)总数
data.width输出当前属性(列)总数

>>> print(data)
First Name|Last Name|age
----------|---------|---
John      |Adams    |90
Henry     |Ford     |83
>>> data.height
2
>>> data.width
3 

常用方法

详情可见官方文档:
https://tablib.readthedocs.io/en/stable/api/#tablib.Dataset.remove_duplicates

lpop(),lpush(row, tags=[]),lpush_col(col, header=None)
是对列的相关操作
pop(),rpop(),rpush(row, tags=[]),rpush_col(col, header=None)
是对行的相关操作
remove_duplicates() 去除重复的记录
sort(col, reverse=False) 根据列进行排序
subset(rows=None, cols=None) 返回子Dataset
wipe() 清空Dataset,包括表头和内容

新增列

>>> data.append_col((90, 67, 83), header='age')

这样表就变成了:

first_namelast_nameage
JohnAdams90
GeorgeWashington67
HenryFord83
>>> print(data)
First Name|Last Name |age
----------|----------|---
John      |Adams     |90
George    |Washington|67
Henry     |Ford      |83 

对记录操作

>>> print(data[:2])
[('John', 'Adams', 90), ('George', 'Washington', 67)]
>>> print(data[2:])
[('Henry', 'Ford', 83)]

对属性操作

>>> print(data['first_name'])
['John', 'George', 'Henry']

>>> print(data)
First Name|Last Name |age
----------|----------|---
John      |Adams     |90
George    |Washington|67
Henry     |Ford      |83
>>> data.get_col(1)
['Adams', 'Washington', 'Ford'] 

删除记录

>>> del data[1]
>>> print(data)
First Name|Last Name|age
----------|---------|---
John      |Adams    |90
Henry     |Ford     |83 

可见记录也是从0开始索引的

删除记录操作也支持切片

删除属性

del data['Col Name']

导入数据

imported_data = tablib.Dataset().load(open('data.csv').read())

导出数据

csv

>>> data.csv
'First Name,Last Name,age\r\nJohn,Adams,90\r\nHenry,Ford,83\r\n'
>>> print(data.csv)
First Name,Last Name,age
John,Adams,90
Henry,Ford,83 
>> f = open('data.csv', 'w', encoding='utf-8')
>> f.write(data.csv)
>> f.close() 

这样便可成功将数据导出为csv文件。

json

>>> data.json
'[{"First Name": "John", "Last Name": "Adams", "age": 90}, {"First Name": "Henry", "Last Name": "Ford", "age": 83}]'
>>> print(data.json)
[{"First Name": "John", "Last Name": "Adams", "age": 90}, {"First Name": "Henry", "Last Name": "Ford", "age": 83}] 
>> f = open('data.json', 'w', encoding='utf-8')
>> f.write(data.json)
>> f.close()  

yaml

>>> data.yaml
'- {First Name: John, Last Name: Adams, age: 90}\n- {First Name: Henry, Last Name: Ford, age: 83}\n'
>>> print(data.yaml)
- {First Name: John, Last Name: Adams, age: 90}
- {First Name: Henry, Last Name: Ford, age: 83} 
>> f = open('data.yaml', 'w', encoding='utf-8')
>> f.write(data.yaml)
>> f.close()   

excel

>>> with open('people.xls', 'wb') as f:
...     f.write(data.xls) 

注意要以二进制形式打开文件

dbf

>>> with open('people.dbf', 'wb') as f:
...     f.write(data.dbf) 

高级使用

动态列

可以将一个函数指定给Dataset对象

import random

def random_grade(row):
    """Returns a random integer for entry."""
    return (random.randint(60,100)/100.0)

data.append_col(random_grade, header='Grade')

>>> data.yaml
- {Age: 22, First Name: Kenneth, Grade: 0.6, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Grade: 0.75, Last Name: Monke} 

函数的参数row传入的是每一行记录,所以可以根据传入的记录进行更一步的计算:

def guess_gender(row):
	"""Calculates gender of given student data row."""
	m_names = ('Kenneth', 'Mike', 'Yuri')
	f_names = ('Bessie', 'Samantha', 'Heather')
	name = row[0]
	if name in m_names:
		return 'Male'
	elif name in f_names:
		return 'Female'
	else:
		return 'Unknown'
>>> data.yaml
- {Age: 22, First Name: Kenneth, Gender: Male, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Gender: Female, Last Name: Monke}

tag

可以给记录添加tag,之后通过tag来过滤记录:

students = tablib.Dataset()
students.headers = ['first', 'last']
students.rpush(['Kenneth', 'Reitz'], tags=['male', 'technical'])
students.rpush(['Bessie', 'Monke'], tags=['female', 'creative'])
>>> students.filter(['male']).yaml
- {first: Kenneth, Last: Reitz}

3.举个小例子

现在有一个场景,我们需要将一份股票数据csv文件转化为json数据:

你只需要这样操作:

import tablib

data = tablib.Dataset().load(open('1.csv').read())

with open('data.json', 'w', encoding='utf-8') as f:
    f.write(data.json)

即可将其转化为json格式,它的特点在于轻量、简单。Pandas如果用来做这样的转化,则有些大材小用。

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

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

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

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

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

Python 数据分析与挖掘好帮手—Anaconda

用Python进行数据分析的时候,你会不会烦恼要安装那么多的模块?比如Pandas、Numpy、matplotlib、scipy等等,而当你接手的项目是由不同的Python版本编写的时候你又得下载那个Python版本,然后安装所需要的依赖,非常麻烦。

而使用Anaconda则能减少许多这样的烦恼,因为Anaconda具有以下特点:

1.自带180多个科学包,包括conda、numpy、scipy、pandas等。

2.极其方便的环境管理工具,可以创建**任意**版本的Python虚拟环境

为什么第2点的任意要加粗呢?其他的虚拟环境管理工具,如virtualenv是无法随意选择Python版本构建虚拟环境的,它们只能使用目前电脑上已有的Python版本构建虚拟环境。而Anaconda的环境管理工具则可以任意选择Python版本,它会自动下载相应的Python版本到虚拟环境中,免去用户自己手动下载安装Python的麻烦。

1.安装Anaconda

首先,前往Anaconda官方下载地址:
https://www.anaconda.com/distribution/#download-section

选择最新版本的Anaconda进行下载,要注意选择 64-Bit Graphical Installer. 当然这里指的只是Anaconda的默认Python版本,安装成功后,你可以创建任意版本的Python虚拟环境。

安装的过程中一路默认即可,不过如果是Windows用户,建议不要将Anaconda装在C盘,否则随着安装的包越来越多,会出现C盘空间不足的情况。

Windows用户注意:如果在 “Advanced Installation Options”中没有勾选“Add Anaconda to my PATH environment variable.”(添加Anaconda至我的环境变量),则无法在CMD或者powershell中使用conda命令,需要打开菜单中的 Anaconda Prompt 才能使用conda命令,因此请各位根据自己的情况选择勾不勾选。如果没勾选,但是后来又反悔了,可以通过配置环境变量来解决这个问题:

此处借用了别人的图,请注意路径要换成自己的路径。

相比之下,macOS系统就没有这么多繁琐的操作了,在终端(Terminal)中即可使用conda命令。

2.修改镜像源

这点很关键,由于conda默认镜像源是国外的,因此你 pip install 或者 conda install 安装模块的时候可能会等待非常久,如果你不想装个包比敲代码花费的时间还长,请一定要修改镜像源。

首先,在CMD(Windows)或Terminal(macOS)中,输入:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

Windows用户前往目录 C:\Users<你的用户名> 下显示隐藏文件会看到配置文件.condarc .

macOS用户则是在 ~/.condarc 中,可以在终端中用 sudo open ~/.condarc 打开。

然后会看到文件内容类似:

channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - defaults
show_channel_urls: true

– defaults 就是原来的源,我们可以直接把它去掉(建议去掉),只用清华源。然后保存,重启终端即可。

3.使用及切换环境

到这里,我们就可以开始使用conda环境了,默认情况下,现在Python命令都是基于conda的,因此你的终端或CMD前都会带有(base)的字样:

如果没有的话,可能是你在安装的时候把 “Register Anaconda as my default Python 3.7”去掉了。没关系,我们也可以用以下命令切换环境,Windows下在CMD中使用:

activate base

可切换到Anaconda默认环境, macOS和Linux则是:

conda activate base

其实两者是一样的原理,均通过conda来控制环境的使用。因为Windows中,输入完activate base后,它会自动补全一句conda.bat activate base, 如下图所示​:

在base环境下,默认自带pandas等180+个科学工具包,因此如果没有特别的需求,在这个环境下进行数据分析的开发即可。

4.创建虚拟环境

理想情况下,一直在base环境下开发是美滋滋的,但有时候我们会遇到开发的项目需要特别的版本,甚至是上古时期的2.x版本,这个时候anaconda强大之处也体现出来了,比如我的项目是 old_git, 需要Python2.7版本:

conda create --name old_git python=2.7

这时候便创建了一个python2.7的环境,叫做old_git,通过调用

activate old_git
# macOS/Linux则输入: conda activate old_git 

即可切换到这个环境,不过注意,这个新的环境是没有自带180+个科学工具包的,你需要自行安装所需模块。

5.其他命令

最常用的是显示已创建环境:

conda info --envs

其次是删除环境:

conda remove --name 环境名 --all

(由于我这里环境都比较重要就不演示了)

最后是安装包:

conda install xxx

其实conda install 和 pip install 都能达到安装包的效果,区别在于,前者使用conda的镜像源,后者使用pip镜像源。一般而言,推荐pip install,因为包更全一点。

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

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

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

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

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

Python 提取音乐频谱并可视化

你有没有经常好奇一些音乐软件的频谱特效是怎么做的,为什么做的这么好看?有没有想试试自己提取音乐频谱并可视化展现出来?今天,咱就结合上次的音乐剪辑操作:

Python 剪辑音乐就是这么简单

来可视化下面这首歌曲的频谱!

https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/04/2020040520354021.mp3

1.准备工作

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装本文所需要的依赖模块:

pip install pydub
pip install librosa

看到 Successfully installed xxx 则说明安装成功。

2.频谱展示

使用librosa和matplot,我们可以用10行代码完整地展示整个频谱:

import matplotlib.pyplot as plt
import librosa.display

# 音乐文件载入
audio_path = 'Fenn.mp3'
music, sr = librosa.load(audio_path)

# 宽高比为14:5的图
plt.figure(figsize=(14, 5))
librosa.display.waveplot(music, sr=sr)

# 显示图
plt.show()

不过,这样的频谱是整段音乐的,看起来非常难看,接下来我们使用 pydub 切割频谱,以获得更佳的效果。我们细分到0到1秒的区段来查看频谱:

import matplotlib.pyplot as plt
import librosa.display
import numpy as np
from pydub import AudioSegment

# 1秒=1000毫秒
SECOND = 1000
# 音乐文件
AUDIO_PATH = 'Fenn.mp3'

def split_music(begin, end, filepath):
    # 导入音乐
    song = AudioSegment.from_mp3(filepath)
    
    # 取begin秒到end秒间的片段
    song = song[begin*SECOND: end*SECOND]
    
    # 存储为临时文件做备份
    temp_path = 'backup/'+filepath
    song.export(temp_path)

    return temp_path

music, sr = librosa.load(split_music(0, 1, AUDIO_PATH))

# 宽高比为14:5的图
plt.figure(figsize=(14, 5))
librosa.display.waveplot(music, sr=sr)
plt.show() 

这下细是细了,但是还是太复杂了,其实我们做频谱的展示,只需要正值即可:

然后我们还可以进一步放大,比如说0.9秒到1秒之间的频谱:

# 放大
n0 = 9000
n1 = 10000

music = np.array([mic for mic in music if mic > 0])
plt.figure(figsize=(14, 5))
plt.plot(music[n0:n1])
plt.grid()

# 显示图
plt.show() 

这样好看许多,不过如果要达成QQ音乐那种效果,还是需要进行大量改造。

比如用精美的图像元素来填充替代、然后零值如何处理?如何让频谱更加平稳?此外,我们是静态的图像,还需要根据事件动态地延续波段。

用于生产的代码肯定比我们这简易的代码更加复杂,而且也不应该是暴力去除负值绘制图像。这些有兴趣的读者可以自行研究啦。

音乐相关教程:

Python 批量下载网易云音乐歌单

Python 制作音乐高潮副歌提取器

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化

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

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

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

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

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

如何基于Paddle训练一个98%准确率的抑郁文本预测模型

Paddle是一个比较高级的深度学习开发框架,其内置了许多方便的计算单元可供使用,我们之前写过PaddleHub相关的文章:

1.Python 识别文本情感就这么简单

2.比PS还好用!Python 20行代码批量抠图

3.Python 20行代码检测人脸是否佩戴口罩

在这些文章里面,我们基于PaddleHub训练好的模型直接进行预测,用起来特别方便。不过,我并没提到如何用自己的数据进行训练,因此本文将弥补前几篇文章缺少的内容,讲解如何使用paddle训练、测试、推断自己的数据。

2023-04-26更新:

提供一个5W行的数据源,数据结构请自行组合:https://pythondict.com/download/%e8%b5%b0%e9%a5%ad%e5%be%ae%e5%8d%9a%e8%af%84%e8%ae%ba%e6%95%b0%e6%8d%ae/

2024-04-26更新:

很多同学要源代码和模型,下载地址:

【源代码+模型】基于Paddle训练一个98%准确率的抑郁文本预测

1.准备

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

我们需要安装百度的paddlepaddle, 进入他们的官方网站就有详细的指引:
https://www.paddlepaddle.org.cn/install/quick

根据你自己的情况选择这些选项,最后一个CUDA版本,由于本实验不需要训练数据,也不需要太大的计算量,所以直接选择CPU版本即可。选择完毕,下方会出现安装指引,不得不说,Paddlepaddle这些方面做的还是比较贴心的(就是名字起的不好)

要注意,如果你的Python3环境变量里的程序名称是Python,记得将语句改为Python xxx,如下进行安装:

python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple

最后是安装paddlehub:

pip install -i https://mirror.baidu.com/pypi/simple paddlehub

然后为了用paddle的模型训练我们自己的数据,还需要下载他们的源代码:

git clone https://github.com/PaddlePaddle/models.git

比较大,大概400M。

2024-04-26更新:

很多同学要源代码和模型,下载地址:

【源代码+模型】基于Paddle训练一个98%准确率的抑郁文本预测

 

2. 数据预处理

这次实验,我使用了8000条走饭下面的评论和8000条其他微博的正常评论作为训练集,两个分类分别使用1000条数据作为测试集。

2.1 去重去脏

在这一步,我们需要先去除重复数据,并使用正则表达式@.* 和 ^@.*\n 去除微博@的脏数据。如果你是使用Vscode的,可以使用sort lines插件去除重复数据:

如果不是Vscode,请用Python写一个脚本,遍历文件,将每一行放入集合中进行去重。比较简单,这里不赘述啦。

正则表达式去除脏数据,我这里数据量比较少,直接编辑器解决了:

2.2 分词

首先,需要对我们的文本数据进行分词,这里我们采用结巴分词的形式进行:

然后需要在分词的结果后面使用\t隔开加入标签,我这里是将有抑郁倾向的句子标为0,将正常的句子标为1. 此外,还需要将所有词语保存起来形成词典文件,每个词为一行。

并分别将训练集和测试集保存为 train.tsv 和 dev.tsv, 词典文件命名为word_dict.txt, 方便用于后续的训练。

3.训练

下载完Paddle模型源代码后,进入 models/PaddleNLP/sentiment_classification文件夹下,这里是情感文本分类的源代码部分。

在开始训练前,你需要做以下工作:

1.将train.tsv、dev.tsv及word_dict.txt放入senta_data文件夹.

2.设置senta_config.json的模型类型,我这里使用的是gru_net:

3.修改run.sh相关的设置:

如果你的paddle是CPU版本的,请把use_cuda改为false。此外还有一个save_steps要修改,代表每训练多少次保存一次模型,还可以修改一下训练代数epoch,和 一次训练的样本数目 batch_size.

4.如果你是windows系统,还要新建一个save_models文件夹,然后在里面分别以你的每训练多少次保存一次的数字再新建文件夹。。没错,这可能是因为他们开发这个框架的时候是基于linux的,他们写的保存语句在linux下会自动生成文件夹,但是windows里不会。

好了现在可以开始训练了,由于训练启动脚本是shell脚本,因此我们要用powershell或git bash运行指令,Vscode中可以选择默认的终端,点击Select Default Shell后选择一个除cmd外的终端即可。

输入以下语句开始训练

$ sh run.sh train

4.测试

恭喜你走到了这一步,作为奖励,这一步你只需要做两个操作。首先是将run.sh里的MODEL_PATH修改为你刚保存的模型文件夹:

我这里最后一次训练保存的文件夹是step_1200,因此填入step_1200,要依据自己的情况填入。然后一句命令就够了:

$ sh run.sh eval

然后就会输出损失率和准确率:

可以看到我的模型准确率大概有98%,还是挺不错的。

5.预测

我们随意各取10条抑郁言论和普通言论,命名为test.txt存入senta_data文件夹中,输入以下命令进行预测:

$ sh run.sh test

这二十条句子如下,前十条是抑郁言论,后十条是普通言论:

好 崩溃 每天 都 是 折磨 真的 生不如死
姐姐   我 可以 去 找 你 吗
内心 阴暗 至极 … …
大家 今晚 都 是因为 什么 没睡
既然 儿子 那么 好     那 就 别生 下 我 啊     生下 我 又 把 我 扔下     让 我 自生自灭     这算 什么
走饭 小姐姐 怎么办 我该 怎么办 每天 都 心酸 心如刀绞 每天 都 有 想要 死 掉 的 念头 我 不想 那么 痛苦 了
你 凭 什么 那么 轻松 就 说出 这种 话
一 闭上眼睛 脑子里 浮现 的 就是 他 的 脸 和 他 的 各种 点点滴滴 好 难受 睡不着 啊 好 难受 为什么 吃 了 这么 多 东西 还是 不 快乐 呢
以前 我 看到 那些 有手 有 脚 的 人 在 乞讨 我 都 看不起 他们   我 觉得 他们 有手 有 脚 的 不 应该 乞讨 他们 完全 可以 凭 自己 的 双手 挣钱   但是 现在 我 有 手 有 脚 我 也 想 去 人 多 的 地方 乞讨 … 我 不想 努力 了 …
熬过来 吧 求求 你 了 好 吗
是 在 说 我们 合肥 吗 ?
这歌 可以 啊
用 一个 更坏 的 消息 掩盖 这 一个 坏消息
请 尊重 他人 隐私 这种 行为 必须 严惩不贷
这个 要 转发
🙏 🙏 保佑 咱们 国家 各个 省 千万别 再有 出事 的 也 别 瞒报 大家 一定 要 好好 的 坚持 到 最后 加油
我 在家 比 在 学校 有钱   在家 吃饭 零食 水果 奶 都 是 我 妈 天天 给 我 买   每天 各种 水果   还 可以 压榨 我弟 跑腿   买 衣服 也 是   水乳 也 是   除了 化妆品 反正 现在 也 用不上   比 学校 的 日子 过得 好多 了
广西 好看 的 是 柳州 的 满城 紫荆花
加油 一起 共同 度过 这次 难关 我们 可以
平安 平安 老天 保佑

得到结果如下:

Final test result:
0 0.999999 0.000001
0 0.994013 0.005987
0 0.997636 0.002364
0 0.999975 0.000025
0 1.000000 0.000000
0 1.000000 0.000000
0 0.999757 0.000243
0 0.999706 0.000294
0 0.999995 0.000005
0 0.998472 0.001528
1 0.000051 0.999949
1 0.000230 0.999770
1 0.230227 0.769773
1 0.000000 1.000000
1 0.000809 0.999191
1 0.000001 0.999999
1 0.009213 0.990787
1 0.000003 0.999997
1 0.000363 0.999637
1 0.000000 1.000000

第一列是预测结果(0代表抑郁文本),第二列是预测为抑郁的可能性,第三列是预测为正常微博的可能性。可以看到,基本预测正确,而且根据这个分数值,我们还可以将文本的抑郁程度分为:轻度、中度、重度,如果是重度抑郁,应当加以干预,因为其很可能会发展成自杀倾向。

我们可以根据这个模型,构建一个自杀预测监控系统,一旦发现重度抑郁的文本迹象,即可实行干预,不过这不是我们能一下子做到的事情,需要随着时间推移慢慢改进这个识别算法,并和相关机构联动实行干预。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


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

Python 批量转化彩色图片为黑白图片

最近遇到了一个新的情景,需要将彩色图片转化为黑白图片,如果手动地去转化一张一张图片,那就真的太原始人了。

用Python,咱只需要几行代码就可以在几秒内转化上千张图片。而且,这个功能的用途相当广泛,不仅能使图片变得深邃,而且还可以简化一些复杂模型的数学计算,具体可见第三部分的分析。

1.准备

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

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

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装本文所需要的依赖模块:

pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

看到 Successfully installed xxx 则说明安装成功。

2.编写代码

首先写一下我们的彩色图转单色图的转化函数,接收两个参数,一个是输入文件的路径,一个是输出文件路径:

from PIL import Image

def colorful_to_single(input_img_path, output_img_path):
    """
    彩色图转单色图
    :param input_img_path: 图片路径
    :param output_img_path: 输出图片路径
    """

    img = Image.open(input_img_path)
    # 转化为黑白图片
    img = img.convert("L")
    img.save(output_img_path) 

(又是注释比代码长系列)

然后将你需要转化的图片放到一个文件夹中,我这里命名该文件夹为imgs,然后指定一个输出文件夹 output,如下:

dataset_dir = 'imgs'
output_dir = 'output'

# 获得需要转化的图片路径并生成目标路径
image_filenames = [(
    os.path.join(dataset_dir, file_dir),
    os.path.join(output_dir, file_dir)
) for file_dir in os.listdir(dataset_dir)]

# 转化所有图片
for path in image_filenames:
    colorful_to_single(path[0], path[1])

这里比较难理解的可能是image_filenames,用到了列表推导式,即遍历所有dataset_dir里的文件:

for file_dir in os.listdir(dataset_dir) 

并将其和我们指定的目录以路径的形式链接起来:

os.path.join(output_dir, file_dir) 

最终生成一个数组,第一个元素是输入路径,第二个元素是输出路径:

image_filenames = [(
    os.path.join(dataset_dir, file_dir),
    os.path.join(output_dir, file_dir)
) for file_dir in os.listdir(dataset_dir)]

3.效果及用途

黑白效果就是这样的:

用途当然也有很多了,比如:

1.在深度学习分类图像的时候,如果并不需要考虑颜色的维度,可以先将图片转化为黑白图,简化运算复杂度。

2.黑白图片有的时候比彩色图片更具备冲击力,能够更加突出主题。

3.黑白图片有些时候也有美颜的作用,因为此时注意力的重点在于脸型,如果那个人的脸型特别好看,但是肤色比较差,这时候黑白照片就很有效果。

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


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