本文概述
介绍
导入数据是任何与数据相关的问题中最重要的步骤之一。对于每个有抱负的数据科学家来说, 正确导入数据的能力是一项必备技能。
数据以许多不同的形式存在, 不仅你应该知道如何导入各种数据格式, 而且还应该知道如何分析和处理数据以获得有用的见解。
pandas是一个易于使用, 提供高性能的开源Python库, 并且是用于各种数据格式的数据分析工具。
它使你能够读取各种类型的数据格式, 例如CSV, JSON, Excel, Pickle等。它使你能够以行和列的表格形式表示数据, 从而使数据可读性和可呈现性。
Pandas以DataFrame形式表示数据, 并为你提供了广泛的数据分析和数据处理方法。一旦开始使用Pandas的各种功能使数据有意义, 你便可以使用此数据进行分析, 预测, 分类等等!
pandas具有输入和输出API, 该API具有一组顶级读取器和写入器功能。通过返回Pandas对象的pandas.read_json()访问读取器函数, 并通过对象方法pandas.to_json()访问writer函数。
DataFrame具有读取器和写入器功能。读取器功能允许你读取不同的数据格式, 而写入器功能则允许你以特定格式保存数据。
以下是DataFrame支持的数据格式, 这意味着如果你的数据采用以下任何一种格式, 你都可以使用pandas加载该数据格式, 甚至写入特定格式。
(资源)
在今天的教程中, 你将研究上述几种格式类型, 例如JSON, HTML和Pickle。
注意:如果你想学习如何使用Pandas读取CSV文件, 请随时阅读本教程。
加载JSON数据
JSON, 也称为JavaScript Object Notation, 是一种数据交换文本序列化格式。 JSON易于读写。它基于JavaScript编程语言的子集, 但使用来自Python的约定以及Python之外的许多其他语言。
JSON主要用于存储非结构化数据, 而SQL数据库很难保存它。 JSON使数据可供机器读取。
JSON主要基于两种结构:
- 键/值对的集合。在Python中, 键/值对称为”字典”, 而键是唯一属性, 而值则不是。
- 值的有序列表。有序列表有时也可以是列表的列表。 Python中的列表是一组值, 可以是字符串, 整数等。
现在, 让我们看看如何以多种方式加载JSON数据。
第一个JSON数据集来自此链接。数据采用键值字典格式。一共有三个键:即整数, 日期时间和类别。
- 首先, 你将导入pandas库, 然后将URL传递给pd.read_json(), 这将返回一个数据帧。数据框的列代表键, 行是JSON的值。
import pandas as pd
json = pd.read_json('https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/data.json')
让我们快速打印使用.tail()函数读取的JSON的最后几行。
json.tail(6)
整数 | 日期 | 类别 | |
---|---|---|---|
94 | 5 | 2015-01-01 00:01:34 | 0 |
95 | 9 | 2015-01-01 00:01:35 | 0 |
96 | 8 | 2015-01-01 00:01:36 | 0 |
97 | 6 | 2015-01-01 00:01:37 | 0 |
98 | 8 | 2015-01-01 00:01:38 | 0 |
99 | 1 | 2015-01-01 00:01:39 | 0 |
json.shape
(100, 3)
从上面的输出中, 你可以看到共有三列:整数, 日期时间和类别。同样, 通过.shape方法验证的数据集中有100个样本, 该样本返回了100 x 3的输出。
- 编写JSON
编写JSON数据就像读取一样简单, 并且是一行代码。代替read_json(), 你将使用具有文件名的to_json(), 仅此而已!
json.to_json('dataframe.json')
- 将嵌套的JSON解析为字符串
接下来, 你将使用另一种类型的JSON数据集, 这不是那么简单。它是一个嵌套的JSON结构。嵌套JSON结构意味着每个键可以具有更多与其关联的键。
让我们看一下示例数据集, 以更好地理解它。
nested_json = """{
"article": [
{
"id":"01", "language": "JSON", "edition": "first", "author": "Allen"
}, {
"id":"02", "language": "Python", "edition": "second", "author": "Aditya Sharma"
}
], "blog":[
{
"name": "srcmini", "URL":"srcmini02.com"
}
]
}"""
在上面的数据集中, 你可以观察到article和blog是两个主键, 这些键下具有这些键的值。这些值具有其自己的键值对组合。
请注意, 上述数据集用双引号引起来, 并且为字符串形式。
可以通过多种方式读取嵌套的JSON。
首先, 你将使用json.loads函数通过将数据变量作为参数传递给它来读取JSON字符串。然后, 你将使用json_normalize函数将嵌套的JSON数据展平到表中。
你将从pandas.io.json库导入json_normalize函数。
import json
from pandas.io.json import json_normalize
nested = json.loads(nested_json)
nested
{'article': [{'id': '01', 'language': 'JSON', 'edition': 'first', 'author': 'Allen'}, {'id': '02', 'language': 'Python', 'edition': 'second', 'author': 'Aditya Sharma'}], 'blog': [{'name': 'srcmini', 'URL': 'srcmini02.com'}]}
接下来, 你将使用normalize函数展平JSON。你现在将传递完整的数据, 并查看其外观。
nested_full = json_normalize(nested)
nested_full
文章 | 博客 | |
---|---|---|
0 | [{‘id’:’01’, ‘language’:’JSON’, ‘edition’:’… | [{‘name’:’srcmini’, ‘URL’:’srcmini02.com’}] |
大!因此, 从上面的输出中可以看到, 主键是数据帧的列, 而键代表行。
但是, 输出看起来有些笨拙, 对吧?让我们看看如何将其进一步分为多个数据帧。
你将再次将json.loads输出传递给json_normalize, 但是这一次你将指定一个额外的元素, 称为record_path。
blog = json_normalize(nested, record_path ='blog')
blog
网址 | name | |
---|---|---|
0 | srcmini02.com | srcmini |
article = json_normalize(nested, record_path ='article')
article
作者 | 版 | ID | 语言 | |
---|---|---|---|---|
0 | Allen | first | 01 | JSON |
1 | Aditya Sharma | second | 02 | Python |
从上面的输出中, 你可以观察到主键现在被分为两个不同的数据帧, 其中列名现在已成为嵌套在主键中作为键值对的键。太好了吧?
最后, 要结束JSON数据加载, 让我们快速了解如何将JSON读取为文件而不是字符串。
- 读取JSON作为文件
nested_json = {
"article": [
{
"id":"01", "language": "JSON", "edition": "first", "author": "Allen"
}, {
"id":"02", "language": "Python", "edition": "second", "author": "Aditya Sharma"
}
], "blog":[
{
"name": "srcmini", "URL":"srcmini02.com"
}
]
}
如果你在上述单元格中注意到, 则数据的开头和结尾都没有双引号, 这意味着你将把此数据视为文件并读取。
你只需一行代码即可实现这一点。让我们看看如何!
json_file = pd.DataFrame.from_dict(json_normalize(nested_json))
json_file
文章 | 博客 | |
---|---|---|
0 | [{‘id’:’01’, ‘language’:’JSON’, ‘edition’:’… | [{‘name’:’srcmini’, ‘URL’:’srcmini02.com’}] |
从上面的输出中, 你可以看到输出与将JSON作为字符串读取时的输出相似。这里唯一的变化是你使用Pandas来解析和展平JSON。由于JSON是字典, 因此你可以使用.from_dict()函数。
加载HTML数据
HTML是一种超文本标记语言, 主要用于创建的Web应用程序和页面。它试图以语义方式描述网页的结构。 Web浏览器从Web服务器接收HTML文档, 并将其呈现到多媒体Web页面。
对于Web应用程序, HTML与级联样式表(CSS)一起使用, 而在服务器端, HTML与各种Web服务器框架(例如Flask, Django等)协作。
HTML使用标记来定义每个代码块, 例如<p> </ p>标记用于段落的开头和结尾, <image> </ image>标记用于将内容作为图像添加到网页, 类似地, 许多标记共同整理形成一个HTML网页。
要读取HTML文件, pandas数据框会查找标签。该标签称为<td> </ td>标签。此标记用于在HTML中定义表。
Pandas使用read_html()读取HTML文档。
因此, 每当你将HTML传递给Pandas并期望它输出漂亮的数据框时, 请确保HTML页面中包含表格!
- 关于数据:你将使用Cryptocurrency网站作为HTML数据集, 上面有各种加密硬币, 并且每个硬币都有各种详细信息, 例如:
- 硬币的最后价格(最后价格)
- 硬币价格上涨还是下跌(百分比)
- 24小时交易量(24交易量交易了多少个硬币)
- 硬币总数(#硬币)
所以, 让我们开始吧!
首先, 你将导入请求库, 该库将帮助你从你要获取HTML内容的位置向URL发送请求。
import requests
url = 'https://www.worldcoinindex.com/'
crypto_url = requests.get(url)
crypto_url
<Response [200]>
因此, 直到现在, 你都定义了URL, 然后使用request.get()向该URL发送了一个请求, 并收到了响应, 作为确认[200] OK, 这意味着你可以与该Web服务器连接。
现在, 要读取HTML网页的内容, 你所需要做的就是调用crypto_url.text, 它将为你提供该加密货币网页的HTML代码。
随时运行命令crypto_url.text查看输出。
最后, 你将crypto_url.text传递给pd.read_html()函数, 该函数将返回一个数据帧列表, 其中该列表中的每个元素都是加密货币网页中包含的表(数据帧)。
crypto_data = pd.read_html(crypto_url.text)
让我们打印数据帧的长度和类型。类型应为列表。
len(crypto_data), type(crypto_data)
(1, list)
从上面的输出中, 很明显只有一个带有类型列表的表。
crypto_data = crypto_data[0]
让我们删除第一列和第二列, 因为它们中没有任何有用的信息, 并保留所有行。
crypto_final = crypto_data.iloc[:, 2:]
最后, 是时候打印加密货币数据框了!
crypto_final.head()
Name | 股票代号 | 最后价格 | % | 24高 | 24低 | 价格图表7d | 24卷 | # 硬币 | 市值 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | bitcoin | BTC | $ 8, 008.027 | +1.83% | $ 8, 056.630 | $ 7, 812.784 | NaN | $ 12.04乙 | 17.71M | $ 141.89B |
1 | ethereum | ETH | $ 251.72335 | +2.68% | $ 253.84721 | $ 242.95687 | NaN | $ 6.93乙 | 10620万 | $ 26.73乙 |
2 | litecoin | LTC | $ 98.633851 | +11.08% | $ 99.946324 | $ 88.618815 | NaN | $ 3.46乙 | 61.91M | $ 6.10乙 |
3 | bitcoincash | BCH | $ 411.94075 | +2.31% | $ 418.60850 | $ 394.18927 | NaN | $ 2.10乙 | 1779万 | $ 7.33乙 |
4 | eos | EOS | $ 6.4230717 | +6.05% | $ 6.4765695 | $ 6.0264079 | NaN | $ 2.06乙 | 1.01B | $ 6.50乙 |
从上表中, 你可以看到比特币的市值最高。
删除NaN(不是数字)
数据框中有一些不是真实值的值, 因此让我们快速将它们从表中删除。
但是, 首先, 让我们完全删除(删除)”价格图表7d”列, 因为它完全是NaN且其中包含零信息。
del crypto_final['Price Charts 7d']
crypto_final.head()
Name | 股票代号 | 最后价格 | % | 24高 | 24低 | 24卷 | # 硬币 | 市值 | |
---|---|---|---|---|---|---|---|---|---|
0 | bitcoin | BTC | $ 8, 008.027 | +1.83% | $ 8, 056.630 | $ 7, 812.784 | $ 12.04乙 | 1771万 | $ 141.89B |
1 | ethereum | ETH | $ 251.72335 | +2.68% | $ 253.84721 | $ 242.95687 | $ 6.93乙 | 10620万 | $ 26.73乙 |
2 | litecoin | LTC | $ 98.633851 | +11.08% | $ 99.946324 | $ 88.618815 | $ 3.46乙 | 61.91M | $ 6.10乙 |
3 | bitcoincash | BCH | $ 411.94075 | +2.31% | $ 418.60850 | $ 394.18927 | $ 2.10乙 | 1779万 | $ 7.33乙 |
4 | eos | EOS | $ 6.4230717 | +6.05% | $ 6.4765695 | $ 6.0264079 | $ 2.06乙 | 1.01倍 | $ 6.50乙 |
现在让我们删除NaN。
crypto_final = crypto_final.dropna()
可视化加密货币(代号)VS。价格增/减百分比(%)
我们首先导入matplotlib来绘制图形。
import matplotlib.pyplot as plt
%matplotlib inline
%列具有类型字符串, 你需要将类型字符串转换为float。首先, 你将从列中删除%符号, 然后将%列的类型转换为float。
crypto_final['%'] = crypto_final['%'].apply(lambda x: x.strip('%'))
crypto_final['%'] = crypto_final['%'].astype('float')
现在让我们绘制数据。
plt.figure()
plt.figure(figsize=(16, 10))
x = crypto_final.iloc[:20]['Ticker']
y = crypto_final.iloc[:20]['%']
plt.xticks(fontsize=12)
plt.yticks(fontsize=14)
plt.xlabel('Percentage Increase/Decrease in Price', fontsize=20)
plt.ylabel('Ticker', fontsize=20)
plt.plot(x, y, label='% Increase/Decrease in Price')
plt.legend(loc='lower left', prop={'size': 15})
<matplotlib.legend.Legend at 0x1298a9630>
<Figure size 432x288 with 0 Axes>
从上图可以看出, 莱特币(LTC)和霍比托肯(HT)的价格涨幅最大, 而Maticnetwork(MATIC)和Waves的加密币价格跌幅最大。
加载Pickle数据
Pickle是Python特定的二进制序列化格式, 与JSON不同, 它不是人类可读的。它用于序列化和反序列化Python的对象结构。它序列化对象并对其进行腌制以将其保存在磁盘上。它将诸如DataFrame, 列表, 字典等的对象转换为字符流。
Pickle最好的部分是它可以存储各种Python数据类型。
Pickle被广泛用于存储训练有素的机器学习算法实例。像JSON一样, Pickle还具有方便的功能, 例如pickle.load()用于加载Pickle格式文件, 而pickle.dump()用于将Pickle或其他任何格式保存为Pickle格式。
使用Pickle的另一个导入优势是将数据帧另存为Pickle文件需要较少的磁盘空间, 并在重新加载时保持数据类型不变。
因此, 让我们快速腌制先前构建的加密货币数据帧, 然后使用Pandas读取该腌制对象。
import pickle
你将使用pickle.dump将数据帧另存为Pickle对象, 并将协议用作HIGHEST_PROTOCOL, 该协议也与Python 2向后兼容。
with open('crypto_final.pickle', 'wb') as sub_data:
pickle.dump(crypto_final, sub_data, protocol=pickle.HIGHEST_PROTOCOL)
最后, 你将使用pandas read_pickle函数将Pickle对象转换为数据框。
crypto_final = pd.read_pickle('crypto_final.pickle')
crypto_final.head()
Name | 股票代号 | 最后价格 | % | 24高 | 24低 | 24卷 | # 硬币 | 市值 | |
---|---|---|---|---|---|---|---|---|---|
0 | bitcoin | BTC | $ 7, 776.567 | +1.81% | $ 7, 870.205 | $ 7, 506.518 | $ 12.70乙 | 1771万 | $ 137.78乙 |
1 | ethereum | ETH | $ 241.81372 | -0.97% | $ 245.57293 | $ 232.62523 | $ 7.47乙 | 10618万 | $ 25.67乙 |
2 | litecoin | LTC | $ 88.062811 | +0.33% | $ 88.946501 | $ 85.248641 | $ 2.59乙 | 61.90M | $ 5.45乙 |
3 | bitcoincash | BCH | $ 388.76089 | +0.06% | $ 398.27697 | $ 370.29831 | $ 2.33乙 | 1779万 | $ 6.91乙 |
4 | eos | EOS | $ 5.9327948 | -0.41% | $ 6.0163442 | $ 5.7789154 | $ 1.99乙 | 1.01倍 | $ 6.00乙 |
哇!那不是很神奇吗?那是多么简单。此外, 使用Pickle, 你不必担心数据类型转换错误, 因为pickle序列化可以为你处理!
总结
恭喜你完成了本教程。
本教程是如何借助pandas在Python中加载不同数据格式的一个很好的起点。
仍然有许多数据格式(例如Excel, SQL, HDF5等)属于Pandas数据导入框架。你应该通过以这些数据格式找到一些有趣的公共数据集并尝试进行试验来弄清它们。
如果你想了解有关pandas中的DataFrames的更多信息, 请参加srcmini的pandas Foundations交互式课程。
参考文献:
- Python中的JSON数据
- pandas教程:使用read_csv()导入数据
请随时在下面的评论部分中提出与本教程相关的任何问题。
评论前必须登录!
注册