首页 > 数据库 >Python数据分析NumPy和pandas(十八、从Web APIs 和 数据库中获取数据)

Python数据分析NumPy和pandas(十八、从Web APIs 和 数据库中获取数据)

时间:2024-11-02 19:48:32浏览次数:5  
标签:node ... None Web APIs url 获取数据 https id

一、与Web APIs 进行数据交互

很多Web网站都提供公共的API,并通过 JSON 或其他格式提供数据。那Python也有很多种方法可以访问网站提供的API,其中一种常用的方法是通过使用 requests 库,使用之前需要先安装它,这里通过pip安装:

pip install requests

下面我通过GitHub网站提供的API来学习使用requests。例如,要在 GitHub 上找到 pandas 的最后 30 个 GitHub 问题列表数据,我们可以使用附加组件requests库发出 GET HTTP 请求:

import requests

url = "https://api.github.com/repos/pandas-dev/pandas/issues"
resp = requests.get(url)
resp.raise_for_status()
print(resp)

以上代码首先导入了requests库,url定义了要访问的API接口,然后通过requests.get()方法访问该接口,并用resp变量获取访问的结果,最后通过结果对象的raise_for_status()方法检查是否有HTTP错误,我们最好始终在使用 requests.get 后调用 raise_for_status 来检查 HTTP 错误。打印resp的输出结果是:<Response [200]>  200表示访问成功。

响应对象resp的 json() 方法会返回一个 Python 对象,其中包含从API接口获取的并已经解析的 JSON 数据(如字典或列表所示)(取决于返回的 JSON内的数据格式):

import requests

url = "https://api.github.com/repos/pandas-dev/pandas/issues"
resp = requests.get(url)
resp.raise_for_status()

#用响应对象resp的json方法获取python对象
data = resp.json()
#获取第一个元素的title
title = data[0]["title"]
print(title)

输出结果是:

DOC: Update contributing docs for Windows build tools instructions

因为通过这个API检索到的结果是实时数据,因此我们在不同的时候运行此代码会得到不同的第一个问题的标题。data 中的每个元素都是一个字典,包含在 GitHub 问题页面上找到的所有数据(评论除外)。我们可以将data直接传递给 pandas.DataFrame构造一个DataFrame对象并提取我们感兴趣的字段。如下代码:

import pandas as pd
import requests

url = "https://api.github.com/repos/pandas-dev/pandas/issues"
resp = requests.get(url)
resp.raise_for_status()

#用响应对象resp的json方法获取python对象
data = resp.json()
issues = pd.DataFrame(data, columns=["number", "title", "labels", "state"])
print(issues)

输出结果:

numbertitlelabelsstate
060170DOC: Update contributing docs for Windows build tools instructions[]open
160169BUG: build_table_schema (AttributeError: 'datetime.timezone' object has...[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
260166BUG: fix #60128 BUG: Series.combine_first loss of precision[]open
360163QST: Why Doesn't Pandas Have an Insert Index Function or Method?[{'id': 34444536, 'node_id': 'MDU6TGFiZWwzNDQ0NDUzNg==', 'url': 'https:...open
460162ENH: "stripna" for dropping leading or trailing NaNs[{'id': 76812, 'node_id': 'MDU6TGFiZWw3NjgxMg==', 'url': 'https://api.g...open
560161ENH: Add `area_limit` to `fillna[{'id': 76812, 'node_id': 'MDU6TGFiZWw3NjgxMg==', 'url': 'https://api.g...open
660159BUG/API: preserve dtype in Index `append()`[{'id': 31404521, 'node_id': 'MDU6TGFiZWwzMTQwNDUyMQ==', 'url': 'https:...open
760154CI: add test build with numpy 1.26 (<2)[{'id': 48070600, 'node_id': 'MDU6TGFiZWw0ODA3MDYwMA==', 'url': 'https:...open
860149BUG: Docs won't build (Unexpected exception in `doc\source\user_guide\e...[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
960148DOC: pandas.DataFrame.to_html additional description for the border par...[{'id': 134699, 'node_id': 'MDU6TGFiZWwxMzQ2OTk=', 'url': 'https://api....open
1060146CI: Add Windows wheels for the free-threaded build[{'id': 129350, 'node_id': 'MDU6TGFiZWwxMjkzNTA=', 'url': 'https://api....open
1160136[backport 2.3.x] TST (string dtype): add explicit object vs str dtype t...[]open
1260134TST (string dtype): remove xfails in extension tests + fix categorical/...[{'id': 57522093, 'node_id': 'MDU6TGFiZWw1NzUyMjA5Mw==', 'url': 'https:...open
1360129ENH: allow complex type inference in convert_dtypes[{'id': 76812, 'node_id': 'MDU6TGFiZWw3NjgxMg==', 'url': 'https://api.g...open
1460128BUG: Series.combine_first loss of precision[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
1560127BUG: Assigning boolean series with logical indexer[{'id': 2822098, 'node_id': 'MDU6TGFiZWwyODIyMDk4', 'url': 'https://api...open
1660126VOTE: Voting issue for PDEP-17: Backwards compatibility and deprecation...[{'id': 5732441949, 'node_id': 'LA_kwDOAA0YD88AAAABVa4fXQ', 'url': 'htt...open
1760124BUG: 'Engine' object has no attribute 'cursor'[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
1860120BUG: isin check incorrect with uint64 dtype[]open
1960119TST (string dtype): fix xfails in test_algos.py[{'id': 57522093, 'node_id': 'MDU6TGFiZWw1NzUyMjA5Mw==', 'url': 'https:...open
2060115Fixes: [#60084] Added a new file test_timestamp_hash.py[{'id': 127685, 'node_id': 'MDU6TGFiZWwxMjc2ODU=', 'url': 'https://api....open
2160111ENH: A .chi2() method on the DataFrame and Series class that will resem...[{'id': 76812, 'node_id': 'MDU6TGFiZWw3NjgxMg==', 'url': 'https://api.g...open
2260108BUG: many dataframe operations broken when a column contains numpy stru...[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
2360105Fix BUG: read_sql tries to convert blob/varbinary to string with pyarro...[{'id': 47232590, 'node_id': 'MDU6TGFiZWw0NzIzMjU5MA==', 'url': 'https:...open
2460104BUG: Unknown slicing behavior for Multiindexing when passing through st...[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
2560102BUG: Frequency shift on empty DataFrame doesn't shift index[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
2660100BUG: `read_csv` with chained fsspec TAR file and `compression="infer"` ...[]open
2760099BUG: Inconsistent output type in Excel for PeriodIndex in Index or Mult...[{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ==', 'url': 'https://api.g...open
2860098PERF: Slowdowns with .isin() on columns typed as np.uint64[{'id': 8935311, 'node_id': 'MDU6TGFiZWw4OTM1MzEx', 'url': 'https://api...open
2960097[TST] Parse arrow_dtype as datetime index[{'id': 127685, 'node_id': 'MDU6TGFiZWwxMjc2ODU=', 'url': 'https://api....open

在我们的实际开发或进行数据分析的时候,我们可以创建一些更方便的Web API接口,让这些接口返回 DataFrame 对象,从而可以更方便的应用pandas进行数据分析。

二、与数据库进行数据交互

在正式业务环境中,数据一般不会存储在文本文件或 Excel 文件中。这个大家都知道,当前主流方式还是将数据存储在基于 SQL 的关系数据库中(如 SQL Server、PostgreSQL 和 MySQL)。至于选择用那种数据库,取决于应用程序的性能、数据完整性和可伸缩性的需求。

pandas 具有一些好的功能,可以非常方便的将 SQL 查询结果加载到 DataFrame 中。下面我将使用 Python 内置 sqlite3 驱动程序创建一个 SQLite3 数据库进行学习。我还是通过代码来学习更直观:

import pandas as pd
import sqlite3

#创建一个表名为test的表,该表有a,b,c,d四个字段。
query = """
CREATE TABLE test
(a VARCHAR(20), b VARCHAR(20),
 c REAL,        d INTEGER
);"""
#连接python内置的sqllite3数据库
con = sqlite3.connect("mydata.sqlite")
#执行建表语句
con.execute(query)
#提交事务
con.commit()

上面这部分代码定义了一个在sqlite中创建表test的语句,test表有a,b,c,d四个字段。接下来我们在test表中插入数据。

#要插入test表中的数据
data = [("Atlanta", "Georgia", 1.25, 6),
        ("Tallahassee", "Florida", 2.6, 3),
        ("Sacramento", "California", 1.7, 5)]
#插入语句
stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
#执行插入数据操作
con.executemany(stmt, data)
#提交事务
con.commit()

以上定义了要在test表中插入的数据data和插入语句,并执行提交。

#查询test全表,并返回一个游标
cursor = con.execute("SELECT * FROM test")
#获取返回的所有行数据
rows = cursor.fetchall()
#将数据打印出来看看
print(rows)

以上执行查询test全表数据,并通过获取的游标将返回的数据赋值给rows变量,然后打印输出rows。rows的输出结果是一个元组列表:

[('Atlanta', 'Georgia', 1.25, 6), ('Tallahassee', 'Florida', 2.6, 3), ('Sacramento', 'California', 1.7, 5)]

接下来我们可以将元组列表传递给 DataFrame 构造函数构造一个DataFrame对象,但是还需要获取列名来作为DataFrame对象的列标签(索引),列名我们可以通过游标cursor的 description 属性获得。请注意,对于 SQLite3,游标描述仅提供列名(其他字段是 Python 的数据库 API 规范的一部分,都是 None),但对于其他一些数据库驱动程序,description提供了更多的列信息。

cursor.description

这一行代码通过游标cursor的属性description获取表的列信息,对于SQLite3来说这个列信息只有列名,我们输出cursor.description来看下:

(('a', None, None, None, None, None, None), ('b', None, None, None, None, None, None), ('c', None, None, None, None, None, None), ('d', None, None, None, None, None, None))

#用返回的元组列表和列名构造一个DataFrame对象,
#列名通过推导式获得
pd_rows = pd.DataFrame(rows, columns=[x[0] for x in cursor.description])

上面用返回的元组列表rows和表test的列名构造了一个DataFrame对象pd_rows。下面我们将上面的代码完整的整合下,并输出最后pd_rows内容:

import pandas as pd
import sqlite3

#创建一个表名为test的表,该表有a,b,c,d四个字段。
query = """
CREATE TABLE test
(a VARCHAR(20), b VARCHAR(20),
 c REAL,        d INTEGER
);"""
#连接python内置的sqllite3数据库
con = sqlite3.connect("mydata.sqlite")
#执行建表语句
con.execute(query)
#提交事务
con.commit()

#要插入test表中的数据
data = [("Atlanta", "Georgia", 1.25, 6),
        ("Tallahassee", "Florida", 2.6, 3),
        ("Sacramento", "California", 1.7, 5)]
#插入语句
stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
#执行插入数据操作
con.executemany(stmt, data)
#提交事务
con.commit()

#查询test全表,并返回一个游标
cursor = con.execute("SELECT * FROM test")
#获取返回的所有行数据
rows = cursor.fetchall()
#将数据打印出来看看
print(rows)
#通过游标查看列信息,SQLite3的列信息中只包含列名
print(cursor.description)
#用返回的元组列表和列名构造一个DataFrame对象
pd_rows = pd.DataFrame(rows, columns=[x[0] for x in cursor.description])
print(pd_rows)

输出pd_rows结果:

                      a                b       c  d
0           Atlanta     Georgia  1.25  6
1   Tallahassee      Florida   2.60  3
2   Sacramento  California  1.70  5

上面的代码从连接数据库、创建表、插入表数据、查询表数据到通过返回的数据和列名构造DataFrame,这些工作还是比较繁琐的,我们不希望每次查询数据库时都重复一些操作。所以我再对 SQLAlchemy 项目进行一个简要的学习,SQLAlchemy是一个流行的 Python SQL 工具包,它抽象出 SQL 数据库之间的许多常见差异,同时,pandas 具有 read_sql()函数,可让我们很方便的从通用 SQLAlchemy 连接中读取数据。先用pip安装SQLAlchemy。

pip install sqlalchemy

现在,我将使用 SQLAlchemy 连接到同一个 SQLite 数据库,并从之前创建的表中读取数据:

import sqlalchemy as sqla

#连接到数据库
db = sqla.create_engine("sqlite:///mydata.sqlite")
#读取数据
data = pd.read_sql("SELECT * FROM test", db)
print(data)

输出结果:

                      a                b       c  d
0           Atlanta     Georgia  1.25  6
1   Tallahassee      Florida   2.60  3
2   Sacramento  California  1.70  5

这相比于之前使用python内置的sqlite中的方法的先连接到数据库、再执行查询、然后通过游标获取查询后的数据,最后用返回的数据和列名构造DataFrame对象简单了很多。


三、总结

在前面写的学习笔记过程中,我学习了许多有用的工具,通过这些学习算是入了数据分析的门了。但是访问数据通常是数据分析过程的第一步,在后面的学习过程中,还得更深入的学习数据整理、数据可视化、时间序列分析等。

标签:node,...,None,Web,APIs,url,获取数据,https,id
From: https://blog.csdn.net/FreedomLeo1/article/details/143454226

相关文章

  • PythonWeb项目开发(Django)数据增删改查的常用方法汇总以及Q,F对象的使用(模型与mysql数
    知识点增:模型类的管理器方法:create(),模型对象的方法save()查:模型类的管理器方法:all(),filter(),exclude(),get()    扩展常见的运算符(用于用户查询,删除,更新的条件):gt,gte,it,ite,in,range,exact,contains,icontains,startswith,isstartswith,endswith,iendswith......
  • three.js+vue智慧社区web3d数字孪生三维地图
    案例效果截图如下:具体案例场景和功能,详见b站视频:https://www.bilibili.com/video/BV1Bb421E7WL/?vd_source=7d4ec9c9275b9c7d16afe9b4625f636c 案例场景逻辑代码:<template><divid="whole"><!--threejs容器--><divid="three"ref="co......
  • 91.北极熊动物主题网页 Web前端网页制作 大学生期末大作业 html+css
     一、更多推荐欢迎来到我的CSDN主页!您的支持是我创作的动力!Web前端网页制作、网页完整代码、大学生期末大作业模板案例、技术交流等,有兴趣的联系我交流学习!更多优质博客文章、网页模板点击以下链接查阅:仙女网页设计-CSDN博客关注作者,点赞收藏博文,获取更多源码,3Q!二、网......
  • javaweb基于JSP+Servlet开发简单的家居购物商城系统源码 大作业 课程设计
    ......
  • 渗透测试--Fuzzing Web应用
    总体思路        当我们发现一个Web应用的时候,我们可以从Web的各个层面发起信息搜集。比如Web目录,了解Web页面的后端语言,揭露后端文件的参数,揭露后端文件参数的可选值,爆破子域名、获取私有域名等。这些信息将帮助我们进一步渗透,有时候会起到关键作用。其实其核心点就......
  • 猿人学web端爬虫攻防大赛赛题第19题——乌拉乌拉乌拉
    题目网址:https://match.yuanrenxue.cn/match/19解题步骤看触发的数据包。有这么好的事情,没有加密的参数,url非常简单,直接写代码访问。importrequestsurl="https://match.yuanrenxue.cn/api/match/19?page=1"headers={'Host':'match.yuanrenxue.cn','Connectio......
  • 猿人学web端爬虫攻防大赛赛题第16题——js逆向 - window蜜罐
    题目网址:https://match.yuanrenxue.cn/match/16解题步骤看触发数据包。明显m是经过特殊处理的,需要知道它的加密逻辑。看Initiator模块的window.request。m和t的赋值就在上面,打断点。先分析t。r.t=p_s=Date[e(496)](newDate)[e(517)]()将其中跟e相关的进行还原后,r.......
  • PythonWeb项目开发(Django)在PyCharm定义模型并与mysql数据库绑定
    测试所用的django项目结构如下:---------------------------------------------------------------------------------------------------------------------------------定义模型(以创建好的blog应用为例):重点操作对象1:之前创建应用(这里是blog文件夹)下面的models.py文件......
  • CTF之web题集详情随手笔记
    《Web安全》http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484238&idx=1&sn=ca66551c31e37b8d726f151265fc9211&chksm=c0e47a12f793f3049fefde6e9ebe9ec4e2c7626b8594511bd314783719c216bd9929962a71e6&scene=21#wechat_redirect1    WEB1......
  • 解释 RESTful API,以及如何使用它构建 web 应用程序。
    RESTfulAPI(RepresentationalStateTransfer)是一种设计风格,用于构建可扩展的网络服务。它基于HTTP协议,并使用标准的HTTP方法(例如GET、POST、PUT、DELETE)来实现对资源的创建、读取、更新和删除操作。RESTfulAPI的关键原则是将服务端的资源通过URL(统一资源定位符)暴露给......