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

一、与Web APIs 进行数据交互

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

pip install requests

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

import requestsurl = "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 requestsurl = "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 requestsurl = "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对象简单了很多。


三、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/462561.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《华为工作法》读书摘记

无论做什么事情&#xff0c;首先要明确的就是做事的目标。目标是引导行动的关键&#xff0c;也是证明行动所具备的价值的前提&#xff0c;所以目标管理成了企业与个人管理的重要组成部分。 很多时候&#xff0c;勤奋、努力并不意味着就一定能把工作做好&#xff0c;也并不意味…

异步4位计数器(Quartus与Modelsim联合仿真)

异步计数器&#xff08;也称为ripple-through counter&#xff09;的特点是每一位触发器的输出作为下一位触发器的时钟输入&#xff0c;因此计数速度会因为级联触发器的传播延迟而受到限制。这种计数器的最大工作频率通常低于同步计数器。 一、电路符号 输入信号&#xff1a;时…

TIA 中用 GSD 方式组态 ET200SP 安全模块时如何用 S7-FCT 分配安全目标地址

1 概述 用 GSD 方式组态的 ET200SP 的分布式从站上&#xff0c;现在可以使用安全模块&#xff08;早期 是无法支持&#xff09;&#xff0c;这种用法对 ET200SP 接口模块的版本和编程软件的版本都有要求。 ET200SP 故障安全模块可通过 GSD 文件用于以下接口模块&#xff1a; …

git 入门作业

任务1: 破冰活动&#xff1a;自我介绍任务2: 实践项目&#xff1a;构建个人项目 git使用流程&#xff1a; 1.将本项目直接fork到自己的账号下&#xff0c;这样就可以直接在自己的账号下进行修改和提交。 这里插一条我遇到的问题&#xff0c;在fork的时候没有将那个only camp4的…

C++右值引用

一、右值引用的定义 1、什么是左值和左值引用&#xff1f; 左值指的是可以出现在等号左边&#xff0c;可以被赋值(非const)&#xff0c;可以取地址的值。 左值引用就是左值的引用&#xff0c;给左值取别名。(int& lr a) 2、什么是右值和右值引用&#xff1f; 右值指的是不…

【深度学习】时间序列预测、分类、异常检测、概率预测项目实战案例

说明&#xff1a;本专栏内容来自于个人学习笔记、以及相关项目的实践与总结。写作目的是为了让读者体会深度学习的独特魅力与无限潜力&#xff0c;以及在各行各业之中的应用与实践。因作者时间精力有限&#xff0c;难免有疏漏之处&#xff0c;期待与读者共同进步。 前言 在当今…

【重生之我要苦学C语言】深入理解指针2

深入理解指针2 const修饰指针 当const修饰变量时&#xff0c;是无法更该该变量的值的 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {const int a 10;//const常属性&#xff0c;不能改变的属性a 1;printf("%d\n", a);return 0; }报错&…

WPF+MVVM案例实战(十八)- 自定义字体图标按钮的封装与实现(ABD类)

文章目录 1、案例效果1、按钮分类2、ABD类按钮实现描述1.文件创建与代码实现2、样式引用与控件封装3、按钮案例演示1、页面实现与文件创建2、运行效果如下3、总结4、源代码获取1、案例效果 1、按钮分类 在WPF开发中,最常见的就是按钮的使用,这里我们总结以下大概的按钮种类,…

ARM base instruction -- mneg

Multiply-Negate multiplies two register values, negates the product, and writes the result to the destination register. 乘法-求反&#xff0c;将两个寄存器值相乘&#xff0c;对乘积求反&#xff0c;并将结果写入目标寄存器。 32-bit variant Applies when sf 0…

【鸿蒙新闻】10月29日警用鸿蒙开发者大会在北京胜利召开,开启智慧应用新时代!

10月29日&#xff0c;在公安部科技信息化局、公安部装备财务局指导下&#xff0c;由公安部第一研究所主办&#xff0c;鼎桥通信技术有限公司、OpenHarmony生态委员会及公共安全专委会协办的警用鸿蒙开发者大会在北京胜利召开。会议以“拥抱警鸿创新生态 开启智慧应用新时代”为…

架构师备考-软件工程相关补充

软件开发生命周期 按照传统的软件生命周期方法学&#xff0c;可以把软件生命周期划分为软件定义、软件开发、软件运行与维护三个阶段。 软件定义&#xff1a;软件定义包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的目标。具体可分为问题定义、…

OpenGL入门003——使用Factory设计模式简化渲染流程

前面两节已经学会了如何使用opengl创建窗口并绘制三角形&#xff0c;我们可以看出有些步骤是固定的&#xff0c;而且都写在main.cpp&#xff0c;这一节我们将了解如何使用Factroy设计模型。将模型渲染逻辑封装在一个单独的类中&#xff0c;简化开发流程&#xff0c;且提高代码复…

音频中sample rate是什么意思?

‌sample rate‌在数字信号处理中&#xff0c;指的是‌采样频率‌&#xff0c;即每秒钟从连续信号中抽取的样本数量。采样频率越高&#xff0c;信号的还原度越高&#xff0c;但同时也会增加计算负担和存储需求‌。 实际应用场景 在音频处理中&#xff0c;设置合适的采样率可以…

分享一下面试中常用的10 个面试点全解析,面试成功的秘诀

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一下面试中常用的10 个面试点全解析,助你面试中脱颖而出 问题1&#xff1a;微服务架构和传统架构有什么区别&#xff0c;现在市场上的微服务架构有哪些? 答&#xff1a;传统的单体架构可维护性、可读性低&#xff0c;维…

构建品牌影响力:知识库工具在市场营销中的创新应用

在当今这个信息爆炸的时代&#xff0c;品牌影响力成为了企业市场竞争力的核心要素。为了有效提升品牌影响力&#xff0c;企业不仅需要精准的市场定位和优质的产品服务&#xff0c;还需要借助高效、智能的知识库工具来优化其市场营销策略。本文将探讨知识库工具在市场营销中的创…

Python Matplotlib 子图绘制

Python 中的子图绘制 在数据可视化中&#xff0c;展示多个图表在同一个画布上是常见的需求&#xff0c;这样可以更直观地比较不同数据集之间的关系。Python 中的 Matplotlib 库为我们提供了强大的功能来实现这一点。在本篇文章中&#xff0c;我们将详细介绍如何使用 Matplotli…

探索设计模式:命令模式

探索设计模式&#xff1a;命令模式 &#x1f9d0;1. 概念&#x1f3af;2. 作用&#x1f4e6;3. 实现3.1 定义命令接口3.2 实现具体命令3.3 实现接收者3.4 实现调用者3.5 使用 &#x1f4bb;4. 应用场景 命令模式&#xff08;Command Pattern&#xff09;就是一种行为型设计模式…

Python-创建并调用自定义文件中的模块/函数

背景&#xff1a;在Python编程中&#xff0c;我们常常需要创建自己的专属文件&#xff0c;以便帮助我们更高效&#xff0c;快捷地完成任务。那么在Python中我们怎么创建并调用自己文件中的模块/函数呢? 在Python中调用自定义文件&#xff0c;通常是指调用自己编写的Python模块…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞&#xff08;CVE-2024-38816&#xff09;没几天&#xff0c;又来一个新的&#xff0c;真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞&#xff08;CVE-2024-38816&#xff09;https://blog.csdn.ne…

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion论文阅读笔记

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 论文阅读笔记 这是ECCV2024的论文&#xff0c;作者单位是是港中文和上海AI Lab 文章提出了一个叫AutoDIR的方法&#xff0c;包括两个关键阶段&#xff0c;一个是BIQA&#xff0c;基于vision-language…