标签归档:Python数据分析

Python 量化投资实战教程(1) — Backtrader 教程

量化投资系列文章:

Backtrader 教程 — Python 量化投资原来这么简单(1)

Python 量化投资原来这么简单(2) —MACD策略(+26.9%)

Python 量化投资原来这么简单(3) —A股回测MACD策略

Github仓库:https://github.com/Ckend/pythondict-quant


都说 Python 量化投资 非常好用,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略。

Backtrader是一个基于Python的自动化回溯测试框架,作者是德国人 Daniel Rodriguez,是一个易懂、易上手的量化投资框架。今天我们就来试试用Backtrader进行简单的量化策略回溯。

当然,第一篇文章将会使用最简单的投资策略给大家起个头。通过学习这一篇文章,你将能学会以下这个简单的量化策略:

买入:五日价格移动平均线(MA5)和十日价格移动平均线(MA10)形成均线金叉(MA5上穿MA10)原理:最近处于涨势

卖出: 五日价格移动平均线(MA5)和十日价格移动平均线(MA10)形成均线死叉(MA5下穿MA10)原理:最近处于跌势

这个策略真的有用吗?普通人可能要炒一辈子股才能发现它的实际作用,而使用Python进行量化验证,则能迅速得到答案。

1.准备

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

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

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

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

pip install backtrader

看到 Successfully installed xxx 则说明安装成功。本文完整数据和源代码可在公众号后台回复 量化投资一 进行下载。

2.基础使用

在开始之前,你必须要知道backtrader的数据结构特点:

self.dataclose[0] # 当日的收盘价
self.dataclose[-1] # 昨天的收盘价
self.dataclose[-2] # 前天的收盘价

这一点我在一开始使用的时候也被作者的逻辑震惊了,原来还能这么玩,总而言之,请记住这个特点,否则你可能会完全看不懂策略。

2.1 资金与佣金

Backtrader 初始化模型后,即可通过broker(经纪人)来设定初始资金,如下所示:

# -*- coding:utf-8 -*-
# Python 实用宝典
# 量化投资原来这么简单(1)
# 2020/04/12

import backtrader as bt

if __name__ == '__main__':

    # 初始化模型
    cerebro = bt.Cerebro()
    # 设定初始资金
    cerebro.broker.setcash(100000.0)

    # 策略执行前的资金
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

    cerebro.run()

    # 策略执行后的资金
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

现实生活中的股票交易里,每次交易都需要支付一定的佣金,比如万五(交易额每满一万元收取5元佣金)万三等,在Backtrader里你只需要这么设定即可:

cerebro.broker.setcommission(0.005)

设定需要设定每次交易买入的股数,可以这样

cerebro.addsizer(bt.sizers.FixedSize, stake=100)

2.2 加载数据

Backtrader 将数据集称作为 Data Feeds,默认的数据集是yahoo的股票数据,通过以下方式可以加载:

    data = bt.feeds.YahooFinanceCSVData(
        dataname='数据文件所在位置',
        fromdate=datetime.datetime(2000, 1, 1),
        todate=datetime.datetime(2000, 12, 31)
    )

当然,载入自己的数据也是可以的,只不过你需要设定每个列的含义,比如开盘价在第4列,则open=3(从0开始算起),如下所示:

    data = bt.feeds.GenericCSVData(
        dataname='数据文件所在位置',
        datetime=2,
        open=3,
        high=4,
        low=5,
        close=6,
        volume=10,
        dtformat=('%Y%m%d'),
        fromdate=datetime(2010, 1, 1),
        todate=datetime(2020, 4, 12)
    )

下面,咱会使用自己的数据进行回测,这样才够有代入感。

2.3 构建策略

使用backtrader构建策略是一件很简单的事情,你只需要继承backtrader的策略类,并重写部分方法,就能实现策略。比如说重写属于我们自己的log函数:

class TestStrategy(bt.Strategy):
    """
    继承并构建自己的bt策略
    """

    def log(self, txt, dt=None, doprint=False):
        ''' 日志函数,用于统一输出日志格式 '''
        if doprint:
            dt = dt or self.datas[0].datetime.date(0)
            print('%s, %s' % (dt.isoformat(), txt))

最重要的是,重写我们自己的交易策略,比如咱在开头提到的均线金叉死叉策略

class TestStrategy(bt.Strategy):
    """
    继承并构建自己的bt策略
    """

    def next(self):
        # 记录收盘价
        self.log('Close, %.2f' % self.dataclose[0])

        # 是否正在下单,如果是的话不能提交第二次订单
        if self.order:
            return

        # 是否已经买入
        if not self.position:

            # 还没买,如果 MA5 > MA10 说明涨势,买入
            if self.sma5[0] > self.sma10[0]:
                self.log('BUY CREATE, %.2f' % self.dataclose[0])
                self.order = self.buy()

        else:
            # 已经买了,如果 MA5 < MA10 ,说明跌势,卖出
            if self.sma5[0] < self.sma10[0]:
                self.log('SELL CREATE, %.2f' % self.dataclose[0])
                self.order = self.sell()

有用吗?待会儿我们回测后就知道了。

2.4 添加指标

backtrader内置了许多指标的计算方法,比如移动平均线、MACD、RSI等等,我们这一篇文章仅需要移动平均线MA,设置方法如下:

self.sma5 = bt.indicators.SimpleMovingAverage(
            self.datas[0], period=5)

其中,datas[0]是第一个数据集,period是指多少天的移动平均线,比如5,则返回MA5的相关数据。

3.策略回测

为了验证我们开头提到的策略,咱使用了 贵州茅台600519.SH 在2020年1月1日至今(2020/04/12)的股票数据,完整数据和源代码可在公众号后台回复 量化投资一 进行下载。

将数据命名为600519.csv,保存在当前文件夹下,主函数如下:

if __name__ == '__main__':

    # 初始化模型
    cerebro = bt.Cerebro()

    # 构建策略
    strats = cerebro.addstrategy(TestStrategy)
    # 每次买100股
    cerebro.addsizer(bt.sizers.FixedSize, stake=100)

    # 加载数据到模型中
    data = bt.feeds.GenericCSVData(
        dataname='600519.csv',
        fromdate=datetime.datetime(2010, 1, 1),
        todate=datetime.datetime(2020, 4, 12),
        dtformat='%Y%m%d',
        datetime=2,
        open=3,
        high=4,
        low=5,
        close=6,
        volume=10
    )

    cerebro.adddata(data)

    # 设定初始资金和佣金
    cerebro.broker.setcash(1000000.0)
    cerebro.broker.setcommission(0.005)

    # 策略执行前的资金
    print('启动资金: %.2f' % cerebro.broker.getvalue())

    # 策略执行
    cerebro.run()

最后补全策略就完成了,我们的backtrader策略如下,为了公众号的可读性,这里去掉了部分不重要的代码,详细的代码可阅读原文或后台回复量化投资一下载:

class TestStrategy(bt.Strategy):
    """
    继承并构建自己的bt策略
    """

    def log(self, txt, dt=None, doprint=False):
        ''' 日志函数,用于统一输出日志格式 '''
        if doprint:
            dt = dt or self.datas[0].datetime.date(0)
            print('%s, %s' % (dt.isoformat(), txt))

    def __init__(self):

        # 初始化相关数据
        self.dataclose = self.datas[0].close
        self.order = None
        self.buyprice = None
        self.buycomm = None

        # 五日移动平均线
        self.sma5 = bt.indicators.SimpleMovingAverage(
            self.datas[0], period=5)
        # 十日移动平均线
        self.sma10 = bt.indicators.SimpleMovingAverage(
            self.datas[0], period=10)

    def notify_order(self, order):
        """
        订单状态处理

        Arguments:
            order {object} -- 订单状态
        """
        if order.status in [order.Submitted, order.Accepted]:
            # 如订单已被处理,则不用做任何事情
            return

        # 检查订单是否完成
        if order.status in [order.Completed]:
            if order.isbuy():
                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            self.bar_executed = len(self)

        # 订单因为缺少资金之类的原因被拒绝执行
        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('Order Canceled/Margin/Rejected')

        # 订单状态处理完成,设为空
        self.order = None

    def notify_trade(self, trade):
        """
        交易成果
        
        Arguments:
            trade {object} -- 交易状态
        """
        if not trade.isclosed:
            return

        # 显示交易的毛利率和净利润
        self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
                 (trade.pnl, trade.pnlcomm), doprint=True)

    def next(self):
        ''' 下一次执行 '''

        # 记录收盘价
        self.log('Close, %.2f' % self.dataclose[0])

        # 是否正在下单,如果是的话不能提交第二次订单
        if self.order:
            return

        # 是否已经买入
        if not self.position:
            # 还没买,如果 MA5 > MA10 说明涨势,买入
            if self.sma5[0] > self.sma10[0]:
                self.order = self.buy()
        else:
            # 已经买了,如果 MA5 < MA10 ,说明跌势,卖出
            if self.sma5[0] < self.sma10[0]:
                self.order = self.sell()

    def stop(self):
        self.log(u'(金叉死叉有用吗) Ending Value %.2f' %
                 (self.broker.getvalue()), doprint=True)

这份代码看起来很长,但其实把注释去掉后,实现的是很简单的逻辑。效果如何?看下图就知道了:

可以看到,我们初始资金是100万,每次交易100股,虽然偶尔有盈利,如果严格按照这个策略执行十年,最后会亏损5万元。当然,现实生活中,有时候情形好你肯定会加仓,情形差你会减仓,而这里暂时只是一个简单的买入卖出策略。

但是这种简单的实现方式,往往最能帮助你理性地分析该策略的合理性,如果说一个策略总是需要你主观地去加仓、减仓,那该策略势必存在问题。真正好的策略,从概率上来讲,简单回测的结果总会是盈利的。

所以这种单纯的、简单的均线金叉死叉策略有用吗? 我认为效果有限。网上策略很多,大家也可以试试别的策略,如果有好用的,记得告诉我(滑稽)。

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

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实用宝典

AO3被封的冤不冤?可视化数据分析《下坠》

AO3是一个外网自由创作网站,全称为 Archive of Our Own 其在Alexa的世界排名居于第690名,是雨果最佳相关作品奖的获得者。作为一个非盈利性的开源同人小说数据库网站,站内的文章均由网友贡献,因此也没有核查机制。

1月30日,网友“博君一肖”在AO3发布并连载了一篇同人文《下坠》,并在微博同步上传了这篇文章,而且自设了预警,希望接受不了的人不要点开。

几天后,这篇文章连载到12章,而且微博原文包含了ao3网站和lofter app链接,引起了大量博肖cp粉热转。

26日,许多粉丝觉得该cp文中含有侮辱性文字,无法接受这样的文字,于是开始撕X,网上举报阵营和lof阵营开始对线,互相口吐芬芳,展现了中华民族几千年来的文化底蕴。

事件持续发酵,最终闹到了某办,某办一看,我X,原来还有这个漏网之鱼,顺手就给他封了。真的太冤了,不过也不能说人家乱封,为什么呢?因为同人文大多是读者在原作的基础上把某些作品里的人物放在新的环境里,以展现自己和原作不同的观念,而大多数时候,这些观念最终都会掺杂色情因素。看看我们下文对《下坠》的分析就知道了。

本文完整分析代码可在公众号后台回复:下坠 获得。本文不详细分析代码,不过这份代码的知识,你可以在这两篇文章里学习到:

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

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

1.词频统计

我们利用Python里的jieba分词、matplotlib模块分析整篇文章词汇,并提取词频前20的词语,得到结果如下:

确实,涉及到两位明星的词语是最多的,其次是阿丽姐(不知道是不是作者的化身)。赞赞在其中是女性角色,难怪粉丝们暴跳如雷。这样分析,似乎看不出太多的内含,我们把维度细化一点。

从敏感角度看,这个词汇频率会是怎样的呢?由于纯洁的我实在是接受不了,因此打了点马赛克(如果这样你都能猜出是什么词….嗯…建议多看看天线宝宝):

经过统计,文章出现一共20367个非黄色词汇,284个涉黄词汇。涉黄词汇出现概率约为1.4%,也就是说每100个词汇里就会出现一次黄词,这个概率相当高了,感觉《挪威的森林》略逊一筹,《失乐园》大可一战。

最后,来个词云结束这一部分:

2.句型分析

我们使用Lstm,按行对整片文章进行分析,看看这些句子呈现的情感特点是否有某边倒的倾向,其中,当分为正面信度大于0.7,或负面信度大于0.7的时候分别分到正面分类和负面分类,其他情况为中性:

得到结果如下:

>>{‘neg’: 988, ‘pos’: 332, ‘mid’: 471}

负面的句子占了55%,文章负面情绪较多。负面情绪只是衡量一篇文章的情感倾向,无法说明什么。

接下来才是关键,识别句子的涉黄程度,同样地,设定概率置信度大于0.7的时候进行分类:

获得结果如下:

>> {‘porn’: 280, ‘not_porn’: 1511}

1800条句子中,280条语句涉黄,概率高达16%. 每100条句子中就有约16条黄色片段,《失乐园》可能都甘拜下风啊。到这里,大家可能都会觉得这篇同人文被举报是非常正常的(尽管粉丝们不满的是某位明星被当成女性角色)。

当然,大家如果感兴趣还可以用词法分析工具分析文章中的攻防次数,非常有意思,但是涉及到敏感词汇,我这里就不再展开了(逃)。本文完整分析代码可在公众号后台回复:下坠 获得。

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


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

你的10W块放哪里能赚最多钱?

现在许多人都想学会理财并进行适当的投资,从而增加“睡后收入”,迈向财务自由。说到投资,最经典的当然是股市了,但股市对于大部分人而言是烫手山芋,无法从中获得稳定的收益。因此,对于大部分人而言,最好的投资产品还是基金。

​基金分为好几种,因此收益的计算公式也分许多种,我们这里介绍三种最常见的收益计算方式,从而找到收益最高的那种基金:

第一种是七日年化收益。最常见的是余某宝和一些理财基金。

第二种是每日万份收益。许多产品可能会用它作为指标。

第三种是定投基金。大多是一些股票投资组合基金,比理财基金风险高,但也是最值得投资的,请往后看。

1.余某宝

我们先尝试利用七日年化收益算算余某宝现在的收益,这可是这些年的明星产品啊,今天2020年2月27日的七日年化收益率为2.306%:

觉得我穷的就赞赏一个吧,嘻嘻

七日年化收益的计算方法是这样的:
当日收益 = 金额 X 7日年化 ÷ 360。

Python 计算代码计算最终收益:

假设我们投入10W元,放180天:

>> profit_7_days(100000, 0.023, 180)
(101156.60076153441, 1156.6007615344133)

最终利润为1156元,太少了,这个利润绝对跑不过CPI,要知道,2020年1月份CPI同比上涨5.4%哦。当然,还是比放银行活期好得多。

2.活期理财

市面上还有许多保守型活期/定期理财,我们选最高利率的一种来试一下,这一个采用万份收益来计算:

万份收益的计算公式如下:
当日收益 = 金额 ÷ 10000 X 当日万份收益。

Python代码如下:

假设我们投入10W元,放180天:

>> profit_10_thousand(100000, 1.0485, 180)
(101905.12125702304, 1905.1212570230418)

哎,比余额宝好不了多少嘛,那我还不如继续用余额宝。

3.定投基金

定投基金比较有意思,是我们今天的主角。它属于“保守版”的​高风险投资,因为分散投资能够有效规避风险,面对股市无常的变化,定投的基金并不会产生太大的影响,所以相对安全,收益也相对稳定。

它的计算公式如下:

M=a(1+b)[-1+(1+b)^n]/b

其中:
1. M表示定投n年后总金额(包括收益和本金);
2. a表示每年投入的金额(比如每月投入1200元,a=14400元);
3. b表示年收益率(比如年收益为50%,其b=0.5);
4. ^n表示n次方。

比如这一款基金,最近三年涨跌幅分别为:69.07%, 51.3%, 66.3%. 平均下来年涨跌幅为62%,非常可怕:

不过今年由于疫情影响,估计最终收益会低许多,我们算40%的年收益率吧。

Python代码如下:

假设我们每个月投一万块钱,持续一年:

>> profit_investment_plan(10000, 0.40, 1)
(167999.99999999994, 47999.99999999994, 0.8117274492919773)

没错,最终赚了约4.8W,其第一年真实的年化收益率为 81%,如果第一年结束取出来,其总利率达到了 47999/167999 = 28.5%.

原来,基金定投才是投资的最好姿势啊!不过,收益越高,风险越高,虽然基金定投能够很好地避免股市波动,但是它还是存在不小的风险的。

如果想获得稳健的收益,个人建议你需要将钱放在不同的篮子里以规避风险,比如每月收入的30%定投基金,20%理财基金,10%指数型基金,20%债券基金,20%活期基金(如余额宝之类)。当然,最适合的搭配要根据个人收入进行组合。

市面上有许多可靠的基金定投,只要选择那种最近几年没有负收益的,遇到市场形式较好的时候,基本上收益都能跑得过CPI,微X的某财通里就有很多,为了避免广告嫌疑,这里就不再多介绍啦。本文全部的计算代码,可在公众号后台回复 基金投资计算 获得。

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


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

Python 批量修改图片亮度和饱和度

在Photoshop里也可以做到批量修改图片的亮度和饱和度,但是很多人都没有条件使用Photoshop,此外,Photoshop里的批量修改其实很耗性能,而且使用起来并不是很方便。

那我们能不能用Python做一个小工具,先找到合适的亮度和饱和度,然后再根据这个指定的值对所有需要做相似调整的图片做批量修改呢?答案是肯定的。

1.准备

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

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal). 输入以下命令安装我们所需要的模块:

pip install numpy
pip install opencv-python

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

2.开发调整工具

这一部分,我们将开发出一个能够调整图像亮度和饱和度的工具,而且这个工具支持滑动调整。其实放到别的语言里,这可是个小工程,但是放到Python里,我们用50行代码就能解决了。

首先是加载图片,然后需要将图片转化为HLS模式才能够调整亮度和饱和度。这是因为默认的图片颜色空间是RGB,它非常适合显示器显示,但由于只有三个颜色分类,并不适合图像处理。而HLS模式相对于RGB颜色空间则复杂得多,HLS分别代表H: Hue(色调),L: Lightness(亮度), S: Saturation(饱和度)。

其颜色空间是一个三维空间,如下图所示:

这样的颜色空间才使得我们可以调整图片的细节部分。Python代码中,将RGB转化为HLS空间是很简单的,两行代码就能做到:

import numpy as np
import cv2

# 加载图片 读取彩色图像归一化且转换为浮点型
image = cv2.imread('2.jpg', cv2.IMREAD_COLOR).astype(np.float32) / 255.0

# 颜色空间转换 BGR转为HLS
hlsImg = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)

然后我们需要做两个滑动块,一个调节亮度,一个调节饱和度:

# 滑动条最大值
MAX_VALUE = 100
# 滑动条最小值
MIN_VALUE = 0

# 调节饱和度和亮度的窗口
cv2.namedWindow("lightness and saturation", cv2.WINDOW_GUI_NORMAL)

# 创建滑动块
cv2.createTrackbar("lightness", "lightness and saturation", MIN_VALUE, MAX_VALUE, lambda x:x)
cv2.createTrackbar("saturation", "lightness and saturation", MIN_VALUE, MAX_VALUE, lambda x:x)

调节前还需要保存一下原图,所以我们会在内存里复制一个新的变量用于调节图片,然后获得两个滑动块的值,再根据值进行亮度和饱和度的调整:

# 调整饱和度和亮度
while True:
    # 复制原图
    hlsCopy = np.copy(hlsImg)
    # 得到 lightness 和 saturation 的值
    lightness = cv2.getTrackbarPos('lightness', 'lightness and saturation')
    saturation = cv2.getTrackbarPos('saturation', 'lightness and saturation')
    # 1.调整亮度(线性变换)
    hlsCopy[:, :, 1] = (1.0 + lightness / float(MAX_VALUE)) * hlsCopy[:, :, 1]
    hlsCopy[:, :, 1][hlsCopy[:, :, 1] &gt; 1] = 1
    # 饱和度
    hlsCopy[:, :, 2] = (1.0 + saturation / float(MAX_VALUE)) * hlsCopy[:, :, 2]
    hlsCopy[:, :, 2][hlsCopy[:, :, 2] &gt; 1] = 1
    # HLS2BGR
    lsImg = cv2.cvtColor(hlsCopy, cv2.COLOR_HLS2BGR)
    # 显示调整后的效果
    cv2.imshow("lightness and saturation", lsImg)

效果如下图所示:

到这里还不够,由于是while循环支持的调节,我们还需要让其可以退出和保存:

    ch = cv2.waitKey(5)
    # 按 ESC 键退出
    if ch == 27:
        break
    elif ch == ord('s'):
        # 按 s 键保存并退出
        lsImg = lsImg * 255
        lsImg = lsImg.astype(np.uint8)
        cv2.imwrite("lsImg.jpg", lsImg)
        break

这样,按s键可以保存图片并退出,按ESC键可以直接退出编辑器。 完整文字版50行代码请在Python实用宝典公众号后台回复:批量修改图片 获得。

3.批量修改

前面根据我们的小工具获得了需要的饱和度和亮度,把这对值记下来就可以批量修改图片了。当然,我们没有自动批量修改到正确值这么逆天的功能,这个工具只适合相同场景下,能够用同一对亮度和饱和度进行调整的图片:

def update(input_img_path, output_img_path, lightness, saturation):
    """
    用于修改图片的亮度和饱和度
    :param input_img_path: 图片路径
    :param output_img_path: 输出图片路径
    :param lightness: 亮度
    :param saturation: 饱和度
    """

    # 加载图片 读取彩色图像归一化且转换为浮点型
    image = cv2.imread(input_img_path, cv2.IMREAD_COLOR).astype(np.float32) / 255.0

    # 颜色空间转换 BGR转为HLS
    hlsImg = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)

    # 1.调整亮度(线性变换)
    hlsImg[:, :, 1] = (1.0 + lightness / float(MAX_VALUE)) * hlsImg[:, :, 1]
    hlsImg[:, :, 1][hlsImg[:, :, 1] &gt; 1] = 1
    # 饱和度
    hlsImg[:, :, 2] = (1.0 + saturation / float(MAX_VALUE)) * hlsImg[:, :, 2]
    hlsImg[:, :, 2][hlsImg[:, :, 2] &gt; 1] = 1
    # HLS2BGR
    lsImg = cv2.cvtColor(hlsImg, cv2.COLOR_HLS2BGR) * 255
    lsImg = lsImg.astype(np.uint8)
    cv2.imwrite(output_img_path, lsImg)

这部分其实比制作刚刚的工具简单,可以说是工具的简化版。分为以下六个步骤:

1.加载图片。
2.转化为HLS空间。
3.调整亮度。
4.调整饱和度。
5.转化为RGB空间。
6.保存。

然后我们只需要批量地将图片传入该函数,就能实现批量转化:

dataset_dir = 'imgs'
output_dir = 'output'
lightness = 10
saturation = 20

# 获得需要转化的图片路径, 并生成目标路径
image_filenames = [(os.path.join(dataset_dir, x), os.path.join(output_dir, x))
                    for x in os.listdir(dataset_dir)]
# 转化所有图片
for path in image_filenames:
    update(path[0], path[1], lightness, saturation)

通过这份Python代码,你能在1分钟内修改几千张图片,这样的效率并非Photoshop能比的。当然,它也有它的缺点,那就是只能根据你输入的值进行修改,而Photoshop能够进行自动优化(虽然精度评价因人而异)。

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


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

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

很多同学都对自然语言处理感兴趣,但是却不知道应该从哪里下手。Python实用宝典曾写过一篇文章(《短文本分类识别自杀倾向》),教你从构建数据集到训练数据,再到测试数据,整个流程确实需要耐心的人才能成功走通。

不过现在有了paddlehub,我们可以先省略掉构建数据集和训练数据这两个步骤,直接拿模型过来文本分类

一旦简单版的分类成功了,你就会有动力继续前进,继续学习如何训练属于自己的模型。

今天我们用paddlehub中比较简单的情感倾向分析模型 senta_lstm 来对文本做一个简单的积极和消极的分类。

1.准备

为了实现这个实验,Python是必不可少的,如果你还没有安装Python,建议阅读我们的这篇文章哦:超详细Python安装指南

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

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

不过虽然它里面写了这么多,大部分人用一句话安装,打开CMD(Win+R)或者Terminal(Command+空格搜索)输入以下命令即可安装:

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

还需要安装paddlehub,这点别忘了:

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

2.编写代码

整个步骤分为三步:

1.加载模型
2.指定待分类文本
3.情感分类

import paddlehub as hub

# 加载模型
senta = hub.Module(name="senta_lstm")

# 待分类文本
test_text = [
    "你长得真好看",
    "《黑色四叶草》是部不错的番"
]

# 情感分类
results = senta.sentiment_classify(data={"text": test_text})

# 得到结果
for result in results:
    print(result)

将这份代码保存为 code.py, (如果你懒得打一遍,可以再公众号后台回复 识别文本情感 获得代码)在CMD或Terminal中进入该文件文件夹运行以下命令执行脚本: python code.py

就能得到以下结果:

{‘text’: ‘你长得真好看’, ‘sentiment_label’: 1, ‘sentiment_key’: ‘positive’, ‘positive_probs’: 0.9866, ‘negative_probs’: 0.0134}
{‘text’: ‘《黑色四叶草》是部不错的番’, ‘sentiment_label’: 1, ‘sentiment_key’: ‘positive’, ‘positive_probs’: 0.9401, ‘negative_probs’: 0.0599}

其中:
1.sentiment_key 代表分类结果,postive是 积极 ,negative是 消极 。
2.sentiment_label 是分类结果标签,1代表 积极 ,0代表 消极 。
3. positive_probs 是积极分类的置信度,0.9866即模型判断98.66%的可能性是正面。
4. negative_probspositive_probs 相对,是消极分类的置信度。

3.结果分析

这么看,你会发现其实在有明显的积极消极词汇面前,这个模型的分类效果还是不错的。那在特殊的例子面前效果又如何呢?我们去微博随便取一条试一下,比如银教授的段子:

分类结果:

{‘text’: ‘他们都网上办公、网上学习了,你什么时候跟我网恋?’, ‘sentiment_label’: 0, ‘sentiment_key’: ‘negative’, ‘positive_probs’: 0.0507, ‘negative_probs’: 0.9493}

竟然意外的分对了。虽然是句段子,但是明显有对方不跟自己网恋的消极态度。再试试有潜在含义的句子:

{‘text’: ‘不想说什么了,听首歌吧。’, ‘sentiment_label’: 0, ‘sentiment_key’: ‘negative’, ‘positive_probs’: 0.0321, ‘negative_probs’: 0.9679}

{‘text’: ‘我忘了世界还有一种人火星人,你从那来的吧。’, ‘sentiment_label’: 1, ‘sentiment_key’: ‘positive’, ‘positive_probs’: 0.7261, ‘negative_probs’: 0.2739}

这里第一句分对了,第二句没分对。确实,第二句太隐晦了,机器可能分不出来。不过,置信度并不高,如果真的需要应用这个模型,可以通过置信度过滤掉一些分类。

总的而言,这个模型效果还是不错的,在网上那么多情感分类开源的模型中,百度的这个应该可以打80分左右。

而且,它支持你自己做一些微调(Fine-tune),也就是能够使用自定义的训练集调整模型到你需要的样子,详见github:
https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/sentiment_classification

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


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

有趣,用Python算算哪个星座富豪最多!

最近经常看到关于星座的推送,我其实不信这个,但是由于推送得太多了,总有几篇会让我好奇地点进去看看。然后想想其实用Python写一篇星座相关的文章也不错。

正好,Python计算一个人的星座特别简单,因为每个星座的日期是固定的。我们只需要四行代码就能计算:

def cal_constellation(month, day):
    constellation = (u'摩羯座',u'水瓶座',u'双鱼座',u'白羊座',u'金牛座',u'双子座',u'巨蟹座',u'狮子座',u'处女座',u'天秤座',u'天蝎座',u'射手座')
    start_day = ((1,20),(2,19),(3,21),(4,21),(5,21),(6,22),(7,23),(8,23),(9,23),(10,23),(11,23),(12,23))
    return constellation[len(list(filter(lambda y:y&lt;=(month,day), start_day)))%12]

把出生的月份和日期传入这个函数,就能得到对应的星座了。当然,这只是非常简单的第一步,接下来让我们计算2012全球富豪榜前一百名中,哪个星座的人最多,嘻嘻,期待吗?

1.获得数据

豆瓣上有个帖子帮我们列出了相应的数据,不过是以文本的形式:https://www.douban.com/group/topic/28671832/

幸好有统一的格式,我们能用正则表达式把出生日期提取出来:

(\d+) ?月 ?(\d+) ?日

在Vscode中还能直接用模式替换,变成我们想要的元组形式:

最后发现有出生月日的只有88条,没关系,够我们用了。

2.放入代码计算

将前面获得的所有日期放入数组中,然后调用我们一开始说的星座计算函数即可,当然,需要用一个字典来计算每次星座的出现:

birth_day = [
    (1, 28), (10, 28), (8, 30), (3, 5), (3, 28), (8, 17), (11, 3), (10, 4), (7, 29), (2, 20), (11, 1),
    (5, 3), (8, 4), (10, 21), (7, 7), (10, 7), (10, 28), (4, 19), (2, 14), (6, 15), (8, 12), (4, 26),
    (8, 21), (3, 26), (1, 12), (4, 2), (9, 9), (3, 7), (2, 20), (2, 9), (3, 28), (11, 5), (4, 16), (1, 14),
    (4, 12), (6, 12), (9, 1), (5, 14), (9, 21), (8, 26), (2, 23), (5, 7), (7, 24), (3, 24), (9, 26), (1, 3),
    (2, 24), (1, 21), (7, 8), (2, 16), (8, 16), (10, 10), (9, 1), (4, 21), (5, 3), (4, 28), (8, 21), (12, 1),
    (12, 14), (10, 6), (1, 27), (4, 14), (6, 4), (10, 24), (5, 11), (8, 26), (1, 1), (6, 14), (8, 11), (5, 22),
    (5, 10), (4, 10), (5, 9), (12, 22), (12, 11), (3, 20), (3, 8), (9, 22), (12, 19), (11, 17), (9, 15), (3, 25),
    (2, 7), (4, 4), (4, 1), (6, 2), (2, 13), (11, 8)
]
def cal_constellation(month, day):
    constellation = (u'摩羯座',u'水瓶座',u'双鱼座',u'白羊座',u'金牛座',u'双子座',u'巨蟹座',u'狮子座',u'处女座',u'天秤座',u'天蝎座',u'射手座')
    start_day = ((1,20), (2,19), (3,21), (4,21), (5,21), (6,22), (7,23), (8,23), (9,23), (10,23), (11,23), (12,23))
    return constellation[len(list(filter(lambda y:y&lt;=(month,day), start_day)))%12]

result = {}
for birth in birth_day:
    constel = cal_constellation(birth[0], birth[1])
    if constel not in result:
        result[constel] = 0
    else:
        result[constel] += 1
print(result)

结果如下:

{‘水瓶座’: 7, ‘天蝎座’: 7, ‘处女座’: 8, ‘双鱼座’: 7, ‘白羊座’: 12, ‘狮子座’: 8, ‘天秤座’: 5, ‘金牛座’: 9, ‘巨蟹座’: 1, ‘双子座’: 5, ‘摩羯座’: 3, ‘射手座’: 4}

排个序吧:

print(sorted(result.items(), key=lambda item: item[1]))

结果:

[(‘巨蟹座’, 1), (‘摩羯座’, 3), (‘射手座’, 4), (‘天秤座’, 5), (‘双子座’, 5), (‘水瓶座’, 7), (‘天蝎座’, 7), (‘双鱼座’, 7), (‘处女座’, 8), (‘狮子座’, 8), (‘金牛座’, 9), (‘白羊座’, 12)]

白羊座惊为天人达到了12位。12/88 = 14%啊,这个比例相当牛皮了。然而我的巨蟹座只有1位,枯了,难道我没有成为富豪的天赋??

不过,大家也不要伤心。我们只取了88名富豪的数据还不够多,像这样的数据分析大概要8888名富豪的出生日期才能得到一个比较靠谱的结果。

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


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

Python pandas高效数据处理之绘图

Pandas是Python中非常常用的数据处理工具,使用起来非常方便。它建立在NumPy数组结构之上,所以它的很多操作通过NumPy或者Pandas自带的扩展模块编写,这些模块用Cython编写并编译到C,并且在C上执行,因此也保证了处理速度。

今天我们就来体验一下它的强大之处。

1.创建数据

使用pandas可以很方便地进行数据创建,现在让我们创建一个5列1000行的pandas DataFrame:

mu1, sigma1 = 0, 0.1
mu2, sigma2 = 0.2, 0.2
n = 1000df = pd.DataFrame(
    {
        "a1": pd.np.random.normal(mu1, sigma1, n),
        "a2": pd.np.random.normal(mu2, sigma2, n),
        "a3": pd.np.random.randint(0, 5, n),
        "y1": pd.np.logspace(0, 1, num=n),
        "y2": pd.np.random.randint(0, 2, n),
    }
)
  • a1和a2:从正态(高斯)分布中抽取的随机样本。
  • a3:0到4中的随机整数。
  • y1:从0到1的对数刻度均匀分布。
  • y2:0到1中的随机整数。

生成如下所示的数据:

2.绘制图像

Pandas 绘图函数返回一个matplotlib的坐标轴(Axes),所以我们可以在上面自定义绘制我们所需要的内容。比如说画一条垂线和平行线。这将非常有利于我们:

1.绘制平均线

2.标记重点的点

import matplotlib.pyplot as plt
ax = df.y1.plot()
ax.axhline(6, color="red", linestyle="--")
ax.axvline(775, color="red", linestyle="--")
plt.show()

我们还可以自定义一张图上显示多少个表:

fig, ax = plt.subplots(2, 2, figsize=(14,7))
df.plot(x="index", y="y1", ax=ax[0, 0])
df.plot.scatter(x="index", y="y2", ax=ax[0, 1])
df.plot.scatter(x="index", y="a3", ax=ax[1, 0])
df.plot(x="index", y="a1", ax=ax[1, 1])
plt.show()

3.绘制直方图

Pandas能够让我们用非常简单的方式获得两个图形的形状对比:

df[["a1", "a2"]].plot(bins=30, kind="hist")
plt.show()

还能允许多图绘制:

df[["a1", "a2"]].plot(bins=30, kind="hist", subplots=True)
plt.show()

当然,生成折线图也不在画下:

df[['a1', 'a2']].plot(by=df.y2, subplots=True)
plt.show()

4.线性拟合

Pandas还能用于拟合,让我们用pandas找出一条与下图最接近的直线:

最小二乘法计算和该直线最短距离:

df['ones'] = pd.np.ones(len(df))
m, c = pd.np.linalg.lstsq(df[['index', 'ones']], df['y1'], rcond=None)[0]

根据最小二乘的结果绘制y和拟合出来的直线:

df['y'] = df['index'].apply(lambda x: x * m + c)
df[['y', 'y1']].plot()
plt.show()

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


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

Python 一个超快的公共情报搜集爬虫

Photon是一个由s0md3v开源的情报搜集爬虫,其主要功能有:

1.爬取链接(内链、外链)。
2.爬取带参数的链接,如(pythondict.com/test?id=2)。
3.文件(pdf, png, xml)。
4.密钥(在前端代码中不小心被释放出来的)。
5.js文件和Endpoint(spring中比较重要的监视器)
6.匹配自定义正则表达式的字符串。
7.子域名和DNS相关数据。

你可以用它来干很多事,比如爬图片、找漏洞、找子域名、爬数据等等。而且提取出来的数据格式非常整洁:

不仅如此,它甚至支持json格式 ,仅需要在输入命令的时候加上json参数:

python photon.py -u "http://example.com" --export=json

为什么能用来做情报搜集呢?耐心往后看哦。

1.下载安装

你可以上photon的github下载完整项目:
https://github.com/s0md3v/Photon

或者关注下方Python实用宝典公众号在后台回复photon获得国内网盘下载地址。下载后解压到你想要使用的地方。如果你还没有安装Python,建议阅读这篇文章:超详细Python安装指南,进行Python的安装。

安装完Python后,打开CMD(windows)/Terminal(macOS),下面简称这两种为终端,进入你刚解压的文件夹,然后输入以下命令安装Photon的依赖:

pip install -r requirements.txt

如图所示:

2.简单使用

注意,使用的时候要在Photon文件夹下。比如我们随便提取一个网站的URL试一下,在终端输入以下命令:

python photon.py -u https://bk.tencent.com/

结果如下:

它会在当前目录下产生一个你测试的域名的文件夹,比如在我这里是 bk.tencent.com:

嘻嘻,让我们看看里面有什么东西,有没有程序员留下的小彩蛋,打开external.txt,这是该网站的外链的存放位置。可以看到,这里不仅仅是只有网站页面,连CDN文件地址都会放在这里,所以external可能是个藏宝哦。

还能一下找出该网站上链接的全部开源项目:

3.扩展

这个项目的价值,不仅在于能够快速拉取你想要得到的数据,还在于能够构建一个牛逼轰轰的情报系统(如果你技术够强的话)。因为它是能不断延伸下去的,比如从外链出发,你能找到很多和这个网站相关的讯息:

相比于搜索引擎搜索的结果,实际上这些信息更符合情报要求。因为不是所有的信息都能在搜索引擎搜索得到,而通过这个Photon,你可以顺藤摸瓜找到那些隐藏在互联网世界的它们。试想一下,如果你搜集了很多这样的网站…然后用正则表达式搭建一个属于你自己的搜索引擎,这样的感觉是不是很棒?

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


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