6 months ago

TensorFlow有一个亮点就是,我们能看到自己写的程序,这个功能就是Tensorboard
下面介绍开启Tensorboard的步骤
1.数据序列化-events文件 --- jupyter或ipython中执行,通常在Session会话中运行

import tensorflow as tf
# 返回filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
tf.summary.FileWriter('/tmp/tensorflow/summary/test/', graph=sess.graph)

这将在指定目录中生成一个 event 文件,其名称格式 events.out.tfevents.{timestamp}.{hostname}
2.启动TensorBoard ---- 命令行中执行

tensorboard  --logdir="/tmp/tensorflow/summary/test/"

第一次会报一个错误

Traceback (most recent call last):
  File "c:\users\hp\appdata\local\programs\python\python35\Lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\users\hp\appdata\local\programs\python\python35\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\HP\Envs\data_process\Scripts\tensorboard.exe\__main__.py", line 5, in <module>
  File "c:\users\hp\envs\data_process\lib\site-packages\tensorboard\main.py", line 28, in <module>
    import tensorflow as tf
  File "c:\users\hp\envs\data_process\lib\site-packages\tensorflow\__init__.py", line 24, in <module>
    from tensorflow.python import pywrap_tensorflow  # pylint: disable=unused-import
  File "c:\users\hp\envs\data_process\lib\site-packages\tensorflow\python\__init__.py", line 49, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "c:\users\hp\envs\data_process\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 30, in <module>
    self_check.preload_check()
  File "c:\users\hp\envs\data_process\lib\site-packages\tensorflow\python\platform\self_check.py", line 55, in preload_check
    % build_info.msvcp_dll_name)
ImportError: Could not find 'msvcp140.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. You may install this DLL by downloading Visual C++ 2015 Redistributable Update 3 from this URL: https://www.microsoft.com/en-us/download/details.aspx?id=53587

主要原因是:TensorFlow是基于VC++2015开发的,所以需要下载安装VisualC++ Redistributable for Visual Studio 2015 来获取MSVCP140.DLL的支持。
解决方案系统已经有提示:到指定网址去下载软件Visual C++ 2015 Redistributable

3.再次启动TensorBoard
系统提示运行成功

2018-11-23 19:23:29.644801: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
W1123 19:23:29.673004 Reloader tf_logging.py:121] Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events.  Overwriting the graph with the newest event.
W1123 19:23:29.681026 Reloader tf_logging.py:121] Found more than one metagraph event per run. Overwriting the metagraph with the newest event.
TensorBoard 1.8.0 at http://小李子爱生活:6006 (Press CTRL+C to quit)

将出现在最后一行的urlhttp://小李子爱生活:6006复制到浏览器打开即可

参考资料:
运行tensorboard --logdir=log遇到的错误之can't assign to operator
Windows下安装TensorFlow快速教程

 
6 months ago

一.python中的随机数模块

1.产生(0,1)范围内的一个随机小数

In[4]: random.random()
Out[4]: 0.6808996688503847

2.[a,b]范围内产生一个随机整数

In[6]: random.randint(0,2)
Out[6]: 1

3.[a,b)范围内产生一个随机整数

In[9]: random.randrange(0,2)
Out[9]: 1

4.从队列中随机选取一个元素

In[26]: random.choice((4,8,9))
Out[26]: 4

5.从列表中随机选取n个元素

In[27]: random.sample((4,8,9),2)
Out[27]: [9, 4]

6.[a,b]或[a,b)范围内产生一个随机小数

In[28]: random.uniform(1,2)
Out[28]: 1.6627994729261206
 
6 months ago

参考资料:
离散型变量的编码方式——one-hot与哑变量

 
6 months ago

由于Python和各个第三方库的版本众多,因此有些软件包或第三方库就容易出现版本不兼容的问题。
很多程序需要在指定的软件版本才能正常运行,此时虚拟环境就应运而生
通过 virtualenv 这个工具,就可以构建一系列 虚拟的Python环境 ,然后在每个环境中安装需要的软件包(配合 pip 使用)
这一系列的环境是相互隔离的。作为一个独立的环境就不容易出现版本问题,还方便部署。
1.安装虚拟环境管理器

pip install virtualenv
pip install virtualenvwrapper-win # 这是对virtualenv的封装版本,一定要在virtualenv后安装 

2.创建虚拟环境(虚拟环境名称以"myproject"为例)

mkvirtualenv myproject

如果你的电脑安装了多个不同版本的python解释器(如python2.7,python3.5,python.7),需要指定版本,格式如下
mkvirtualenv --python=(python解释器安装路径) (虚拟环境名字)
python解释器安装路径获取方式where python
这里以我的显示结果为例(我的电脑只安装了python3.5)

C:\Users\HP>where python
C:\Users\HP\AppData\Local\Programs\Python\Python35\python.exe

因此,创建虚拟环境的完整命令为

mkvirtualenv --python=C:\Users\HP\AppData\Local\Programs\Python\Python35\python.exe myproject

此时系统会自动进入虚拟环境,命令行最前面显示的就是当前虚拟环境的名称

(myproject) C:\Users\HP>

然后就可以在该虚拟环境下使用pip安装各种包了

pip install XXX

如果你在创建虚拟环境时没有指定python解释器,也不用担心,这里还有补救措施

python -m pip install xxx   # python3版本安装包
python2 -m pip install xxx  # python2版本安装包

如果你既在创建虚拟环境时没有指定python解释器,也没有采取补救措施,pip install XXX默认安装在python3解释器下
3.退出虚拟环境deactivate
4.列出所有虚拟环境 lsvirtualenv
5.激活/进入 虚拟环境workon myproject
6.冻结环境
所谓冻结(freeze)环境,就是将当前环境的软件包等固定下来

pip freeze >packages.txt  # 安装包列表保存到文件packages.txt中

7.重建环境
重建(rebuild)环境就是在部署的时候,在生产环境安装好对应版本的软件包,不要出现版本兼容等问题

pip install -r packages.txt

这样就可以批量安装对应版本的软件包,快速重建环境,完成部署
6.删除虚拟环境rmvitualenv myproject

下面是几个高(鸡)级(肋)操作,非正常人使用(都需要在虚拟环境下使用)

1.进入虚拟环境目录

(myproject) C:\Users\HP>cdvirtualenv
(myproject) C:\Users\HP\Envs\myproject>

2.进入虚拟环境的site-packages目录

(myproject) C:\Users\HP\Envs\myproject>cdsitepackages
(myproject) C:\Users\HP\Envs\myproject\Lib\site-packages>

3.列出site-packages目录的所有软件包

lssitepackages

这个操作比较鸡肋,还是使用pip list或者pip freeze
4.更改虚拟环境路径
默认创建的虚拟环境位于C:\Users\username\envs可以通过环境变量 WORKON_HOME 来定制。

通过计算机-->属性-->高级系统设置-->环境变量-->在系统变量中新建“变量名”:WORKON_HOME,变量值:“你自定义的路径”
(此处不变贴图,望见谅)

参考资料:
windows虚拟环境
windows下python虚拟环境virtualenv安装和使用

 
6 months ago

注:本文所有操作在windows环境下运行
1.利用conda创建虚拟环境(虚拟环境名称以'myproject'为例)

conda create -n myproject python=3

2.进入/切换虚拟环境:这是以后进入虚拟环境的操作;第一次创建虚拟环境后会直接进入因此不需要执行以下命令

activate myproject

3.安装支持虚拟环境的插件nb_conda:否则系统表面上切换到虚拟环境,但实际上虚拟环境并没有起到作用

conda install nb_conda

4.启动/重启 jupyter notebook

jupyter notebook

此时jupyter notebook真正应用在虚拟环境中了,在jupyter notebook界面新建文件界面可以看到

参考资料:
如何在Jupyter Notebook中使用Python虚拟环境?
虚拟环境jupyter notebook使用

 
7 months ago

1.下载字体 arial unicode ms.tff
点击下载
2.放置字体到系统字体库

/home/python/.virtualenvs/py3_ai/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf

3.修改配置文件

gedit /home/python/.virtualenvs/py3_ai/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc
font.family         : sans-serif        

font.sans-serif     : arial unicode ms, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

清空matplotlib缓存字体库

/home/python/.cache/matplotlib

重启jupyter notebook

对于mac系统,只需要变更些许路径即可
区别最大的是最后一步

rm -rf ~/.matplotlib/*.*

参考资料:
Mac python3 matplotlib中文乱码解决

 
7 months ago

一.ubuntu环境下安装

在虚拟机中安装TA-Lib遇到各种各样的问题,网上搜出来的解决方案以windows环境居多
ubuntu环境下的解决方案迟迟不见效,经过努力尝试,终于找到解决方案,依次执行以下代码即可

sudo apt-get update
sudo apt-get install python3.6-dev
# 装talib前要先装numpy
python3.6 -m pip install numpy -i https://pypi.doubanio.com/simple
wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
tar -xzvf ta-lib-0.4.0-src.tar.gz
cd ta-lib
./configure --prefix=/usr
make
sudo make install
cd ..
pip install TA-Lib

二.mac环境下安装

本以为经过ubuntu的案例,mac会水到渠成,没想到依然诸多问题
还好经过层层探索,终于找到正确打开方式

sudo brew update
sudo brew install python3.6-dev
# 装talib前要先装numpy
python3.6 -m pip install numpy -i https://pypi.doubanio.com/simple
curl -o ta-lib-0.4.0-src.tar.gz 'http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz'
tar -xzvf ta-lib-0.4.0-src.tar.gz
cd ta-lib
./configure --prefix=/usr/local # 指定安装目录
make
sudo make install
cd ..
pip install TA-Lib

在安装过程中有一段提示:

make[3]: Nothing to be done for `install-exec-am'.
test -z "/usr/include/ta-lib/" || /usr/local/bin/gmkdir -p "/usr/include/ta-lib/"
gmkdir: cannot create directory ‘/usr/include/ta-lib/’: Operation not permitted

从以下stackoverflow上大神都回答可以看出:基于System Integrity Protection原则,新的软件应该安装在/usr/local

Local installations really should be installed under /usr/local, not directly under /usr. Starting in El Capitan, this is enforced by System Integrity Protection。

结合安装错误提示,直接指定安装目录为/usr/local

三.windows环境下安装

之前一直是pip install TA-Lib,但会遇到库的依赖问题
最好的办法是直接下载包本地安装,但是依然存在依赖问题
而且github上的安装包都是32位版本。
正确的安装方式:

1.下载64位拓展包

找到对应的CPU的和对应的python版本,然后下载whl文件

TA-Lib, a wrapper for the TA-LIB Technical Analysis Library.
TA_Lib‑0.4.17‑cp27‑cp27m‑win32.whl
TA_Lib‑0.4.17‑cp27‑cp27m‑win_amd64.whl
TA_Lib‑0.4.17‑cp34‑cp34m‑win32.whl
TA_Lib‑0.4.17‑cp34‑cp34m‑win_amd64.whl
TA_Lib‑0.4.17‑cp35‑cp35m‑win32.whl
TA_Lib‑0.4.17‑cp35‑cp35m‑win_amd64.whl
TA_Lib‑0.4.17‑cp36‑cp36m‑win32.whl
TA_Lib‑0.4.17‑cp36‑cp36m‑win_amd64.whl
TA_Lib‑0.4.17‑cp37‑cp37m‑win32.whl
TA_Lib‑0.4.17‑cp37‑cp37m‑win_amd64.whl

2.本地pip install xxx即可完成

例如

pip install TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl

参考资料:
ubuntu TA-lib的安装
sudo mkdir in /usr/, Operation not permitted. El Capitan
windows下python3.6 TA-Lib的安装

 
7 months ago

1.哈希 是一种 算法,其作用就是提取数据的 特征码(指纹)

相同的内容 得到 相同的结果
不同的内容 得到 不同的结果

2.Python 中内置有一个名字叫做 hash() 的函数

接收一个 不可变类型 的数据作为 参数
返回 结果是一个 整数
常用不可变数据类型:数字(int,float,bool,complex),字符串,元祖

In[78]: hash("")
Out[78]: 0
In[79]: hash(123)
Out[79]: 123
In[80]: hash(1.23)
Out[80]: 530343892119149569
In[81]: hash(True)
Out[81]: 1
In[82]: hash(False)
Out[82]: 0
In[83]: hash(None)
Out[83]: 671750
In[84]: hash((1,2))
Out[84]: 3713081631934410656

常用可变数据类型:列表,字典

In[75]: hash([])
TypeError: unhashable type: 'list'
In[76]: hash({})
TypeError: unhashable type: 'dict'

有趣的是,对于字符串中嵌套列表或字典,是可哈希的(hashable)

In[85]: hash("[1,2]")
Out[85]: -4689649918355884084
In[86]: hash("{}")
Out[86]: -4204096371636323835

有趣的是,对于元祖中中嵌套列表或字典,是不可哈希的(unhashable)
也许,嵌套了列表和字典的元祖,就不是正宗的元祖了吧

In[88]: hash(({},))
TypeError: unhashable type: 'dict'
In[89]: hash(([],))
TypeError: unhashable type: 'list'

3.hash的关键在于是否有内置方法hash(self)

python3中所有的类都继承自基类Object,里面有内置方法hash(self)
换句话说,python3中的类都是可哈希的(hashable)

In[92]: class A(object):
   ...:     pass
In[93]: hash(A())
Out[93]: -9223363287761547390

4.哈希与字典中的键

在 Python 中,设置字典的 键值对 时,会首先对 key 进行 hash 已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查
所以说,考察一个变量是否能作为字典中的键 实际上就是考察这个变量是否可哈希(hashable)

 
7 months ago

enumerate原意是"列举、枚举",enumerate()是python内置函数
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate()将其组成一个索引序列,利用它可以同时获得索引和值,多用于在for循环中得到计数

In[5]: a="i love you"
In[6]: for i,c in enumerate(a):
  ...:     print(i,c)
  ...:     
0 i
1  
2 l
3 o
4 v
5 e
6  
7 y
8 o
9 u

以上代码相当于

In[20]: a="i love you"
In[21]: for i in range(len(a)):
   ...:     print(i,a[i])

明显前一段代码看起来可读性更好

enumerate()的值本身是一个可迭代对象

In[2]: a=[1,2,3,4,5]
In[4]: enumerate(a)
Out[4]: <enumerate at 0x7f50eaad0870>

这个特性可以用于特殊场合
如果要统计文件的行数,可以这样写:

count = len(open(filepath, 'r').readlines())

这种方法简单,但是可能比较慢,当文件比较大时甚至不能工作。

可以利用enumerate():

for index, line in enumerate(open(filepath,'r')): 
    pass
print("文件行数为%d" %(index+1))

参考资料
python enumerate用法总结

 
7 months ago

1.遇到问题

2.python中的队列

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据
Python提供的所有队列类型 :
先进先出队列 queue.Queue
后进先出队列 queue.LifoQueue (Queue的基础上进行的封装)
优先级队列 queue.PriorityQueue (Queue的基础上进行的封装)
双向队列 queue.deque

3.队列在爬虫中的应用

1)Scrapy中调度器Scheduler --- LIFO(后进先出),实现深度优先

2)自定义爬虫框架调度器Scheduler --- FIFO(先进先出),实现广度优先

# 利用six模块实现py2和py3兼容
from six.moves.queue import Queue


class Scheduler(object):
    '''
    1. 缓存请求对象(Request),并为下载器提供请求对象,实现请求的调度
    2. 对请求对象进行去重判断
    '''
    def __init__(self):
        self.queue = Queue()

    def add_request(self, request):
        '''添加请求对象'''
        self.queue.put(request)

    def get_request(self):
        '''获取一个请求对象并返回'''
        request = self.queue.get()
        return request

4.内容延伸——爬虫中的深度优先与广度优先

默认情况下,scrapy的请求调度队列是LIFO,也就是后进先出的,意味着scrapy默认是深度优先的。
比如总共10个初始请求,假设发起第1个初始请求后,又新增100个请求到了调度器队列中,可能导致其余9个初始请求在这新增的100个请求之后发起。

如上图中10个站点,如果广度优先,先返回的数据将是10个站点的数据,如果他们的数据之间关联不大的话,不利于程序的维护和管理。但如果他们之间的数据关联性较大,那么采用广度优先可能会更好。

但实际应用中,到底使用广度优先还是深度优先,其实并不是绝对的,只有在某种场景可能某种优先会更好。
关键点在于你需要获取的数据的关联性是深度还是广度

比如有这样一个应用场景:获取京东上所有的Iphone手机的名称,价格,销量,店铺,评价数
经过抓包分析,其余字段都可以在列表页抓取,唯有价格字段:需要在详情页抓取详情页url,然后在详情页抓取相应价格
为了获得完整数据,需要在列表页和详情页协同完成,这样数据在深度方向进行关联,适合使用深度算法

此时如果使用广度优先,在列表页获取到商品的不完整信息,详情页和下一页的url
由于先进后出的原则,最开始的商品一直无法获取完整数据,导致数据无法入库,内存一直被占用,影响爬虫执行效率
这样的情形采用广度优先是不合适的

参考资料:
Python数据结构——队列
Python队列
https://www.cnblogs.com/itogo/p/5635629.html
https://blog.csdn.net/linangfs/article/details/78109374