在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3315|回复: 3

[转贴] 关于 Python 数据抓取、分析、挖掘、机器学习和Python 分布式计算内容分享

[复制链接]
发表于 2018-1-9 12:58:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x

01

数据抓取

1、背景

1检查robots.txt,了解爬取该网站有哪些限制

2pip install builtwithpip install python-whois



                               
登录/注册后可看大图




2、数据抓取:

1动态加载的内容

使用selenium


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import sys
reload(sys)
sys.setdefaultencoding(
'utf8')
driver = webdriver.Chrome(
"/Users/didi/Downloads/chromedriver") driver.get('http://xxx')
elem_account = driver.find_element_by_name(
"UserName")
elem_password = driver.find_element_by_name(
"Password")
elem_code = driver.find_element_by_name(
"VerificationCode") elem_account.clear()
elem_password.clear()
elem_code.clear()
elem_account.send_keys(
"username")
elem_password.send_keys(
"pass")
elem_code.send_keys(
"abcd")
time.sleep(
10)
driver.find_element_by_id(
"btnSubmit").submit()
time.sleep(
5) driver.find_element_by_class_name("txtKeyword").send_keys(u"x") #拟搜索driver.find_element_by_class_name("btnSerch").click()
# ...省略处理过程
dw = driver.find_elements_by_xpath(
'//li[@class="min"]/dl/dt/a')
for item in dw:
url = item.get_attribute(
'href')
   
if url:
ulist.append(url)
print(url +
"---" + str(pnum))
print(
"##################")


2)静态加载的内

1)正

2lxml;

3bs4

#!/usr/bin/env python
# -*- coding: utf-8 -*-
string =
r'src="(http://imgsrc\.baidu\.com.+?\.jpg)"pic_ext="jpeg"'
# 则表达式字符串 urls = re.findall(string, html)
import requests
from lxml import etree
import urllib
response = requests.get(url)
html = etree.HTML(requests.get(url).content)
res = html.xpath(
'//div[@class="d_post_contentj_d_post_content "]/img[@class="BDE_Image"]/@src') # lxml
import requests
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text,
'lxml') # 解析response创建BeautifulSoup对象 urls = soup.find_all('img', 'BDE_Image')





                               
登录/注册后可看大图

3):反爬与反反爬

1):请求频率

2):请求头

3):IP代理;

4):爬虫框架:

1):Scrapy

2):Portia


02

数据分析

1、常用的数据分析


NumPy:是基于向量化的运算。http://www.numpy.org/

1List =>

2ndim维度;shape:行数和列数;size:元素个数


Scipy:是NumPy扩展,有高等数学、信号处理、统计等。https://www.scipy.org/



                               
登录/注册后可看大图



Pandas:是基于NumPy的快速构建高级数据结构的包,数据结构:SeriesDataFramehttp://pandas.pydata.org/

1):NumPy类似于ListPandas 类似于Dict


Matplotlib绘图库

1):是一个强大的绘图工具

2):支持散点图、线图、柱状图等


简单例子:
pip2 install Numpy
>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([
0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a ** 2
array([
0, 1, 4, 9, 16, 25, 36, 49, 64, 81])
pip2 install Scipy
>>> import numpy as np
>>> from scipy import linalg
>>> a = np.array([[1, 2],[3, 4]])
>>> linalg.det(a)
-
2.0
pip2 install pandas
>>> df = pd.DataFrame({ 'A' : pd.date_range("20170802", periods=5), 'B' : pd.Series([11, 22, 33, 44,
55]), 'C' :pd.Categorical(["t","a","b","c","g"])})
>>> df
ABC
0
2017-08-02
11 t 1
2017-08-03
22 a 2
2017-08-04
33 b 3
2017-08-05
44 c 4
2017-08-06
55 g
pip2 install Matplotlib
>>> import matplotlib.pyplot as plt
>>> plt.plot([1, 2, 3])
[<matplotlib.lines.Line2D object at
0x113f88f50>]
>>> plt.ylabel("didi")
<matplotlib.text.Text object at
0x110b21c10>
>>> plt.show()


2、高级数据分析库:

scikit-learn:机器学习框架




                               
登录/注册后可看大图

图上可以表示出数据小于50No:需要更多的数据,Yes使用分类器,一直走下去



                               
登录/注册后可看大图



图中,可以看到算法有四类,分类,回归,聚类,降维

KNN:

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
'''
预测Irishttps://en.wikipedia.org/wiki/Iris_flower_data_set '''
# 导入模块
from __future__ import print_function
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 创建数据
iris = datasets.load_iris()
iris_X = iris.data
# 花萼的长宽、
花瓣的长宽
iris_y = iris.target
# 花的种 0, 1, 2
print(iris_X)
print(iris_y)
print(iris.target_names)
# 义模型-训练模型-预测
X_train, X_test, y_train, y_test = train_test_split(iris_X, iris_y, test_size=
0.1) # 训练数据10% knn = KNeighborsClassifier() # 创建KNN邻器
knn.fit(X_train, y_train)
# 训练数据
predicts = knn.predict(X_test)
# 得到预测结果
# 对比结果
print(
"#########################")
print(X_test)
print(predicts)
print(y_test)
# 计算预测准确率
print(knn.score(X_test, y_test))
[[
5.
3.3
1.4
0.2]
[
5.
3.5
1.3
0.3]
[
6.7
3.1
5.6
2.4]
[
5.8
2.7
3.9
1.2]
[
6.
2.2
5.
1.5]
[
6.
3.
4.8
1.8]
[
6.3
2.5
5.
1.9]
[
5.
3.6
1.4
0.2]
[
5.6
2.9
3.6
1.3]
[
6.9
3.2
5.7
2.3]
[
4.9
3.
1.4
0.2]
[
5.9
3.
4.2
1.5]
[
4.8
3.
1.4
0.1]
[
5.1
3.4
1.5
0.2]
[
4.7
3.2
1.6
0.2]]
[
0
0
2
1
1
2
2
0
1
2
0
1
0
0
0]
[
0
0
2
1
2
2
2
0
1
2
0
1
0
0
0]
0.933333333333

Linear Regression

#!/usr/local/bin/python # -*- coding: utf-8-*- '''
波士顿房价趋势
'''
# 导入模块
from __future__ import print_function
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# 创建数据
loaded_data = datasets.load_boston()
#波士顿的房价
data_X = loaded_data.data
data_y = loaded_data.target
print(data_X)
print(data_y)
# 义模型-训练模型-预测
model = LinearRegression()
# 线性回归
model.fit(data_X, data_y)
# 训练数据
print(model.predict(data_X[:
4,:])) # 得到预测结果
print(data_y[:
4])
# 结果
print(
"#########################")
X, y = datasets.make_regression(n_samples=
100,n_features=1, noise=10) # 生成回归模型数据100样本, 每个样本一个特征, 高斯噪声
plt.scatter(X, y)
# 散点
plt.show()





                               
登录/注册后可看大图

03

数据挖掘

1、挖掘关键词

涉及到的算法:TF-IDF

参考文献:http://www.ruanyifeng.com/blog/2013/03/tf-idf.html

news.txt:
滴滴出行与欧非地区领先出行企业Taxify达成战略合作
支持跨地区交通技术创新
2017-08-01
滴滴出行
201781日,中国,北京/爱沙尼亚,塔林】滴滴出行今日宣布与欧非地区移动出行领军企业Taxify达成战略合作
。滴滴将通过投资以及智能交通技术研发等方面协作,支持Taxify在多元市场进行更深度的市场拓展和技术创新。
滴滴出行是全球领先的移动出行平台。依靠人工智能技术, 滴滴在超400个城市4亿多用户提供包括出租车、专车、快车、豪华车和顺风车等在内的多元化出行服务。在为1700
余万司机提供灵活就业与收入机会的同时,滴滴也以人工智能技术支持城市管理者建设一体化、可持续的智慧交通解决
方案。Taxify2013年成立于爱沙尼亚,是欧洲和非洲地区成长最快的移动出行企业。目前其出租车和私家车共享出行服务网
络遍及欧洲、非洲、西亚的中心城市;触达匈牙利、罗马尼亚、波兰、波罗的海三国、南非、尼日利亚、肯尼亚等18
国家,拥有超过250万用户。
滴滴出行创始人、CEO维表示:“Taxify在多元化的市场提供优质的创新型出行服务。我们都致力于运用移动互联网
科技的力量,满足迅速演变的消费者需求;帮助传统交通行业转型升级。我相信这一合作将为亚洲,欧洲和非洲市场间
构建跨地区智慧交通纽带作出贡献。
Taxify
创始人、CEO马克斯·维利格(Marcus Villig)表示:“Taxify将借力此次战略合作,巩固我们在欧洲和非洲核心市场的优势地位。我们相信滴滴是最理想的
伙伴,能帮助我们成为欧非地区最受欢迎和最有效率的出行选择。
#!/usr/local/bin/python # -*- coding: utf
-8 -*- '''
分析文章关键词
'''
import os
import codecs
import pandas
import jieba
import jieba.analyse
#
格式化数据格式
tagDF = pandas.DataFrame(columns=[
'filePath', 'content', 'tag1', 'tag2', 'tag3', 'tag4', 'tag5'])try:
with open(
'./houhuiyang/news.txt', 'r')as f: #载入语料库 content = f.read().strip()
   tags = jieba.analyse.extract_tags(content, topK=
5) #TF_IDF
   tagDF.loc[
len(tagDF)] = ["./news.txt", content, tags[0], tags[1],tags[2], tags[3],tags[4]]
   
print(tagDF)
except Exception, ex:
   
print(ex)





                               
登录/注册后可看大图

计算出文章Top5的关键词:出行、滴滴、Taxify、欧非、交通


2、情感分析

情感用语资料:http://www.keenage.com/html/c_bulletin_2007.htm

1)最简单的方式就是基于情感词典的方法;

2)复杂的就是基于机器学习的方法;

pip2 install nltk
>>> import nltk
>>> from nltk.corpus importstopwords #停止 >>> nltk.download() # 安装语料库
>>> t = "Didi is a travel company"
>>> word_list = nltk.word_tokenize(t)
>>> filtered_words = [word for word in word_list if wordnot in stopwords.words('english')] ['Didi', 'travel', 'company']
>>> nltk.download('stopwords') #载停止词
中英文NLP词区别
1):
发式 Heuristic
2):
机器学/统计法:HMMCRF
处理流程:raw_text -> tokenize[pos tag] -> lemma/ stemming[pos tag] -> stopwords -> word_list


04

Python 分布式计算

pip2 install mrjjob

pip2 install pyspark

1Python 线程;

2Python 进程【multiprocessing;

3)全局解释器锁GIL;

4进程间通信Queue;

5进程池Pool;

6Python的高阶函数;

map/reduce/filter


7)基于Linux的管道的MapReducercat word.log | python mapper.py |python reducer.py | sort -k 2r

word.log
北京
成都
上海
北京
山西
天津
广州
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
'''
mapper
'''

import sys
try:
   for lines in sys.stdin:
       line = lines.split()
       for word in line:
           if len(word.strip())==
0:
               continue
           count =
"%s,%d" % (word, 1)
           print(count)
except IOError, ex:
print(ex)
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
'''
reducer
'''

import sys
try:
   word_dict = {}
   for lines in sys.stdin:
       line = lines.split(
",")
       if len(line) !=
2:
           continue
       word_dict.setdefault(line[
0], 0)
       word_dict[line[
0]]+= int(line[1])
   for key, val in word_dict.items():
    stat =
"%s%d" %(key, val)
       print(stat)
except IOError, ex:
print(ex)



                               
登录/注册后可看大图



05

经网络

别有cpu/GPU版本

1tensorflow 建立的神经网络是静态

2pytorch http://pytorch.org/#pip-install-pytorch 建立的神经网络是动态的
TrochLua写的,这个是Python版本】

简单说数据:



                               
登录/注册后可看大图



标量(Scalar)是只有大小,没有方向的量,如123

向量(Vector)是有大小和方向的量,其实就是一串数字,如(1,2)

(Matrix)是好几个向量拍成一排合并而成的一堆数字,如[1,2;3,4]

张量(Tensor)是按照任意维排列的一堆数字的推广。如图所示,矩阵不过是三维张量下的一个二维切面。要找到三维张量下的一个
标量,需要三个维度的坐标来定位

TensorFlow pytorch张量这种数据结构来表示所有的数据


#-*- coding: UTF-8 -*-
#author houhuiyang
import torch
import numpy as np
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
np_data = np.arange(
6).reshape((2, 3))
torch_data = torch.from_numpy(np_data)
tensor2np = torch_data.numpy()
print(
"\nnp_data", np_data, #
"\ntorch_data", torch_data, #张量
"\ntensorto numpy",tensor2np
)
# data = [-1, -2, 1, 2, 3]
data = [[
1, 2],[3, 4]]
tensor = torch.FloatTensor(data)
# abs sin cos mean平均 matmul/mm print(
"\nnumpy", np.matmul(data, data),
  
"\ntorch", torch.mm(tensor, tensor)
)
# tensor variable
tensor_v = torch.FloatTensor([[
1,2], [3,4]])variable = Variable(tensor_v, requires_grad=True) # 计算中值
t_out = torch.mean(tensor_v * tensor_v)
# x ^ 2 v_out = torch.mean(variable *variable) # 反向传播 print(
  tensor_v,
  variable,
  t_out,
  v_out
)
v_out.backward()
# 反向传递
print(variable.grad)
# 梯度
'''
y = Wx
线性
y =AF(Wx)
线性
【激励函数relu/sigmoid/tanh
'''

x =torch.linspace(
-5,5,200) # -55200个点
x = Variable(x)
x_np = x.data.numpy()
y_relu = F.relu(x).data.numpy()
y_sigmoid = F.sigmoid(x).data.numpy()
y_tanh = F.tanh(x).data.numpy()
# y_softplus =F.softplus(x).data.numpy() # 概率 plt.figure(1, figsize=(8, 6))
# plt.subplot(221) # 绘制子图
plt.plot(x_np, y_relu, c =
"red", label = "relu") plt.ylim(-1, 5)
plt.legend(loc =
"best")
plt.show()
# plt.subplot(222)
plt.plot(x_np, y_sigmoid, c =
"red", label = "igmoid")
plt.ylim(
-0.2, 1.2)
plt.legend(loc =
"best")
plt.show()
# plt.subplot(223)
plt.plot(x_np, y_tanh, c =
"red", label = "subplot")
plt.ylim(
-1.2, 1.2)
plt.legend(loc =
"best")
plt.show()


搭建简单的神经网络

#-*- coding: UTF-8 -*- #author 守望之心
'''


'''

import torch
from torch.autograd import Variable
import torch.nn.functional as F
# 激励函数
import matplotlib.pyplot as plt
x = torch.unsqueeze(torch.linspace(
-1, 1, 100),dim = 1) # unsqueeze 维转变为二维 y = x.pow(2) + 0.2 * torch.rand(x.size())
x, y = Variable(x), Variable(y)
# print(x)
# print(y)
#plt.scatter(x.data.numpy(), y.data.numpy())
# plt.show()
class
Net(torch.nn.Module): # 继承 torch Moudle
def
__init__(self, n_features, n_hidden, n_output):
super(Net, self).__init__()
# 继承torch __init__
self.hidden = torch.nn.Linear(n_features, n_hidden)
# 隐藏层线性输出 self.predict = torch.nn.Linear(n_hidden,n_output) # 输出线性层
def
forward(self, x):
x = F.relu(self.hidden(x))
# 激励函数 x = self.predict(x) # 输出值
return x
net = Net(
1, 10, 1) # 输入值,
隐藏层1010个神经元, 1输出值 print(net) # 输出搭建的神经网络结构
plt.ion()
plt.show()
# 训练工具
optimizer = torch.optim.SGD(net.parameters(), lr =
0.5) # 传入net的所有值, lr是学习率 loss_func = torch.nn.MSELoss() # 均方差
print(net.parameters())
for t in range(
100):
prediction = net(x)
#net 训练数据x
输出预测值 loss = loss_func(prediction, y) # 计算两者误差
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
if t %
5 == 0:
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(),
"r-", lw = 5)
plt.text(
0.5, 0, 'Loss=%.4f' % loss.data[0], fontdict={'size': 20, 'color':  'red'})
plt.pause(
0.1)
plt.ioff()
plt.show()


                               
登录/注册后可看大图





                               
登录/注册后可看大图


06

数学




1、极限:

穷大无穷小阶数;


2、微分学:

导数:

1导数就是曲线的斜率,是曲线变化快慢的反应;

2)二阶导数是斜率变化快慢的反应,表现曲线的凸凹性;

泰勒级数逼

顿法和梯度下降;


3Jensen不等式:

凸函数;Jensen不等式


概率:

1积分学:

-莱布尼茨公式


2、概率空

随机变量与概率:概率密度函数的积分;条件概率;轭分布;

概率分布:

1)两点分布/贝努力分布;

2)二项分布;

3)泊松分布;

4)均匀分布;

5)指数分布;

6)正态分布/高斯分布;


3、大数定律和中心极限

线性代数:

1)矩

2线性回归;

发表于 2018-1-18 22:21:20 | 显示全部楼层
thanks for sharing
发表于 2018-5-30 10:39:53 | 显示全部楼层
感谢分享!!!
发表于 2018-8-25 02:00:14 | 显示全部楼层
thanks for sharing
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 16:53 , Processed in 0.034548 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表