大家好久不见,停更的这段时间,学习与思考了很多方面事情,所以今年的博文可能没有一个固定的主题,大方向还是区块链、人工智能和投资相关,感谢继续关注。
随着智能时代的到来,数据获取与处理的技能在工作中越来越重要,李笑来老师甚至这样说:
到了最近,不懂数据分析的,也开始算作文盲了。许多年前人们惊呼信息时代来了的时候,其实暂时体会不到什么太多的不同。然而,许多年过去,互联网上的格式化数据越来越多,不仅如此,实时产出的格式化数据也越来越多,于是,数据分析不仅成了必备的能力,而且早就开始直接影响一个人的薪资水平。
所以我们今天从零开始,从获取数据开始。我们例子是获取比特币的历史上每天的价格与成交量数据。使用的工具是 python 3.7 和 Juypter Notebook,我建议不直接安装这两个工具,而是使用一个叫 Anaconda 的软件,这个软件包含了 python 做数据处理时所需要的大部分依赖包,当然也包含了 Juypter Notebook,比自己管理依赖包要方便。有关 python 和 Juypter Notebook 的基础教程有很多,如果想看下去一定要提前了解一下。
Juypter Notebook进入正题,首先我们想想,在哪可以找到比特币的历史上每天的价格数据?现成的数据文件肯定是有的,但是很难找到每天都更新的,所以这里就有两个方向:一是雅虎金融,这里有全世界各个金融市场的历史数据,包括加密货币的;二是区块链行业的各大网站,比如专门统计数据的 http://coinmarketcap.com 以及各大交易所提供的 API,所以大家可以各显神通,这里说一下我的思路:
打开 coinmarketcap.com 页面,在页面按F12,打开调试界面的“网络”选项卡。这时候点历史数据,设置一个时间,确定之后能看到浏览器发起了一个新的网络请求,拉取新的历史数据,可以看到请求的地址和返回的数据结构。这是是一个典型的 Https GET 请求,把途中路径用浏览器打开就可以看到返回数据。
获取网站接口信息接口的数据结构我们用 python 的 request 模块实现这个接口数据的获取。代码如下,其中被注释掉的代码是调试使用的。
import time
import requests
import json
import csv
time_stamp = int(time.time())
print(f"Now timestamp: {time_stamp}")
# 1367107200
request_link = f"https://web-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/historical?convert=USD&slug=bitcoin&time_end={time_stamp}&time_start=1367107200"
print("Request link: " + request_link)
r = requests.get(url = request_link)
#print(r.content)
# 返回的数据是 JSON 格式,使用 json 模块解析
content = json.loads(r.content)
#print(type(content))
quoteList = content[data][quotes]
#print(quoteList)
如果顺利没报错的话,数据已经下载下来并保存在内存中了,一般来说我们还要把数据在硬盘里保存一下,以后使用数据的时候就不需要再次下载了。如果是比较小的数据(几十 MB 以内),用 csv 文件保存就行。如果是比较大的数据可以考虑 MySQL 数据库或者 NoSQL 数据库,再大的(超过 PB)就要考虑 Hadoop 这种大数据框架了。
# 将数据保存为 BTC.csv
# for windows, newline=
with open(BTC.csv,w ,encoding=utf8,newline=) as f:
csv_write = csv.writer(f)
csv_head = ["Date","Price","Volume"]
csv_write.writerow(csv_head)
for quote in quoteList:
quote_date = quote["time_open"][:10]
quote_price = "{:.2f}".format(quote["quote"]["USD"]["close"])
quote_volume = "{:.2f}".format(quote["quote"]["USD"]["volume"])
csv_write.writerow([quote_date, quote_price, quote_volume])
print("Done")
运行完毕之后,本地会多出一个 BTC.csv 文件。Excel 熟练的同学甚至可以开始数据处理和分析了。
生成的 CSV 文件但 Excel 对机器学习的支持并不好,我们后续肯定不会满足于只获取数据,所以还是要回到 python 上来,我们用 pandas 将 csv 文件读取到内存中:
import pandas as pd
series = pd.DataFrame()
df = pd.read_csv("BTC.csv")
series[Date] = df[Date].tolist()
series[Price] = df[Price].tolist()
series[Volume] = df[Volume].tolist()
print(series)
得到下面这些输出:
Date Price Volume
0 2013-04-29 144.54 0.000000e+00
1 2013-04-30 139.00 0.000000e+00
2 2013-05-01 116.99 0.000000e+00
3 2013-05-02 105.21 0.000000e+00
4 2013-05-03 97.75 0.000000e+00
... ... ... ...
2487 2020-02-19 9633.39 4.699202e+10
2488 2020-02-20 9608.48 4.492526e+10
2489 2020-02-21 9686.44 4.093055e+10
2490 2020-02-22 9663.18 3.583803e+10
2491 2020-02-23 9924.52 4.118519e+10
[2492 rows x 3 columns]
看着2013年的价格真是。。。好了,数据已经在内存里了,我们用 pyplot 将数据画个图展示一下:
import matplotlib.pyplot as plt
ax = plt.gca()
series.plot(kind=line, x=Date, y=Price, ax=ax)
plt.show()
plt.cla()
ax = plt.gca()
series.plot(kind=line, x=Date, y=Volume, ax=ax)
plt.show()
得到下面的曲线图,今天就大功告成了:
源码:https://github.com/xxd9980/get-histical-data-from-coinmarketcap
最后的最后,希望大家都能动手实战一下,真的不难,下面的书推荐给你。