python数据分析的笔记
本帖最后由 翩跹叶惊鸿 于 2018-11-22 18:15 编辑首先需要下载的:
numpy —— 使python支持Array(矩阵)
pandas —— 使python支持dataframe
pymysql —— python调用MyAQL
pymongo —— python调用MongoDB
jieba —— 分词
scrapy —— 爬虫
requests —— 爬虫
scikit-learn —— 数据挖掘集成包
tensorflow —— 深度学习
keras —— 深度学习
使用的是anaconda3
在anaconda navigator中,最左侧Environments,base的右侧小箭头,可以 Open Terminal
除了jieba都可以使用conda下载,conda下载可以解决依赖问题,优先使用这个!
conda install 名字 #需要手动输入y确认
jieba只能用pip下载
pip install jieba
然后等我把这些都安装好了以后,一个一个加载尝试有没有成功的时候。。。。
出现了import pandas 一直报错的问题。。明天百度试试怎么解决。。。
ImportError: C extension: No module named 'pandas._libs.tslib' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first.
import scikit-learn还一直说我语法错误!一脸懵逼。。。
SyntaxError: invalid syntax
最后发现确实是环境问题。。
新建一个环境重新安装需要的包就解决了。
我是在Anaconda 的base里面直接安装的,然后那个环境被我玩坏了。。。
base那一个还不能删除。。强迫症的我看着它不爽。
于是,最后很复杂的还是卸载了重装了。
这个故事告诉我们!
一定要自己新建一个环境QAQ 玩坏了删掉重来
千万不能直接在base那个里面安装一大堆了。
据说,有些包污染环境很严重,这种一定要单独出来。。。
还好这次的问题不大,我也才起步,删掉重来也挺快的。。。
支持,希望持续更新 本帖最后由 翩跹叶惊鸿 于 2018-12-3 14:54 编辑
对于项目来说,pycharm比较好用,
但是练习的时候用anaconda自带的spyder就够了。
spyder占用的内存还小呢。
由于是个英语废,于是下载了spyder的汉化包。
新建的虚拟环境中的spyder需要切换到虚拟环境才能汉化。
cmd中 切换到anaconda的虚拟环境:
activate 环境名
spyder也是python写出来的,和python的包差不多。
汉化的时候,用python运行汉化包中的main.py就行了。
但是如果不切换,就是汉化的base(root)那一个环境的spyder。
pymongo:用python连接非关系型数据库MongoDB
本帖最后由 翩跹叶惊鸿 于 2018-12-3 15:25 编辑数据分析的第一步就是数据的来源,所以需要连接数据库!
【毕竟我们不可能把数据从数据库中导出来,在导入进python吧,数据量大了会死人的。。。
python中的代码一般是需要重复使用的,因此只需要使用一次的(例如新建一个查询)在编辑器中操作就行了。
在python中使用得更多的应该是查询数据,而不是修改数据。
【但是,python中也是可以修改数据的,python连接数据库也是相当于打开一个客户端,所以客户端能做的在python中都能做
from pymongo import MongoClient
client = MongoClient(host='localhost',port=27017)
db = client.yezi
res = db.stu1.find()
for i in res:
print(i)
client.close()
client是客户端对象,相当于是打开了一个客户端,
port默认是27017,也可简写为 client = MongoClient('localhost')
也可以连接一个局域网中其他电脑的数据库,
在cmd中,输入 ipconfig查看IPv4 地址,作为host的参数就行了。
具体的查询方法是:
客户端名.数据库名.集合名.find()
MongoDB 原生的查询格式是:db.集合名.find()【db也指的是数据库对象!
所以为了不搞混,db = client.yezi 将数据库对象取个名字叫db,然后就和原生的查询一样了。
MongoDB的查询中都是键值对。原生的查询中,键可以不加引号;但是python中必须加引号,否则会报错,
因为键值对在python中是字典,而字典的键必须是不可变的(例如字符串)!
查询出来的结果是一个数据库指针,是可迭代的,因此可用for循环,一条一条打印出来。
一旦关闭这个客户端,这个数据库指针就不能用了。
也可以使用list(),将这个指针转换为列表,列表中的每一个元素都是字典。
res1 = list(res) 此时的 res1 就是个列表,即使关闭了客户端依然存在。
最后一定要关闭这个客服端,不然就会一直开着占用内存!
养成好习惯!就像是用open()打开了文件也一定要关闭一样,
不过打开文件最好用 with open,完了就完了,免得忘记关闭。
pymysql:用python连接关系型数据库Mysql
本帖最后由 翩跹叶惊鸿 于 2018-12-3 16:19 编辑from pymysql import Connection
conn = Connection(
host='localhost',
user='root',
password='XXXXXX',
port=3306,
charset='utf8',
db='yezi'
)
cursor = conn.cursor()
SQL1 = 'select * from yezi;'
cursor.execute(SQL1)
data1 = cursor.fetchall()
for d in data1:
print(d)
try:
SQL2 = "UPDATE yezi SET `name`='小叶' WHERE id=1;"
cursor.execute(SQL2)
conn.commit() #查询以外的操作一定要提交
except Exception as e:
print(e)
conn.rollback()
cursor.execute(SQL1)
data2 = cursor.fetchall()
for d in data2:
print(d)
cursor.close()
conn.close()
连接没什么好说的,也就是主机名账户密码端口编码,db是数据库名。
得到的conn也是一个客户端对象。
conn.cursor() 是创建了一个数据库指针,取了个名字叫cursor。【进入的是,连接客户端时 db那个参数的数据库
cursor.execute() 是执行括号中的SQL语句,执行的结果会保存在cursor中,
因此需要 cursor.fetchall() 来读取数据,读取出来的是一个元组。
fetchall() 是读取全部;fetchone() 读取一条;fetchmany(n) 是读取n条。
cursor.execute() 只要是SQL语句都能执行,当然也可以切换数据库,增删改查都可以。
这个数据库指针,用完了也需要关闭!
重新创建一个的时候,进入的是连接客户端时,db那个参数的数据库。
一般来说都是关闭数据库指针,不会关闭客户端,因为重新连接需要时间。
当然,用完了之后,客户端也是需要关闭的。
为了代码的可读性,先把SQL语句写好再执行!
SQL语句就是个字符串,因为,字符串能用的函数都能用!
比方说,使用格式化字符串就能手动输入表名,然后查询出结果:
name = input('表的名字:')
SQL = 'select * from {};'.format(name)
cursor.execute(SQL)
data = cursor.fetchall()
for d in data:
print(d)
执行了查询以外的操作,需要提交才会生效。也就是:conn.commit()
那个try except不是必要的,但是为了数据安全,最好加上,好习惯很重要。
conn.rollback() 是数据回滚,回到处理之前的样子!也就是说,一旦报错了就变回去!保证了数据的安全。
连接数据库,首先需要会基本的数据库操作,增删改查,特别是查!
不用太精通,毕竟不是专门的DBA~
基本的就够用了,能提取出需要的数据就够了。
我们老师说,mysql只需要一开始登陆了就完事,
但是mongoDB据说如果有密码,每次都需要登陆??
啥意思??反正我是不明觉厉。。。
emmm 我用的都是自己的电脑上的MongoDB,没有密码那种~
实际工作中一般是 局域网中一群人连接一个数据库??
这些高深的操作还没尝试过。。。
有机会接触到再说吧。。。
本帖最后由 翩跹叶惊鸿 于 2019-6-25 17:55 编辑
##第一种:自带的
from urllib.request import Request, urlopen
from scrapy import Selector
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
URL = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip&oq=requests.get%25E4%25B8%25AD%25E7%259A%2584timeout%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_pq=9e512faf000fda05&rsv_t=ce28kApYTuAxtjle%2Fa0i5778f7ssmJJ5hukJt64RFu2JsHyit8EZthEdSk8&rqlang=cn&rsv_enter=0&inputT=10950&bs=requests.get%E4%B8%AD%E7%9A%84timeout%E6%98%AF%E4%BB%80%E4%B9%88'
req = Request(url=URL, headers=HEADERS)
html = urlopen(req).read()
text = Selector(text=html).xpath('//span[@class="c-gap-right"]/text()').extract()
print(text)
##第二种:需下载requests
from requests import get
from scrapy import Selector
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
URL = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip&oq=requests.get%25E4%25B8%25AD%25E7%259A%2584timeout%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_pq=9e512faf000fda05&rsv_t=ce28kApYTuAxtjle%2Fa0i5778f7ssmJJ5hukJt64RFu2JsHyit8EZthEdSk8&rqlang=cn&rsv_enter=0&inputT=10950&bs=requests.get%E4%B8%AD%E7%9A%84timeout%E6%98%AF%E4%BB%80%E4%B9%88'
html = get(url=URL, headers=HEADERS).text
text = Selector(text=html).xpath('//span[@class="c-gap-right"]/text()').extract()
print(text)
##使用代理1:自带的
from urllib import request
from scrapy import Selector
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
URL = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip&oq=requests.get%25E4%25B8%25AD%25E7%259A%2584timeout%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_pq=9e512faf000fda05&rsv_t=ce28kApYTuAxtjle%2Fa0i5778f7ssmJJ5hukJt64RFu2JsHyit8EZthEdSk8&rqlang=cn&rsv_enter=0&inputT=10950&bs=requests.get%E4%B8%AD%E7%9A%84timeout%E6%98%AF%E4%BB%80%E4%B9%88'
proxy = {"https":"203.42.227.113:8080"}
proxy_support = request.ProxyHandler(proxy)
opener = request.build_opener(proxy_support)
html = opener.open(URL).read()
text = Selector(text=html).xpath('//span[@class="c-gap-right"]/text()').extract()
print(text)
##使用代理2:requests
from requests import get
from scrapy import Selector
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
URL = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ip&oq=requests.get%25E4%25B8%25AD%25E7%259A%2584timeout%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_pq=9e512faf000fda05&rsv_t=ce28kApYTuAxtjle%2Fa0i5778f7ssmJJ5hukJt64RFu2JsHyit8EZthEdSk8&rqlang=cn&rsv_enter=0&inputT=10950&bs=requests.get%E4%B8%AD%E7%9A%84timeout%E6%98%AF%E4%BB%80%E4%B9%88'
proxy = {"https":"203.42.227.113:8080"}
html = get(url=URL, headers=HEADERS, proxies=proxy).text
text = Selector(text=html).xpath('//span[@class="c-gap-right"]/text()').extract()
print(text)
注:
1.需要密码的网页可以在headers中加cookie
2.爬链接就在解析网页时把xpath最后的‘text()’改为‘@href’
3.频繁的爬虫可使用time.sleep()暂停一段时间
4.正则表达式可以用 Selector(text=html).re(r'.*')
本帖最后由 翩跹叶惊鸿 于 2019-6-25 17:59 编辑
使用这个可以直接获取加载完数据之后的页面,然后解析就可以了。
看得到的都能获取,chromedriver必须和自己的浏览器版本最接近。
from selenium import webdriver
import time
browser = webdriver.Chrome(executable_path=r"C:\Users\Administrator\Desktop\chromedriver_win32\chromedriver.exe")
browser.get("http://www.baidu.com")
browser.maximize_window() #最大化浏览器
shuru = browser.find_element_by_id("kw")
shuru.send_keys('python') #输入文字
time.sleep(2)
baidu = browser.find_element_by_id("su")
baidu.click() #点击一下
time.sleep(5)
html = browser.page_source #爬数据
print(html)
browser.quit() #一定要关,不然任务管理器一直存在 本帖最后由 翩跹叶惊鸿 于 2019-6-27 17:37 编辑
爬虫的时候使用多线程,可以并发的爬数据,速度会比较快。
import threading
import time
def hehe(sj=2):
a=time.time()
time.sleep(sj)
b=time.time()
print(a,b,b-a)
threads = []
for i in range(3):
threads.append(threading.Thread(target=hehe,args=(i+1,)))#参数一定是元组!一个参数也是元组,没有参数的时候可以不写。
for t in threads:
t.start() 大佬牛逼 urllib超时的问题,如下设置即可,将默认的超时时间设置为20秒,然后超过20秒没加载出来就会提示超时了,可以结合try except使用。
import socket
timeout = 20
socket.setdefaulttimeout(timeout)
爬虫常用的2种方式:
from urllib.request import Request, urlopen
from requests import get
今天突然发现,需要跳转的网址,只能用自带的urllib来爬。
例如这个微博网址:https://weibo.com/1420157965 【会跳转到 https://weibo.com/cqcb
爬的时候,用get那种方式,不会报错,但是内容不对。
而使用Request, urlopen,就能得到争取的内容。
主要是在爬百度的时候,得到的几乎都是跳转链接。
需要使用自带的urllib来爬取内容。 全是大佬,看着那么长串{:5_107:}的代码,我头皮麻了{:5_107:} 本帖最后由 翩跹叶惊鸿 于 2023-8-7 14:47 编辑
使用pyinstaller打包文件的时候,需要把一些很奇怪的依赖加进去!
比方说使用pandas写入excel的时候,openpyxl必须一起打包。不设置甚至不会被打包。。
pyinstaller --hidden-import=openpyxl.cell._writer -D -i aa.ico test.py
页:
[1]