Jimmy那些事儿

Python_安装设置&jupyter

Anaconda安装

  • ‘python’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

这个问题本质其实就是,windows的cmd并不能识别python这个符号(即无法识别这个符号是一个可执行程序),因为windows这里也是类似的,遇到一个字符,先会在默认path路径查询这个符号是不是一个可执行程序

右键我的电脑->属性->高级系统配置->点击高级一栏,在这里栏点开环境变量->在系统变量PATH加入python的安装路径即可,比如我的就是D:\Python27

  • pip不是内部或外部命令,也不是可运行的程序

添加Python的Script 到环境变量;在Path后面追加一下内容(Path: 不要复制进去) Path:;C:\python;C:\Python\Scripts


模块安装

查看Python版本

1
2
3
4
5
6
7
> cmd
> python -v
>
> # 或者
> cmd
> python --version
>


pip 安装与卸载

安装好Anaconda后,就默认安装了包管理工具pip

  • 在命令提示符(cmd)窗口中使用命令pip install xxx(xxx表示要安装的包或模块名)。
1
2
3
4
5
pip install numpy # 安装
pip install -U PackageName # 更新
pip uninstall PackageName # 移除
pip search PackageName # 搜索
pip help # 帮助
  • conda 安装


下载文件安装

若一种方法失败,可尝试用另一种方式


  • PyPI-the Python Package Index

    1. 在上面右上角红线框住的search中输入你要下载的包或模块名,即可进入下载页面。下载的是压缩文件
    2. 解压
    3. 在命令提示符窗口中,使用cd进入到解压后的文件的路径下
    4. 输入命令python setup.py install
    1
    2
    3
    cmd
    cd /d G:\Downloads\Chrome
    python setup.py install

  • Python Extension Packages
    1. 直接把文件拷贝到 $python_dir/Lib/site packages
    2. 在命令提示符窗口中,转到指定路径(.whl安装文件的路径)
    3. pip install .whl 文件名

site_packages 用来存放第三方库

1
2
3
cmd
cd /d G:\Downloads\Chrome
pip install


单文件模块

  • 直接把文件拷贝到 $python_dir/Lib/site packages

常见报错

  • Microsoft Visual C++ 14.0 is required.
    • 往往并不是缺少 Visual 2015 ;而是缺少某个依赖包


模块使用


获取模块地址

1
2
3
4
5
6
7
import a_module
print a_module.__file__
# 上述代码将范围 .pyc 文件被加载的路径,如果需要跨平台解决方案,可用下面代码:
import os
path = os.path.dirname(amodule.__file__)


导入与移除模块

1
2
3
4
5
6
# 导入
import pandas as pd
from pandas import *
# 移除
del pd



连接数据库库

MySQL需要MySQLdb,SQL Server需要pymssql。两个模块大同小异,都遵循Python Database API

必须先下载pymssql 模块,才能使用;http://www.pymssql.org/en/stable/

安装pymssql好之后开工了。如果是连接本地的SQL Server需要在 SQL Server Configuration 中打开TCP/IP协议

img

1
2
3
4
5
6
7
8
9
10
11
12
13
#coding=utf-8
import pymssql
conn = pymssql.connect(host='127.0.0.1',user='sa',
password='hello',database='NPKW',
charset="utf8")
#查看连接是否成功
print conn
cursor = conn.cursor()
sql = 'select * from contacts'
cursor.execute(sql)
#用一个rs变量获取数据
rs = cursor.fetchall()
print rs


[(1, u’20111612210028’, u’ettingshausen’, u’’, u’’, u’’, u’’, u’’, u’’, u’’, u’’, u’’)]


SQL Server

Python Database API,只需要了解Connection Objects和Cursor Objects的常用方法。

基本的步骤就是:

  1. 使用connect创建连接对象
  2. connect.cursor创建游标对象,SQL语句的执行基本都在游标上进行
  3. cursor.executeXXX方法执行SQL语句,cursor.fetchXXX获取查询结果等
    • 通过cursor获取数据,具体可以是一次获取所有数据,也可以是一次获取一行。
    • 整个结果集是元组列表,就是list类型的,而每一条记录是一个tuple,也就是元祖。
  4. 如果是增、改数据,必须就要调用commit()函数来提交事务,否则程序已退出,数据库里的数据不会有变化。
  5. 调用close方法关闭游标cursor和数据库连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pymssql
conn = pymssql.connect(server='anly3.dm.ytx.com' ,database='ADHOC_FDGJ', as_dict=True)
cur = conn.cursor()
cur.execute("select ...")
# 先将SQL语句赋值为变量a
a = "select ..."
cur.execute(a)
b= cur.fetchall()
conn.close()
df_b = pd.DataFrame(b) # 转化为数据框格式


Connection Objects

方法 含义
connect 创建连接对象
cursor 返回一个Cursor对象
commit 提交事务
rollback 回滚
close 关闭连接


  • connect(host, user, password, database, as_dict=True) :创建连接对象

host :主机名

user:用户名

password:密码

database:数据库

charset:数据库的字符集;不指定此参数值时,程序使用默认值’UTF-8’

as_dict:布尔值,指定返回值是字典还是元组

timeout:查询超时
login_timeout:登陆超时
max_conn:最大连接数
trusted:布尔值,指定是否使用windows身份认证登陆

  • cursor(as_dict=True):创建游标。 一个连接一次只能有一个游标的查询处于活跃状态
    • 创建多个连接来保证多个查询可以并行执行在不同连接的游标上
    • 使用fetchall方法获取到游标查询结果之后再执行下一个查询

as_dict : 使游标返回字典变量。字典中的键为数据表的列名

  • pd.DataFrame( cursor.fetchall()) : 可将数据有 列表list 转为 数据框DataFrame
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ------------一个连接一次只能有一个游标的查询处于活跃状态
c1 = conn.cursor()
c1.execute('SELECT * FROM persons')
c2 = conn.cursor()
c2.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
print( "all persons" )
print( c1.fetchall() ) # 显示出的是c2游标查询出来的结果
print( "John Doe" )
print( c2.fetchall() ) # 不会有任何结果
# ------------解决办法:使用fetchall方法获取到游标查询结果之后再执行下一个查询--------------
c1.execute('SELECT ...')
c1_list = c1.fetchall()
c2.execute('SELECT ...')
c2_list = c2.fetchall()


####Cursor Objects

方法 含义
execute 执行一条SQL语句
executemany 执行多条语句
fetchone 获取一行数据
fetchmany 获取n行的数据
fetchall 获取未返回(剩下的)数据
callproc 调用存储过程
close 关闭游标

注意:fetchone / fetchmany / fetchall 与 read 是同样的运行方式;一旦倒出来一条数据,就少一条数据;

例如:cursor.fetchone() ,则已经少了一行数据;


  • execute():执行一条SQL语句

例子中查询操作的参数使用的%s而不是'%s'若参数值是字符串,在执行语句时会自动添加单引号

1
2
3
4
5
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe') # 字符串没有使用引号
row = cursor.fetchone()
while row:
print("ID=%d, Name=%s" % (row[0], row[1]))
row = cursor.fetchone()
  • executemany():指定多条SQL语句
1
2
3
4
5
6
stmt='insert into student (name, age) values (%s,%s)'
data=[
('Lucy',21),
('Tom',22),
('Lily',21)]
cursor.executemany(stmt,data)


  • callproc( procname [, parameters ] ):调用存储过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with pymssql.connect(server, user, password, database) as conn:
with conn.cursor(as_dict=True) as cursor:
# 创建存储过程
cursor.execute("""
CREATE PROCEDURE FindPerson
@name VARCHAR(100)
AS BEGIN
SELECT * FROM persons WHERE name = @name
END
""")
# 调用存储过程
cursor.callproc('FindPerson', ('Jane Doe',)) # FindPerson 为之前创建的存储
for row in cursor:
print("ID=%d, Name=%s" % (row['id'], row['name']))


  • 使用 with 函数 完成后自动关闭数据库连接
1
2
3
4
5
with pymssql.connect(server, user, password, "tempdb") as conn:
with conn.cursor(as_dict=True) as cursor:
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:
print("ID=%d, Name=%s" % (row['id'], row['name']))


中文乱码问题

sqlserver数据库编码为gbk

文件头加上 #coding=utf8

连接的时候加入charset设置信息 \运行正常,输出依然乱码;不指定此参数值时,程序使用默认值’UTF-8’

pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset=”utf8”)

  • 代码中显式转码
    • unicode变量.encode(‘latin1’).decode(‘gbk’)
    • 一般情况下对unicode编码不做encode处理,但必要时可以encode为Latin1,实现脱unicode操作,然后再以合适字符集decode为正确unicode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
print "\t".join([str(room_id),room_name.encode('latin1').decode('gbk')])
# 在执行时进行encode
cur = conn.cursor()
sql = "select top 10 [ID],[Name] from [User]"
cur.execute(sql)
list = cur.fetchall()
for row in list:
print(row["ID"],row["Name"].encode('latin-1').decode('gbk'))
# sql语句中有中文的时候进行encode
insertSql = "insert into WeiBo([UserId],[WeiBoContent],[PublishDate]) values(1,'测试','2012/2/1')".encode("utf8")
# --------某一列中文有乱码
def code(a):
a = a.encode('latin-1').decode('gbk')
return a
data['访问次数'] = data['访问次数'].apply(code)
  • 字符定义使用NVARCHAR

这种方式在存储和读取时都使用unicode编码,和python运转字节码一致,可以很好避免此类问题。当然数据库存储空间要牺牲一些

1
[room_name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL


【实战演练】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pymssql
conn = pymssql.connect(server='anly3.dm.ytx.com' ,database='ADHOC_FDGJ', as_dict=True)
cur = conn.cursor()
cur.execute("select ...")
# 先将SQL语句赋值为变量a
a = "select ..."
cur.execute(a)
# 获取之后再赋值
b= cur.fetchall()
conn.close()
df_b = pd.DataFrame(b) # 转化为数据框格式


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# =-----------【代码参考】-----------------
# -*- coding:gbk -*-
import pymssql
#创建一个数据库连接,host是服务器的ip地址,如果是本机可以用".",user是访问用户名,password是密码,database是数据库名,比ADO的连接似乎简单一些
conn=pymssql.connect(host=".",user="sa",password="twinflag",database="bbs" , as_dict=True)
#创建游标对象,相当于ADO的记录集
cou=conn.cursor()
sql="select id,name from user"
cou.execute(sql) #执行命令
# -----------或者-------------
cou.execute('select id, name From user')
#插入一条记录
cou.execute(sql)
#只有执行了下面的命令,上面的操作才能生效,配合异常处理,可以实现pymssql的事务操作
conn.commit()
#关闭数据库的连接
conn.close()
# =-----------【代码参考】-----------------
import pymssql
# server 数据库服务器名称或IP
# user 用户名
# password 密码
# database 数据库名称
conn = pymssql.connect(server, user, password, database)
cursor = conn.cursor()
# 新建、插入操作
cursor.execute("""
IF OBJECT_ID('persons', 'U') IS NOT NULL
DROP TABLE persons
CREATE TABLE persons (
id INT NOT NULL,
name VARCHAR(100),
salesrep VARCHAR(100),
PRIMARY KEY(id)
)
""")
cursor.executemany(
"INSERT INTO persons VALUES (%d, %s, %s)",
[(1, 'John Smith', 'John Doe'),
(2, 'Jane Doe', 'Joe Dog'),
(3, 'Mike T.', 'Sarah H.')])
# 如果没有指定autocommit属性为True的话就需要调用commit()方法
conn.commit()
# 查询操作
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
row = cursor.fetchone()
print(row)
# 也可以使用for循环来迭代查询结果
# for row in cursor:
# print("ID=%d, Name=%s" % (row[0], row[1]))
# 关闭连接
conn.close()


Juypter Notebook

知乎分享:https://www.zhihu.com/question/59392251 品颜完月

27个技巧:http://liuchengxu.org/pelican-blog/jupyter-notebook-tips.html


快捷键

【命令模式】

如果单元格的边框为绿色(即为编辑模式),请按ESC键,退回到命令模式。在命令模式下被选中的单元采用灰色边框显示。按上下方向键可以移动选择框。

  • 数字键:将单元格变为标题类型,数字越大标题越小
  • m:将单元格变为markdown类型,在markdown类型的单元格内可以编写文档
    • 注:将代码类型改为标题类型和markdown类型之后,按Ctrl+Enter对其进行格式化显示。
  • y:将单元格变为代码类型,在代码类型的单元格中输入Python代码
  • d: 按两下d按键删除单元格
  • z: 撤销最后删除单元格操作
  • a: 在当前单元格之上创建一个新的单元格
  • b: 在当前单元格之下创建一个新的单元格
  • x: 剪切当前单元格
  • c: 复制当前单元格
  • v: 在当前单元格之下粘贴剪切板中的单元格
  • shift+k: 将当前单元格上移
  • shift+j: 将当前单元格下移

一旦 cell 被选中,接着你可以进行批量删除/复制/剪切/粘贴.当你需要移动一部分notebook时,这非常有用。

  • shift+m:与下面的单元合并
  • d, d :连按两下d 删除所选cell


【编辑和运行】

编辑模式下单元使用绿色边框显示,在命令模式时按Enter即可进入编辑模式。

  • Ctrl+Enter:结束编辑,对于代码单元将运行其中的代码,对于标题单元和markdown单元将格式化显示
  • Shift+Enter:运行当前选择的代码单元,并自动选择下一个单元。
  • Alt+Enter:运行当前的代码并在下面插入新的单元。
  • ctrl+/:为一行或多行添加或取消注释
  • 多光标操作 :按住 Alt 进行点击和拖拽鼠标即可(选择所要编辑的区域;若要在最后都加上逗号,应该单独选最后的一纵列,而不是连通前面的内容也一起选)


【在线帮助和自动完成】

  • 输入代码时,按 [TAB]键 可以显示自动完成提示框。自动完成支持当前执行环境中已知的模块名、变量名、对象的属性名,以及文件和目录名。
  • 对于当前环境中已知的对象,可以在其后面添加问号查看相应的说明信息和文档,添加两个问号可以查看对象对应的源程序。按Ctrl+Enter显示
  • 在 Help 菜单你可以找到一些常用库文档的连接,包括 NumPy, Pandas, SciPy 和 Matplotlib.同时别忘了在一个库,方法或变量前加上 ?,你可以获得它的一个快速语法说明。
    • ?sum()
  • 调用函数时,按 [shift+tab]组合键 可以显示函数的调用参数和说明文档,按一次组合键显示基本信息,两次显示详细信息,三次延时停留信息框,四次则将信息显示在下方的滑动窗口中。


【操作运算核】

如果进入了Python的死循环,可以在命令模式下按两下 i 按键终止循环

注意右上角图标从空心圈变为实心圈,如上图,表示运算核正在工作,无法执行新的代码。

img


markdown操作

  • 在命令模式下按Enter键进入编辑模式即可查看本段文字的Markdown代码。
  • 在行内的数学公式使用单个$括起,单独占一行的数学公式使用$$括起
  • 数学公式采用LaTeX格式编写,可以使用下面的在线编辑器编写LaTeX数学公式:http://www.codecogs.com/latex/eqneditor.php?lang=zh-cn



###python 导入与运行

【向jupyter notebook中导入python文件】

  • 从本地导入python文件,可以直接使用%load xxx.py,比如把名字为untitled0.py的文件导入到jupyter中。
    • 注意:本地文件导入时的绝对路径和相对路径的引用方式的不同
  • 从网络中导入python代码,可以使用%load 网址


【jupyter中运行python文件】

  • 输入:%run xxx.py 按Ctrl+Enter后


显示问题

【图片显示】

  • 当在程序中使用了matplotlib绘图,不能直接显示时,需要加%matplotlib inline


输出设置

导出时去掉代码

1
2
import IPython.core.display as di
di.display_html('<script>jQuery(function() {if (jQuery("body.notebook_app").length == 0) { jQuery(".input_area").toggle(); jQuery(".prompt").toggle();}});</script>', raw=True)

显示每行结果

  • 可以选择修改 ast_note_iteractively kernal 选项来使得 Jupyter 为每一行的变量或语句执行这个操作,以便你可以立即看到多条语句一起输出。
1
2
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
  • 所有的Jupyter实例(Notebook和Console)都设置该选项,只需创建 ~/.ipython/profile_default/ipython_config.py 文件并写入一下内容

.ipython 该文件夹一般在 user 的第一级目录下。

1
2
3
c = get_config()
# Run all nodes interactively
c.InteractiveShell.ast_node_interactivity = "all"


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
line1 = "this is from line 1"
line2 = "this is from line 2"
line1
line2
[out]:'this is from line 2'
# 修改之后
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
line1
line2
[out]:
'this is from line 1'
'this is from line 2'


导出为PDF

https://github.com/jupyter/docker-stacks/issues/353

As said by Thomas K in the comments, you need to have Latex installed, and after add the path to the directory containing pdflatex.exe file to the PATH variable of your system.

I have looked for a lightweight distribution and tried installing TeXworks, but I didn’t find any pdflatex.exe file.
So I have tried TeX Live, which worked fine creating the pdflatex.exe file under the target installation directory. This path should be like C:...\texlive\2016\bin\win32.
Finally, you should just add this path to the PATH environment variable of your system (you can use the link shared by Thomas K).

In Jupyter, you can check your environment variables by running the following (refer to this link for details):

import os
os.environ

so you can look for ‘PATH’: ‘C: … and check if it contains the path to pdflatex.exe file.

If you get some trouble when exporting your notebook to pdf due to missing files/packages (this happened to me), refer to this link to search and install them under TeX Live.


插件

【报告文档】(删去了业务人员不想查看的代码)

1
2
3
4
5
6
# install using pip from pypi and then activate the extension
pip install jupyter_dashboards
jupyter dashboards quick-setup --sys-prefix
# install using conda from conda-forge, no activation required
conda install jupyter_dashboards -c conda-forge