使用 Python 自动进行数据挖掘的建议
Posted
技术标签:
【中文标题】使用 Python 自动进行数据挖掘的建议【英文标题】:Advice on automating datamining with Python 【发布时间】:2017-01-19 10:42:50 【问题描述】:我是一名生物学家,有一点 Python 编程经验。我的研究方法之一是使用此数据库分析大型基因列表:https://david.ncifcrf.gov/ 谁能告诉我是否可以对输出进行关键字搜索并返回与关键字相关的基因名称?这是针对“表格”输出的,看起来像这样:https://david.ncifcrf.gov/annotationReport.jsp?annot=59,12,87,88,30,38,46,3,5,55,53,70,79¤tList=0 还有后端和 api 选项。 非常感谢所有见解和建议。
【问题讨论】:
如果有一个开放的 API,你应该在研究网络抓取之前尝试使用它。 david.ncifcrf.gov/… 也不适合我。 API 限制是否满足您的需求?少于 400 个基因,url 输入限制为 2048 个字符,每天 200 个请求?至于您提供的带有关键字搜索链接的其他问题似乎不起作用(会话已过期) 仅供参考,您提供的第二个链接已损坏。 您究竟想要做什么还不清楚,但如果可能的话,在生物信息学中大量使用的 Python 中应该是可行的,甚至有点容易。 感谢您的回复。对于断开的链接,我深表歉意。这是使用 DAVID 提供的测试基因列表的“表格”输出示例。 【参考方案1】:如果有一个 API 可以为您提供所有数据,那么您几乎可以自动化与其相关的所有内容。 API 是 REST 或 SOAP,所以首先您需要弄清楚您需要什么。
如果 API 是 RESTful:
import urllib2, json
url = "https://mysuperapiurl.com/api-ws/api/port/"
u = 'APIUsername'
p = 'APIPassword'
def encodeUserData(user, password):
return "Basic " + (user + ":" + password).encode("base64").rstrip()
req = urllib2.Request(url)
req.add_header('Accept', 'application/json')
req.add_header("Content-type", "application/x-www-form-urlencoded")
req.add_header('Authorization', encodeUserData(u, p))
res = urllib2.urlopen(req)
j = json.load(res) # Here is all the data from the API
json_str= json.dumps(j) # this is the same as above as string
如果 API 是 SOAP,它会变得有点困难。我推荐的是zeep。如果因为您的服务器是 2.6 或者因为有几个人正在使用它而无法做到这一点,那么请使用suds
。
使用 suds,API 调用如下所示:
import logging, time, requests, re, suds_requests
from datetime import timedelta,date,datetime,tzinfo
from requests.auth import HTTPBasicAuth
from suds.client import Client
from suds.wsse import *
from suds import null
from cStringIO import StringIO
from bs4 import BeautifulSoup as Soup
log_stream = StringIO()
logging.basicConfig(stream=log_stream, level=logging.INFO)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
WSDL_URL = 'http://213.166.38.97:8080/SRIManagementWS/services/SRIManagementSOAP?wsdl'
username='username'
password='password'
session = requests.session()
session.auth=(username, password)
def addSecurityHeader(client,username,password):
security=Security()
userNameToken=UsernameToken(username,password)
security.tokens.append(userNameToken)
client.set_options(wsse=security)
addSecurityHeader(client,username,password)
arg1 = "argument_1"
arg2 = "argument_2"
try:
client.service.GetServiceById(arg1, arg2)
except TypeNotFound as e:
print e
logresults = log_stream.getvalue()
您将收到 xml 作为回报,因此我使用beautifulsoup
来美化结果:
soup = Soup(logresults)
print soup.prettify()
好的,API 连接部分已经介绍完毕,您将数据存储在哪里,以及您在哪里迭代这些数据以执行关键字搜索?在您的数据库中。我推荐mysqldb
。设置表格并考虑将哪些信息(从 API 收集)存储在哪一列中。
def dbconnect():
try:
db = MySQLdb.connect(
host='localhost',
user='root',
passwd='password',
db='mysuperdb'
)
except Exception as e:
sys.exit("Can't connect to database")
return db
def getSQL():
db = dbconnect()
cursor = db.cursor()
sql = "select * from yoursupertable"
dta = cursor.execute(sql)
results = cursor.fetchall()
return results
def dataResult():
results = getSQL()
for column in results:
id = (column[1])
print dataResult()
所以这是您设置关键字的地方(也可以通过另一个 SQL 来完成),并将您从数据库中提取的结果与列表、字典、文本文件或硬编码关键字进行比较,并定义如果它们匹配等要做什么:)
【讨论】:
感谢您的帮助。我会告诉你进展如何。 如果这个答案对你有帮助,请考虑投票/接受作为答案。以上是关于使用 Python 自动进行数据挖掘的建议的主要内容,如果未能解决你的问题,请参考以下文章