使用Python和Pandas收集比特币历史数据

总体而言,近几个月来,比特币和加密货币一直在上涨。从三月份的突然崩盘以来,比特币的反应非常好,此后价格几乎翻了一番。再加上本月早些时候大肆宣传的减半事件,现在有很多人好奇,希望开始投资比特币。

好吧,在这里,我展示了开始分析比特币并将其转换成可用形式的Python代码。我会使用pandas库演示使用Python中有多么容易的一件事。
如果您对加密货币不感兴趣,那么这可能也是一个很好的教程,演示Python和pandas在数据操作和分析方面的能力,并且可能有一些有用的代码片段可以应用于其他项目。
安装pandas library
首先,如果还没有pandas库,就需要安装它。只需在命令行中运行以下命令。
pip install pandas
或者您可以像我一样使用Anaconda,则可以在使用的环境中打开Anaconda终端,然后输入以下命令。
conda install pandas
如果没有出现错误,则应正确安装库。我们马上要做最后的测试。
对于数据分析,我发现Jupyter Notebook是最好的IDE,因为它允许您在块中运行代码片段,因此在导入和处理大型数据集时可以节省大量时间。但是任何IDE都可以。
所以现在进行一些编码…
打开一个新脚本并保存它。第一个任务是测试pandas库是否安装正确。
运行以下代码将库导入脚本。如果没有出现错误,则可以继续本教程的其余部分。
import pandas as pd
获取数据集
我将使用的数据来自Kaggle,它是世界上最大的数据科学社区,也是查找大量数据集的最佳场所之一。该特定数据集是2012/01/01–2020/04/22比特币的历史分钟数据。
将csv文件下载并保存到与脚本相同的目录后,现在将要加载该数据。为此,我们在pandas中使用pd.read_csv()方法,将数据文件名作为字符串传递。这将创建一个包含csv文件中所有数据的数据帧。
我们还将在数据框中运行.head()方法,该方法向我们显示数据的前5行。如您所见,有一行数据,后面是四行连续的NaN值。这是因为缺少一些数据,因此我们需要做一些清理工作。这是由于多种原因造成的,但似乎在此数据集中的早期,并不是每分钟都对数据进行存档,因此丢失了大块数据。
raw_data = pd.read_csv(“bitstampUSD_1-min_data_2012-01-01_to_2020-04-22.csv”)
raw_data.head()

在数据帧上运行.tail()方法将显示最后5行,您可以看到这些行实际上已满。另外,请注意数据框索引列中该数据集中的行数(最左侧) 超过四百万!对于Excel来说太多了,但是Python和Pandas可以轻松地处理它。
raw_data.tail()

清理并格式化数据帧
所以现在我们要创建一个数据帧,其中删除了所有的NaN值。在pandas中,这非常简单,我们只在数据帧上使用.dropna()方法,并将其分配给我们称为df的新数据帧。这是包含所有有用数据的数据框,这些数据将在以后的分析中使用。
我们还在数据帧上调用.reset_index()方法,以便重置索引列。这将为数据的第一行分配一个索引值,从0开始,为第二行分配一个索引值,依此类推。我们还将传递参数inplace = True。这在pandas中很常用,它的作用是告诉Python我们希望我们的原始数据框成为该数据框的新编辑版本。如果inplace未设置为True,则运行该行后,我们正在处理的数据帧将保持不变。使用.head()方法并查看索引值来探索此行为。
我们还传递了第二个参数drop = True。默认情况下,.reset_index()方法将重置数据索引,但原始索引列将被复制到名为“ index”的新列中。我们没有用这个额外的列,因此我们将其删除。这也可以通过在数据帧上使用.drop()方法并指定要删除的列名称来实现。
df = raw_data.dropna()
df.reset_index(inplace=True, drop=True)
df.head()

 更改时间戳格式
您可能看到’Timestamp’列的格式很奇怪,这实际上是UNIX时间格式,因此我们希望将其转换为UTC时间。我们使用pd.to_datetime()方法执行此操作。我们将传递要对其执行此功能的数据的参数,即数据的“Timestamp”列,还将传递参数unit =’s’,该参数告诉函数输入的UNIX时间单位是秒。我们使用下面的代码行将此函数的输出保存到数据框中的“Timestamp”列。请注意,在pandas中引用列内的数据时,我们使用以下概念df [‘Timestamp’]。在方括号内传递的字符串是列的名称。
df[‘Timestamp’] = pd.to_datetime(df[‘Timestamp’], unit=’s’)
df.head()

我们可以在此处看到数据集的一部分实际上来自2011年。为完整起见,我将删除这四行。当只有几行要删除时,执行此操作的最简单方法是简单地指定列表中行的索引,并将其传递给.drop()方法。我们还必须再次传递参数inplace = True。然后像以前一样最终修复索引。
df.drop([0,1,2,3], inplace=True)
df.reset_index(inplace=True, drop=True)
df.head()

绘制数据以进行视觉检查
因此现在我们的数据结构良好,希望所有数据都在数据框中。一个非常快速的检查,以确保此时一切看上去都不错,只是简单地绘制一段时间内比特币的价格。我们将通过在数据框上运行.plot()方法,然后指定要在x和y轴外的列。pandas中的.plot()方法实际上在后台使用matplotlib库显示图形,并尝试为轴选择合理的默认设置。当然您可以根据需要自定义图表。
df.plot(x=”Timestamp”,y=”Weighted_Price”)

· 创建新列
太好了!因此,我们的数据看起来是正确的,因此我们可以继续进行更有趣的部分,即分析或操作数据。您可能想做的一件事是创建一个新列,以某种方式处理数据。一个示例是找到每个连续时间点之间的差异。
我们可以使用pandas中内置的一个名为.diff()的方法来实现这一点。我们只需使用以下符号df[“Title of new column”]指定要创建的列,并将其设置为我们希望通过.diff()方法找到差异的列。
df[“closeDiff”] = df[“Close”].diff()
df.head()

请注意,我们创建的新列名为“ closeDiff”。
现在让我们想象一下,我们想为数据中的每一年创建数据框架。例如一个数据框df19包含了2019年以来的所有数据。一种方法是首先创建一个名为“ year”的列,其中包含每个数据点的year值。然后我们将创建一个新的数据框,其中仅包含“年”列等于2019的数据行。
为此,我们将首先创建一个“year”列。我们将“Timestamp”列输入pd.DatetimeIndex类,并要求.year属性。这将返回我们每个Timestamp的年份值,并将此数据分配给一个新列,我们将其定义为“year”。
df[“year”] = pd.DatetimeIndex(df[“Timestamp”]).year
df.head()

因此现在我们需要一个新的数据框df19,其中包含数据框df中的所有行,在“year”列中的值为2019。为此,我们编写以下代码行。这种表示法可能会造成一些混淆,但是在这里我们只是说,用数据框df获得所有行,其中“year”列等于2019,然后将其分配给名为df19的新数据框。
df19 =  df[df[“year”] == 2019]
df19.reset_index(inplace=True, drop=True)
df19.head()

现在我们可以像绘制数据之前一样绘制图表,但是这次仅绘制2019年的数据。
df19.plot(x=”Timestamp”,y=”Weighted_Price”)

保存数据
现在您有了干净的数据,也许您已经添加到数据中或成为了子集。通常要保存此数据,这样就不必再次运行此代码。在数据帧上使用.to_csv()方法非常容易。以下是我用于保存df19数据帧的代码,以便将来将来方便使用。传递给该方法的第一个参数是您希望将其另存为的文件名,而index = False告诉Python不要将数据帧的索引保存到csv文件中通常不需要的列中。
df19.to_csv(‘btc19.csv’, index=False)
有了它,它是一个基础框架,可让您开始使用此比特币历史数据集,以及可以在Python和pandas中完成的一些基本操作。没有.head()和.tail()调用的完整精简代码可以在下面找到。
import pandas as pd
raw_data = pd.read_csv(“bitstampUSD_1-min_data_2012-01-01_to_2020-04-22.csv”)
df = raw_data.dropna()
df.reset_index(inplace=True, drop=True)
df[‘Timestamp’] = pd.to_datetime(df[‘Timestamp’], unit=’s’)
df.drop([0,1,2,3], inplace=True)
df.reset_index(inplace=True, drop=True)
df.plot(x=”Timestamp”,y=”Weighted_Price”)
df[“closeDiff”] = df[“Close”].diff()
df[“year”] = pd.DatetimeIndex(df[“Timestamp”]).year
df19 =  df[df[“year”] == 2019]
df19.reset_index(inplace=True, drop=True)
df19.plot(x=”Timestamp”,y=”Weighted_Price”)
df19.to_csv(‘btc19.csv’, index=False)