实战教程!用 Python 制作抖音爆款视频!

前几天在抖音上刷到一个慢慢变老的视频,播放量居然有 30W+,当时就在想这视频 Python 可不可以做?

经过一番搜索,小编找到了腾讯云的人脸年龄变化 API,上面介绍说只要用户上传一张人脸图片,基于人脸编辑与生成算法,就可以输出一张人脸变老或变年轻的图片,并支持实现人脸不同年龄的变化

准备工作

获取 API 秘钥

第一步,在注册账号之后,打开 API 密钥管理页面(https://console.cloud.tencent.com/cam/capi)获取到 SecretId 和 SecretKey。

第二步,安装腾讯云的 SDK

pip3 install tencentcloud-sdk-python

人脸属性

在人脸年龄变化 API 中有一个 AgeInfo 参数,它包含了 Age 和 FaceRect 两个属性,其中 FaceRect 属性必须填人脸在照片中基于左上角的 X、Y 坐标和人脸的高度与宽度。所以先要调用人脸检测与分析 API 得到这些数据。

下面的示例图是在百度图片中截取的。

import json
import base64
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.iai.v20200303 import iai_client
from tencentcloud.iai.v20200303 import models as models03

sid = "xxx"
skey = "xxx"
try

    filepath = '/Users/imeng/Downloads/face/face.png'
    file = open(filepath, "rb")
    base64_data = base64.b64encode(file.read())

    cred = credential.Credential(sid, skey) 
    httpProfile = HttpProfile()
    httpProfile.endpoint = "iai.tencentcloudapi.com"

    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    client = iai_client.IaiClient(cred, "ap-beijing", clientProfile) 

    req = models03.DetectFaceAttributesRequest()
    params = {
        "MaxFaceNum":2,
        "Action":"DetectFace",
        "Version":"2018-03-01",
        "Image": base64_data.decode()
    }
    req.from_json_string(json.dumps(params))
    resp = client.DetectFaceAttributes(req) 

    faceDetailInfos = resp.FaceDetailInfos
    for faceDetailInfo in faceDetailInfos:
        faceRect = faceDetailInfo.FaceRect
        print(faceRect)
except TencentCloudSDKException as err: 
    print(err) 

示例结果

{"X"62"Y"13"Width"145"Height"230}
{"X"426"Y"113"Width"115"Height"139}

修改年龄

在上面已经得到了各个人脸的 X、Y、Width、Height 属性,加上变老的年龄 Age,就可以请求年龄变化 API 了。

这里需要注意的是 models 模块,人脸检测 models 模块是在 tencentcloud.iai.v20200303 包下,人脸年龄变化的 models 是在 tencentcloud.ft.v20200304 下,两个 models 模块并不兼容。

import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ft.v20200304 import ft_client, models

cred = credential.Credential(sid, skey) 
httpProfile = HttpProfile()
httpProfile.endpoint = "ft.tencentcloudapi.com"
clientProfile.httpProfile = httpProfile
client = ft_client.FtClient(cred, "ap-beijing", clientProfile) 

req = models.ChangeAgePicRequest()

for age in range(7080):
params = {
    "Image": base64_data.decode(),
    "AgeInfos": [
        {
            "Age": age,
            "FaceRect": {
                "Y": faceDetailInfos[0].FaceRect.Y,
                "X": faceDetailInfos[0].FaceRect.X,
                "Width": faceDetailInfos[0].FaceRect.Width,
                "Height": faceDetailInfos[0].FaceRect.Height
            } 
        },
        {
            "Age": age,
            "FaceRect": {
                "Y": faceDetailInfos[1].FaceRect.Y,
                "X": faceDetailInfos[1].FaceRect.X,
                "Width": faceDetailInfos[1].FaceRect.Width,
                "Height": faceDetailInfos[1].FaceRect.Height
            } 
        }
    ],
    "RspImgType""base64"
}
req.from_json_string(json.dumps(params))
resp = client.ChangeAgePic(req) 
image_base64 = resp.ResultImage
image_data = base64.b64decode(image_base64)
file_path = '/Users/imeng/Downloads/face/{}.png'.format(age)
with open(file_path, 'wb'as f:
    f.write(image_data)
time.sleep(1)

示例结果

最后的视频可以将图片一张一张插入 PPT 幻灯片,点击保存为视频。

转自AirPython.

我们的文章到此就结束啦,如果你喜欢今天的 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实用宝典

Python 一键生成漂亮的生日快乐词云!

前段时间写了几篇关于生成词云的文章,其中包括:

Python 情人节超强技能 导出微信聊天记录生成词云

Python 绘制悼念的词云蜡烛

等等,但是这几篇文章的转化对象都必须是多词汇组成的,也就是说他们生成词云的条件是词组必须够多,只有一两个词的话无法生成完整词云。

最近遇到许多朋友有特殊的需求,他们只想把 【名字】和【生日快乐】两个词组在一起,祝他人生日快乐,不想弄太复杂的东西,基于前面两篇文章是无法做到的。今天我们就来说说如何用这么少的词汇生成漂亮的词云。

1.准备

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

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

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

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

pip install wordcloud==1.5.0
pip install scipy==1.1.0
pip install multidict==4.5.2
pip install matplotlib==2.2.4
pip install fire==0.2.1
pip install numpy==1.16.4

看到 Successfully installed xxx 则说明安装成功。或公众号后台回复生日快乐可获得本文全部代码,然后进入文件夹,输入一行命令安装所有依赖:

pip install -r requirements.txt

如果你不想折腾代码,安装完依赖后,输入以下命令就可以生成你的词云:

python birthday.py 图片位置 对象姓名 

如:

python birthday.py example.png 宝典哥

2.编写代码

首先是引入词云对象,并初始化【生日快乐】和对方姓名:

    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12) 

细心的读者可能发现了,我们在这里用了MultiDict,这主要是因为wordcloud只允许接受【字典】数据结构,而Python内置的字典不允许重复值,所以我们只能引入multidict模块。

然后是插入新的生日快乐词云和对方姓名:

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5)) 

然后我们需要对图片进行一些处理,现在网络上的图片很多都包含一些杂色,因此需要把这些杂色去掉:

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val 

然后引入图片,去除杂色:

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words) 

生成词云并渲染:

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show() 

完整代码如下:

# coding:utf-8
# Python 实用宝典
# 2020/03/23
import numpy
import multidict
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val

def gen_happy_birthday_cloud(file, name):
    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12)

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5))

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words)

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show()

# gen_happy_birthday_cloud('p2.png', '宝典哥')

3.整合一句运行

接下来,我们使用上次提到的 一行命令实现功能 将这个功能打包成输入命令就能运行的程序,比如:

python birthday.py 图片 宝典哥

在完整代码最后面加一行语句就行了:

import fire
fire.Fire(gen_happy_birthday_cloud) 

当然,别忘了还要import fire模块。最后实验一下:

python birthday.py example.png 宝典哥

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


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

Python 超方便超快速剪辑音乐

你没看错,Python剪辑音乐,只需要3行语句就能瞬间完成,比如我要剪辑33秒到1分10秒的音乐片段:

from pydub import AudioSegment
song = AudioSegment.from_mp3("end_of_time.mp3")
song[33,[object Object],1000].export('end_of_time_slice.mp3')

运行这个脚本,我们能瞬间完成剪辑:

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

对于Python而言,这个功能简直太基本了,难以言语的快。这段时间里,你的Adobe Audition 可能还没成功打开 。下面再介绍点更高级的玩法。

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

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

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

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

pip install pydub

看到 Successfully installed xxx 则说明安装成功。你还需要安装ffmpeg, 这个网络上有许多教程,这里可以看我们上次的提取音乐高潮文章。公众号后台回复音乐剪辑可获得本文全部代码。

1.音量变化

我们还可以修改上面剪辑的这段音乐的入场音量大小和退场音量大小:

from pydub import AudioSegment

# 1秒=1000毫秒
SECOND = 1000
# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")

# 取33秒到70秒间的片段
song = song[33*SECOND:70*SECOND]

# 入场部分提高6分贝, 退场部分减少5分贝
ten_seconds = 10 * SECOND
last_five_seconds = -5 * SECOND
beginning = song[:ten_seconds] + 6
ending = song[last_five_seconds:] - 5

# 形成新片段
new_song = beginning + song[ten_seconds:last_five_seconds] + ending

# 导出音乐
new_song.export('end_of_time_slice.mp3') 

听听看:

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

效果和预期的一致,想想看,如果这个你用专业的音乐编辑器来做,得画段切片、设置音量,然后保存,细思极恐,太费时间了!Python可能在你打开软件的这段时间里就完成了。

2.重复片段

如何重复我们开头说到的33秒到70秒这段音乐片段?可简单了,你只要会做乘法就行:

from pydub import AudioSegment
song = AudioSegment.from_mp3("end_of_time.mp3")
(song[33*1000:63*1000])*2.export('end_of_time_slice.mp3')  
https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019313832.mp3

没错,在pydub中,片段和数量之间的运算里加法调音量,乘法调长度,你记住了吗?

3.渐进渐出

有时候我们的耳朵需要时间来适应音量的变化,尤其是在看短视频的时候,音量忽大忽小实在是太没有用户体验了,这时候渐进渐出的剪辑就尤为关键:

from pydub import AudioSegment

# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")

# 提取片段
song = song[33*1000:70*1000]

# 渐进渐出
awesome = song.fade_in(5000).fade_out(3000)

# 导出音乐  
awesome.export('end_of_time_fade.mp3') 
https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019420140.mp3

4.反转音乐

这可能是最有趣和最可能产生特别效果的操作,它会让你完全不认得这首歌:

from pydub import AudioSegment

# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")[33*1000:70*1000]

# 翻转音乐
backwards = song.reverse()

# 导出音乐
backwards.export("end_of_time_reverse.mp3") 
https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2020/03/2020032019484564.mp3

当然,反转音乐后会变得惨不忍睹,这也很正常,原来的“正向规律 ” 倒转后,音调节奏也变了(不排除有特殊口味的人喜欢这种感觉呢)。

把这首歌折腾了这么久,还是得把原曲放给大家听听的。是 K-391 / Alan Walker / Ahrix 的 End of Time(由于网站服务器有限,音质不会太好,建议大家到专业音乐播放器里搜索聆听) :

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

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

音乐相关教程:

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

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

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

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

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

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


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

网飞公司(Netflix)是怎么用Python的?

本文译自网飞科技博客,原文:
https://netflixtechblog.com/python-at-netflix-bba45dae649e?gi=83b411a8aff

Netflix(网飞)是全球最大的视频流媒体平台,在除中国大陆地区之外的所有国家和地区都提供视频点播服务。Netflix是经营在线业务公司中的一个亮点。它成功地把传统的影像租赁业务和现代化的市场营销手段、先进的IT网络技术结合起来,从而开创了在线影像租赁的新局面。Netflix通过整合其自身的营销手段和最近的IT网络技术,成功地改变了消费习惯和打造了自己的品牌优势。

Netflix的技术本质上就是回答两个问题:

1. 如何提升用户观看体验?

2. 如何在内容上让用户喜欢?

而这两个问题,在Python的帮助之下,交了一份令人满意的答卷,让我们一起来看看 Python 在 Netflix 是如何应用的。

1.加快视频分发速度

为了加快视频的分发速度,网飞开发了一个名为 Open Connect 的内容分发网络(content delivery network,CDN),尽可能靠近用户,为客户改善流媒体体验,加快视频的下载速度。

而设计、构建和运营这个 CDN 基础设置所需的各种软件系统,其中很多都是用 Python 编写的。其有一个配置信息管理系统,里面跟踪网飞的网络设备库存:有哪些设备、哪些型号,用什么硬件组件,都位于什么位置。这些设备的配置由几个其他系统控制,包括数据源、设备配置的应用和备份。用于收集运行状况和其他运营数据的设备交互是另一个 Python 应用程序。

2.快速解决运营需求

网飞还用Python负责处理Netflix云的区域故障转移,流量管理,容量运营管理(管理内容可以维修的限制)等内容,使用的Python模块大致如下:

NumPy和SciPy

NumPy和SciPy是用于科学计算的库。Netflix使用这些Python库来执行数值分析,从而允许管理区域故障转移。

Boto3

Boto3是适用于Python的AWS(Amazon Web Services)的软件开发工具包(SDK)。这有助于Python开发人员将Python集成到AWS中,从而允许在基础架构中进行开发。

RQ(Redis队列)

这是一个Python库,可帮助跟踪队列中存在的任务并允许其执行,从而允许管理异步工作负载。

Flask

最后,Netflix使用Flask(Python Web开发库)API将所有先前的功能绑定在一起。

他们的工具主要是由 Python 构建的。编排故障转移的服务使用 numpy 和 scipy 来执行数值分析,boto3 对 AWS 基础设施进行更改,rq 用于运行异步工作负载,将其打包在一个 Flask API 的简单接口层中。放入 bpython shell 并进行临时制作的能力已经不止一次挽救了局面。

( bpython是一个不错的Python解释器的界面,开发者的目的是提供给用户所有的内置功能,很像现在的IDE(集成开发环境),但是将这些功能封装在在一个简单,轻量级的包里,可以在终端窗口里面运行,弥补原始解释器的不足。)

3.警报与统计、 自动修复

他们还用警报和统计分析工作中使用 Python。警报系统显示问题时,他们使用Python的许多统计和数学库(如 numpy、scipy、ruptures、pandas)来帮助自动分析 1000 多个相关信号。并开发了一个用于团队内外的时间序列相关系统 Spectator Python,以及分布式工作系统,用于并行处理大量的分析工作,以快速交付结果。

除此之外,他们也经常用Python来自动化任务、数据挖掘和清理的工具,也是可视化工作的方便工具。

4.信息安全

网飞信息安全团队使用 Python 为 Netflix 实现了许多高层次目标:安全自动化、风险分类、自动修复和漏洞识别等等。利用 Python 来保护使用 Bless 的 SSH 资源、利用 Python 帮助使用 Repokid 进行 IAM 权限调整、使用 Python 来帮助Lemur 生成 TLS 证书等等。

5.个性化推荐

说起个性化算法,当然少不了机器学习和深度学习。他们使用 Python 来训练一些 Netflix 影响用户体验关键方面的机器学习模型,如决策树、XGBoost等,而且在开发过程中,实现了一套自动化流程。

6.优化Python极限

为了使得生产效率提高,他们还利用机器学习开发了一个叫Metafolw的Python框架。这个框架提升了 Python 的极限,通过良好的设计和对Python代码的部分改造,成功实现了使用Python来获取几十G数据的可能性,大大提升了计算能力。

7.大数据编排

为了更好地编排大数据,他们还构建了一个用Python编写的事件驱动型平台,将许多个系统统一到该工具中,转化成事件流的形式进行调度,并具有模板化的作业类型。

因此,他们能够随时解耦微服务,而且通过这个平台,他们能够了解数据的流动状况,以及发生的所有事情。当然,Netflix 的系统之所以能够如此稳定,还有更多的技术因素在里面,这里就不能够再赘述了。有兴趣可以看看下面这本书。

《 混沌工程:Netflix系统稳定性之道 [Chaos Engineering]


文中涉及到的部分项目、库的官方地址:

Open Connect: https://openconnect.netflix.com/en/

bpython: https://bpython-interpreter.org/

nteract: https://nteract.io/

visualization tools: https://github.com/nteract/nteract/tree/master/packages/data-explorer

Spectator: https://github.com/Netflix/spectator-py

Security Monkey: https://github.com/Netflix/security_monkey

Bless: https://github.com/Netflix/bless

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


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

Python 小游戏—加农炮送特朗普上太阳

美股熔断历史上只发生过4次,上上次熔断和上一次熔断,还要追溯到2020年3月9日和2020年3月13日,那两天我的记忆很深刻,那感觉,仿佛就在几天前。

话又说回来了,特朗普可是说过狠话的:

这是在2015年竞选期间他发过的一条推特:“如果有一天道琼斯指数单日狂跌超过1000点,那当时的总统就应该被装进加农炮里,以极快的速度被射向太阳。不能找任何借口!”

嘻嘻,见过骗吃骗喝的,还第一次见骗太空游的。而且还骗了3次,这招高明。 不过,各大媒体很快辟谣,推特实际上是网友的p图,特朗普本人可没有立过这样的flag。

不过这真的是一个有趣的话题,今天我们就来用Python模拟一下,制作一个太空小游戏。

1.准备

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

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

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

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

pip install freegames
pip install turtle

看到 Successfully installed xxx 则说明安装成功。你可以在Python实用宝典公众号后台回复:加农炮的特朗普 获得本文完整数据和代码。

2.编写代码

原理很简单,就是用到了张特朗普的漫画图和freegames模块,以及turtle画图模块。turtle画图模块我们以前也写过不少文章,大家不了解可以看看:

1.Python turtle 画雪花
2.Python turtle 深入理解递归

2.1 模块加载与设定图像

首先,引入turtle模块,和freegames模块,我们这一次实验需要用到freegames模块里的向量vector(用于表示坐标)。

import turtle
from random import randrange
from freegames import vector

# 设定screen
screen = turtle.Screen()
screen.setup(420, 420, 370, 0)

# 加载trump图,并设为默认turtle
trump = '3.gif'
screen.addshape(trump)
turtle.shape(trump) 

2.2 准备画图

在开始画图之前,由于需要用特朗普头像作为移动点,我们需要隐藏原有的turtle对象,并设置不显示tracer,即特朗普移动的时候不画线。

最后设定当用户点击画布的时候,执行tap函数

turtle.hideturtle()
turtle.up()
turtle.tracer(False)
turtle.onscreenclick(tap) 

tap函数如下,即设定球体的位置和初始速度。

def tap(x, y):
    """
    回应屏幕点击
    :param x: x轴位置
    :param y: y轴位置
    """
    if not inside(ball):
        ball.x = -199
        ball.y = -199
        speed.x = (x + 200) / 25
        speed.y = (y + 200) / 25 

2.3 开始画图

这一部分的核心是move函数,不过在说道move函数前,我们要重点讲一下如何将原有端点换成特朗普的头像,那就是draw函数的功能:

def draw():
    """
    绘画出太阳和trump
    """
    turtle.hideturtle()
    turtle.clear()

    for target in targets:
        turtle.goto(target.x, target.y)
        turtle.dot(20, 'red')

    if inside(ball):
        turtle.showturtle()
        turtle.goto(ball.x, ball.y)

    turtle.update() 

还记得我们在一开始就将特朗普的头像设定为turtle的shape了吗?然后在move函数运行之前,又将turtle的点隐藏了起来,其实这个时候隐藏的就是特朗普的头像。而在开始移动的时候,我们仅需要将turtle重新show回来即可。因此核心语句便是:

turtle.showturtle()
turtle.goto(ball.x, ball.y)

这两句控制了头像的移动。

接下来看看move函数主体:

def move():
    """
    移动太阳和trump
    :return:
    """

    # 生成"太阳"球体
    if randrange(40) == 0:
        y = randrange(-150, 150)
        target = vector(200, y)
        targets.append(target)

    # 移动太阳
    for target in targets:
        target.x -= 0.5

    # 如果Trump在屏幕内,减速并移动
    if inside(ball):
        speed.y -= 0.35
        ball.move(speed)

    # 重新渲染"太阳"位置
    dupe = targets.copy()
    targets.clear()

    # 和Trump距离太近,则消去球体
    for target in dupe:
        if abs(target - ball) > 13:
            targets.append(target)

    # 渲染画布
    draw()

    # 没有目标了则终止游戏
    for target in targets:
        if not inside(target):
            return

    # 每隔50毫秒递归调用本函数
    turtle.ontimer(move, 50) 

其实注释写的挺清楚的,但是这里我们还是详细解释一下:

1.首先需要生成“太阳”球体,这里用到了vector,是一个用于生成坐标的函数,y是随机产生的,所以球体初始位置都在最右边(200, y)。
2.平移所有的太阳,包括新增的。
3.如果屏幕内存在Trump头像,令其移动。
4.重新渲染太阳位置,用新坐标代替,若和Trump距离过近,则消去该球体。
5.渲染所有的球体和Trump的新位置
6.如果没有球体了,则终止游戏,否则每50毫秒重新调用本函数。

基于这个逻辑大家也可以写一个属于自己的游戏哦。

3.玩笑终归玩笑

当然,这只是个游戏,Trump其实没说过加农炮送上太阳的那句话,不过近期美股的形式确实令人担忧。即使在美联储将利息降为0、大放水7000亿美元的情况下,依然无法挽回局势,不容乐观。

金融市场雪崩在劫难逃,站在金融周期的角度看,十年一次的洗盘即将到来,普通人如何保护好自己?那当然就是学习更多的本领啦!欢迎关注下方的Python实用宝典,优质的Python教程将源源不断奉出。

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


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

Python 计算 瑞幸和星巴克 谁的门店最多

如果不借助他人的数据,你能自己算出瑞幸咖啡和星巴克咖啡其各自的门店数量吗?

让你自己算出一个精确的值,你会使用什么方法进行计算一线城市门店数量?

难度高一点点,你怎么样才能知道二线城市的门店总数,甚至是全国的门店数量?

用我们今天的方法,你可以知道,瑞幸咖啡在一线城市的数量是:1634间,而星巴克则为:1587间

往下看答案之前,你可以想想有几种方法可以实现我们的目的。

1.准备

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

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

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

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

pip install requests

看到 Successfully installed xxx 则说明安装成功。你可以在Python实用宝典公众号后台回复:咖啡门店数 获得本文完整数据和代码。

2.获取门店数

怎么样,文章开头提出的问题你想到答案了吗?

其实很简单,那就是调用地图的接口进行门店搜索。 通过这个方法,我们不仅可以算出门店的数量,还能得到每个门店的对应位置,并且可以用来做后续的数据分析:

所以现在问题就转化为找到有提供搜索接口的地图供应商,而且这个接口得是免费的,因此我找了腾讯地图的接口:

https://lbs.qq.com/

你只需要上去注册账号,申请Key即可调用相关的接口,申请完了记得开webserviceAPI,选择签名校验的形式调用接口:

2.1 初始化

为了使用API,我们得先初始化请求链接及其所需要的参数:

class LocationSearch(object):

    def __init__(self, keyword: str):
        self.keyword = keyword
        self.key = '你的Key'
        self.sk = '你的校验sk'
        self.url = (
            'https://apis.map.qq.com/ws/place/v1/search?'
            'boundary=region({},0)&key={}&keyword={}'
            '&page_index={}&page_size=20'
        )

Key是在你申请API权限的时候就会分配给你的,而sk是在你选择 签名校验 的形式调用接口时分配给你的。

那么我们如何用这两个数据请求接口呢?请看下面这个函数:

def request_data(self, location: str, page: int):
    """
    请求接口数据
    Arguments:
        location {str} -- 地点
        page {int} -- 第几页
    
    Returns:
        {list} -- 该页该地点的数据
        {int} -- 该地点结果总数
    """
    # 拼接链接
    url = self.url.format(location, self.key, self.keyword, page)
    # 获得数字签名,并将签名加到链接后面进行请求
    wait_sig = url.split('qq.com')[1] + str(self.sk)
    sig = hashlib.md5(wait_sig.encode('utf-8')).hexdigest()
    res = requests.get(url + '&sig=' + sig)
    # 获得数据返回
    pois = res.json()['data']
    # 避免请求上限
    time.sleep(0.2)
    return pois, res.json()['count'] 

首先是将初始化的请求链接拼接起来,然后由于需要签名校验,因此我们得如下进行操作:

GET请求分为:域名,请求路径和参数三个部分,用于签名计算的有:
请求路径: /ws/place/v1/search?
请求参数: boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20
注意{}是待填充的

1. 首先对参数进行排序:按参数名升序(本例结果为 boundary 在前,key在后,如果第一个字母相同,要依据第二个字母升序):
boundary=region({},0)&key={}(….后面略)

2. 签名计算(sig):
请求路径+”?”+请求参数+SK进行拼接,并计算拼接后字符串md5值,即为签名(sig):
要求:请求参数必须是未进行任何编码(如urlencode)的原始数据
md5(” /ws/place/v1/search?boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20你的SK“)

计算得到结果类似为:22dxxxxxxxxxxxxxx2b0bcc0e50

3. 生成最终请求:将计算得到的签名sig,放到请求中(参数名即为:sig):
https://apis.map.qq.com/ws/place/v1/search? boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20&sig= 22dxxxxxxxxxxxxxx2b0bcc0e50

注意:计算 sig 要使用原始参数值,不要进行任何编码,但最终发送时的参数,是需要时行url编码的

最后拿到返回的值,里面带有所有结果的地理位置及结果的数量。

2.2 按地点返回结果

这一部分其实很简单,就是调用2.1的函数,然后实现分页保存变量,最后输出门店数量,返回数据。

def get_single_location(self, location: str):
    """
    获得单个地点的数据
    
    Arguments:
        location {str} -- 地点
    
    Returns:
        {list} -- 该地点某关键词的所有数据
        {int} -- 该地点某关键词的所有数量
    """
    page = 1
    location_data = []
    pois, total = self.request_data(location, page)
    for poisition in pois:
        location_data.append(poisition)
    # 如果有多页
    while (total / 20) > page:
        pois, _ = self.request_data(location, page)
        for poisition in pois:
            location_data.append(poisition)
        page += 1
    print(f'{self.keyword} {location} 门店总数为:{total}')
    return location_data, total 

计算一线城市的结果如下:

F:\push\20200315>python scrapy.py
瑞幸咖啡 北京 门店总数为:492
瑞幸咖啡 上海 门店总数为:581
瑞幸咖啡 广州 门店总数为:301
瑞幸咖啡 深圳 门店总数为:260

2.3 汇总结果并保存

接下来我们需要汇总2.2计算到的每个城市的数据,保存到json文件,并计算总数。

def get_cities_data(self, cities: str):
    """
    获得所有城市某关键词的数据
    
    Arguments:
        cities {list} -- 城市列表
    """
    result = []
    keyword_count = 0
    for city in cities:
        # 获得该城市的所有门店和总数
        data, count = self.get_single_location(city)
        keyword_count += count
        result.extend(data)
    print(f'{self.keyword} 一线城市门店总数为:{keyword_count}')
    # 导出数据
    with open(f'{self.keyword}.json', 'w') as my_file:
        json.dump(result, my_file, ensure_ascii=False) 

最终可以获得一个 瑞幸咖啡.json 的文件,里面存有每个城市的咖啡店精确位置,并输出一个总数,这样调用即可:

if __name__ == '__main__':
    cities = ['北京', '上海', '广州', '深圳']

    loc = LocationSearch('瑞幸咖啡')
    loc.get_cities_data(cities)

    loc = LocationSearch('星巴克咖啡')
    loc.get_cities_data(cities)

F:\push\20200315>python scrapy.py
瑞幸咖啡 北京 门店总数为:492
瑞幸咖啡 上海 门店总数为:581
瑞幸咖啡 广州 门店总数为:301
瑞幸咖啡 深圳 门店总数为:260
瑞幸咖啡 一线城市门店总数为:1634

星巴克 北京 门店总数为:380
星巴克 上海 门店总数为:797
星巴克 广州 门店总数为:209
星巴克 深圳 门店总数为:201
星巴克 一线城市门店总数为:1587

看来瑞幸咖啡一线城市里的门店数量已经超过星巴克了,不愧是割资本主义国家韭菜,造福中国老百姓的企业啊!

3.扩展

就像文章开头所提到的,如果你需要算出每个城市的咖啡店数量其实也很简单,咱可以调用下面这个接口请求腾讯地图的所有行政区数据,获得所有城市的名称:

https://apis.map.qq.com/ws/district/v1/list

不过我已经dump了一个,大家在Python实用宝典公众号后台回复:咖啡门店数 即可获得。

使用这一个,你只需要读取该csv文件提取所有城市名,然后放入cities变量中进行计算,如下代码所示:

if __name__ == '__main__':
    with open('cities.csv', 'r', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)
        cities = [row[0] for row in reader]

    loc = LocationSearch('瑞幸咖啡')
    loc.get_cities_data(cities)

    loc = LocationSearch('星巴克咖啡')
    loc.get_cities_data(cities)

不过,请注意一些特殊情况,比如说那个城市没有数据的时候,接口可能不会返回date数据,这时候要用字典的get方法进行处理:

# pois = res.json()['data']
pois = res.json().get('data', []) 

不过如果你要计算全国的数据的话,这个方法并不可靠,因为无法避免山寨店的存在,山寨店一样也会被记入到腾讯地图中,而一线城市的监管严格,比较少出现山寨店的情况,因此可以用这个方法计算。

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


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

Python 精美俄罗斯方块开源项目

最近想找一些Python相关的游戏开发例子,正好在itch.io上闲逛看到这个俄罗斯方块项目,瞬间被惊艳到了。作者是 Mikhail ,项目地址是:
tetris_for_two: https://gitlab.com/2pi360/tetris_for_two

1.游戏介绍

下面就给大家介绍一下这个用Python写的俄罗斯方块具体功能。它一共有七个游戏模式:

1. 单人模式
2. 普通双人模式
3. 镜像双人模式(即掉落方块都一样)
4. 双人加速模式(每消去一行都会给对方加速)
5. 双人交换控制模式(一次控制自己的方块,一次控制对方的)
6. 双人平衡模式(会改变对方的容量)
7. 双人单容器模式

没错,是不是被这丰富的游戏模式震惊到了?而且这款游戏的界面设计也是相当简洁舒服(而且玩这样的Python开源游戏,你永远不会被广告气到):

不仅如此,除了wasd和上下左右键,它还支持用游戏手柄(仅一个)进行游戏,并且能切换两个玩家的按键设置:

双人模式类似如下, 非常适合小情侣之间消耗时光哦(如果你们都喜欢玩俄罗斯方块的话)

尤其是双人协作模式,两个人一起解决问题也是增进感情的好方法:

还有其他几种游戏模式,大家可以上 itch 上下载游戏体验,或者在公众号后台回复 俄罗斯方块 下载完整源代码和游戏包(各个系统都有)。

2.源码剖析

当然,我们首要目的还是学习这款游戏的源代码,下面就给大家介绍一些这款游戏的部分核心代码。下载该开源项目后,你会发现它的py文件分布如下:

│ base.py
│ game_modes.py
│ main.py
│ run_to_release.py
│ tetris.py
│ … ….
├─assets
│ … …

└─screens
… …

其中,main.py是程序的入口点,首先看看模块引入,sys的引入是当然的,游戏结束的时候需要调用

sys.exit()

使得Python程序正常退出。pygame是这个游戏的引擎,是一个比较老的基于Python的2D游戏引擎,但也因为存在时间长,所以已经是一个很成熟且易上手的2D游戏开发库 。

作者自己写了两个模块,一个是base,里面有画布配置、按键配置、玩家配置等等一系列游戏的基础设置。而 game_modes 则是七种游戏模式的逻辑所在模块,里头还引用了tetris.py,这个模块定义了整个俄罗斯方块旋转的方法及其数据结构。

不过由于时间关系,我们重点看看base里的主循环main_loop:

pygame.time.Clock() 用于配置游戏的帧数,Clock.tick(frameate) 代表每秒framerate帧运行,也就是说,每秒不会执行超过 framerate 次循环 。这个参数的值,我们可以在主函数里看到是600. 也就是这个循环每秒不会超过600次。

pygame.event.get() 是pygame游戏引擎的事件处理器,它用于处理所有的事件,好像打开大门让所有的人进入,然后我们可以根据事件不同的属性做相应的操作,如 event.type == pgl.KEYDOWN 表示键盘被按下时,执行条件中的语句:

pressed_keys.add(event.key) 

于是便将其加入到pressed_keys集合中,yield返回生成器,也就是说只要程序不被终止,这个函数就会不断地返回四个值: events, time_passed, pressed_keys 或 {(0, 0)}。events就是用户触发的事件,time_passed就是这些事件的时长,pressed_keys即用户按下的键。

这样就完成了一次用户事件的传递,然后再又后端对用户的事件进行处理,展示在游戏当中。当然,更复杂的还在后面,这里只是一个简单的事件处理,当然也是最重要的事件处理部分,如果大家有兴趣的话,可以 在公众号后台回复 俄罗斯方块 下载完整源代码进行学习。

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


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

Python 机器学习预测泰坦尼克号存活概率

在泰坦尼克号上你能活下来吗?Python告诉你!

泰坦尼克号是英国的一艘客轮,在1912年4月的一个清晨,其从南安普顿出发,在行驶至目的地纽约的途中与冰山相撞后沉没,船上估计共有2224名乘客和船员,死亡1500多人,成为现代历史上最严重的和平时期海上灾难。

今天,我们将在著名的泰坦尼克号数据集上创建机器学习模型,这个数据集提供了有关泰坦尼克号上乘客的数据,比如经济状况、性别、年龄等等,让我们组合这些特征,构建一个根据参数预测某些人是否能够在当时那种情况下存活的机器学习模型,甚至可以用来测测自己存活的概率。

1.准备

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

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

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

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

pip install numpy
pip install pandas
pip install seaborn
pip install matplotlib
pip install scikit-learn

看到 Successfully installed xxx 则说明安装成功。啊,别忘了,还要下载数据集,你可以上kaggle官网进行下载,也可以在Python实用宝典公众号后台回复:泰坦尼克号 获得本文完整数据和代码。

2.分析基本数据

在开始使用机器学习进行分析前,我们需要先做一些常规的数据分析,比如缺失值检测、特征数量、基本关联分析等。

2.1 缺失值

首先是缺失值检测,这样的数据集不可能没有缺失值,我们在开始机器学习分析之前就应该把缺失的数据情况分析清楚。

这时候就要善用工具了:7行代码巧用Python热力图可视化表格缺失数据,丰富的知识积累在这个时候就能派上用场。生成热力图:

可见,cabin和Age的缺失值最多,这两列数据到了不得已的情况的话需要删除掉。还有Embarked有几个缺失值,这种情况好处理,我们用填充的方法就可以解决。热力图代码:

2.2 找到特征变量

这一小节,我们重点要找出哪些变量能使得乘客的存活率更高,比如年龄和性别、上船的位置、等等。

首先从年龄、性别上进行分析,根据训练集绘制如下的分析图:

我们可以看到,男性的死亡率其实更高,大体体现了让女性和儿童先逃亡的原则。对于5到18岁的男性而言,存活下来的几率似乎非常低,不过这可能是因为船上这个年龄段的人数少导致的。

再往下看,客舱等级和上船地点是否会对生存率造成影响?请看下图,Embarked是上船港口,pclass是客舱等级,数字1为头等舱。

可以看到,头等舱乘客的存活率高于其他舱的乘客,而且,C港口上岸的人男性存活概率大于女性,这不得不让人怀疑C港口乘客的品德了。

还有一点,亲戚越多是不是越可能存活呢?

可以看到,亲戚数量在1到3的人最有可能存活,不过,大于3之后的存活率可就不太好看了。

这部分可视化的代码如下:

3.机器学习预测

首先我们得根据刚刚的数据分析进行数据预处理,去除掉对我们模型没有帮助的数据【 乘客ID 】。

此外,【cabin】 实在是缺太多了,我们在这里也把它们都去掉。

【name 】 维度,名字要数字化才能分析,为了简化步骤,这里也去除掉。

还要去掉的一个是【Ticket】,都是唯一值,对我们而言没有意义,去除掉。

3.1 补全缺失数据

当然还得补完整我们的缺失值。根据年龄的平均值和标准差求得年龄的随机数,填充缺失的年龄数据。登船点均用S地来替代。

3.2 数字化数据

这里我们一共需要数字化三个维度:

1.票价,从浮点型转整形
2.性别转数字
3.上岸点转数字

不得不说,pandas是真的方便。Map就完事了。

3.3 单值转段值

由于年龄是一个一个的数字,在数据量不够大的情况,这样一个一个的数字没太大意义,我们要按照年龄段进行划分,票价也是如此,我们一起转化了:

3.4 创建模型

终于到了关键点了,然而这里是整个第三节最简单的部分,因为sklearn模块已经帮我们包装好了所有需要做的东西,我们需要做的仅仅是调用模块、传入数据训练、测试。

我们使用随机森林模型(说实话如果没有sklearn,这个模型能写到我头秃),关于随机森林的介绍可以看这一篇文章,其实就是解决了决策树的过拟合问题,这篇文章讲得通俗易懂:
https://blog.csdn.net/mao_xiao_feng/article/details/52728164

训练和测试的代码如下:

准确率如下:

>> python 1.p
0.9034792368125701

准确率有90%,这是挺高的准确率了,让我们把自己的情况带入进去,看看能不能存活,最终数据格式是这样的,你只需要把自己的情况带入,然后往测试数据追加属于你的一行即可:

比如我应该会坐二等舱(其实是三等舱,但是想想我都坐泰坦尼克号了为什么不坐二等舱?);Sex为 1 (男性),Age在范围 3 中(老了啊);SibSp是在船兄弟姐妹配偶的数量,Parch是在船父母、儿女数量,由于我可能是一个人出游,这里我们都设为 0,然后票价Fare应该是 2,Embarked随意选0.

>> python 1.py
1

天啊,我竟然能活下来,不容易 (滑稽,不知道是不是换了个舱的缘故) 。大家也试试看吧。完整代码太长了,在这里就不放出来了,大家可在Python实用宝典公众号后台回复 泰坦尼克号 获取。

本文参考自 https://towardsdatascience.com/predicting-the-survival-of-titanic-passengers-30870ccc7e8

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


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

有趣好用的Python教程

退出移动版
微信支付
请使用 微信 扫码支付