鱼C论坛

 找回密码
 立即注册
查看: 3945|回复: 17

[技术交流] python数据分析的笔记

[复制链接]
发表于 2018-11-21 23:11:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 翩跹叶惊鸿 于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-21 23:22:34 | 显示全部楼层
然后等我把这些都安装好了以后,一个一个加载尝试有没有成功的时候。。。。

出现了  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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-22 18:14:04 | 显示全部楼层
最后发现确实是环境问题。。
新建一个环境重新安装需要的包就解决了。

我是在Anaconda 的base里面直接安装的,然后那个环境被我玩坏了。。。
base那一个还不能删除。。强迫症的我看着它不爽。
于是,最后很复杂的还是卸载了重装了。

这个故事告诉我们!
一定要自己新建一个环境QAQ 玩坏了删掉重来
千万不能直接在base那个里面安装一大堆了。

据说,有些包污染环境很严重,这种一定要单独出来。。。
还好这次的问题不大,我也才起步,删掉重来也挺快的。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-22 19:24:21 | 显示全部楼层
支持,希望持续更新
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-3 14:51:11 | 显示全部楼层
本帖最后由 翩跹叶惊鸿 于 2018-12-3 14:54 编辑

对于项目来说,pycharm比较好用,
但是练习的时候用anaconda自带的spyder就够了。
spyder占用的内存还小呢。

由于是个英语废,于是下载了spyder的汉化包。
新建的虚拟环境中的spyder需要切换到虚拟环境才能汉化。

cmd中 切换到anaconda的虚拟环境:
activate 环境名

spyder也是python写出来的,和python的包差不多。
汉化的时候,用python运行汉化包中的main.py就行了。
但是如果不切换,就是汉化的base(root)那一个环境的spyder。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-3 14:55:33 | 显示全部楼层

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,完了就完了,免得忘记关闭。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-3 15:30:08 | 显示全部楼层

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() 是数据回滚,回到处理之前的样子!也就是说,一旦报错了就变回去!保证了数据的安全。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-3 16:26:49 | 显示全部楼层
连接数据库,首先需要会基本的数据库操作,增删改查,特别是查!
不用太精通,毕竟不是专门的DBA~
基本的就够用了,能提取出需要的数据就够了。

我们老师说,mysql只需要一开始登陆了就完事,
但是mongoDB据说如果有密码,每次都需要登陆??
啥意思??反正我是不明觉厉。。。

emmm 我用的都是自己的电脑上的MongoDB,没有密码那种~

实际工作中一般是 局域网中一群人连接一个数据库??
这些高深的操作还没尝试过。。。
有机会接触到再说吧。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-3 09:52:03 | 显示全部楼层
本帖最后由 翩跹叶惊鸿 于 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()[0]
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()[0]
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()[0]
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()[0]
print(text)


注:
1.需要密码的网页可以在headers中加cookie
2.爬链接就在解析网页时把xpath最后的‘text()’改为‘@href’
3.频繁的爬虫可使用time.sleep()暂停一段时间
4.正则表达式可以用 Selector(text=html).re(r'.*')



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-25 17:56:49 | 显示全部楼层
本帖最后由 翩跹叶惊鸿 于 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() #一定要关,不然任务管理器一直存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-27 17:34:37 | 显示全部楼层
本帖最后由 翩跹叶惊鸿 于 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-13 10:44:27 | 显示全部楼层
大佬牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-6 23:41:30 | 显示全部楼层
urllib超时的问题,如下设置即可,将默认的超时时间设置为20秒,然后超过20秒没加载出来就会提示超时了,可以结合try except使用。

import socket

timeout = 20
socket.setdefaulttimeout(timeout)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-24 15:35:15 | 显示全部楼层
爬虫常用的2种方式:
from urllib.request import Request, urlopen
from requests import get

今天突然发现,需要跳转的网址,只能用自带的urllib来爬。
例如这个微博网址:https://weibo.com/1420157965 【会跳转到 https://weibo.com/cqcb

爬的时候,用get那种方式,不会报错,但是内容不对。
而使用Request, urlopen,就能得到争取的内容。

主要是在爬百度的时候,得到的几乎都是跳转链接。
需要使用自带的urllib来爬取内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-10 23:04:53 | 显示全部楼层
全是大佬,看着那么长串的代码,我头皮麻了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-7 14:31:22 | 显示全部楼层
本帖最后由 翩跹叶惊鸿 于 2023-8-7 14:47 编辑

使用pyinstaller打包文件的时候,需要把一些很奇怪的依赖加进去!
比方说使用pandas写入excel的时候,openpyxl必须一起打包。不设置甚至不会被打包。。

pyinstaller --hidden-import=openpyxl.cell._writer -D -i aa.ico test.py
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 00:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表