11.4.2 数据预处理
(1)列出指定目录中的所有文件名,对于每个找到的文件,使用os.path.join将目录名和文件名组合成完整的文件路径,并打印出来。具体实现代码如下所示。
# 导入必要的库
import numpy as np # 导入numpy库,用于处理数值数据
import pandas as pd # 导入pandas库,用于数据处理和CSV文件的输入/输出
# 输入数据文件位于只读的 "../input/" 目录下
# 例如,运行此代码(通过点击运行或按Shift+Enter)将列出输入目录下的所有文件
import os # 导入os库,用于操作文件和目录
# 使用os.walk遍历指定目录中的文件
for dirname, _, filenames in os.walk('input'):
for filename in filenames:
# 打印每个文件的完整路径
print(os.path.join(dirname, filename))
执行后会输出:
input/bitcoin-historical-data/bitstampUSD_1-min_data_2012-01-01_to_2021-03-31.csv
(2)使用IPython中的HTML工具来插入自定义的HTML样式,以更改文本标题的样式。具体实现代码如下所示。
from IPython.display import HTML # 导入IPython中的HTML工具,用于在Jupyter Notebook中插入HTML内容
# 使用HTML标签定义了一些自定义的样式,这些样式将应用于h1、h2和h3标题标签
HTML("""
<style>
h1,h2,h3 {
margin: 1em 0 0.5em 0;
font-weight: 600;
font-family: 'Titillium Web', sans-serif;
position: relative;
font-size: 36px;
line-height: 40px;
padding: 15px 15px 15px 2.5%;
color: #13003A;
box-shadow:
inset 0 0 0 1px rgba(53,86,129, 1),
inset 0 0 5px rgba(53,86,129, 1),
inset -285px 0 35px white;
border-radius: 0 10px 0 15px;
background: #fff;
}
</style>
""")
上述代码演示了如何使用HTML和IPython来自定义文档的外观,这需要在Jupyter Notebook环境中运行,以便查看样式在文档中的效果。
(3)使用库Pandas对比特币历史数据进行预处理和聚合操作,最终,Price 包含了按日期聚合的每日平均加权价格,可以用于进一步的分析和可视化。这是数据预处理和聚合的一种示例,用于处理时间序列数据。具体实现代码如下所示。
import pandas as pd # 导入pandas库,用于数据处理
import numpy as np # 导入numpy库,用于数值计算
# 读取比特币历史数据的CSV文件
df = pd.read_csv('../input/bitcoin-historical-data/bitstampUSD_1-min_data_2012-01-01_to_2021-03-31.csv')
# 将时间戳列转换为日期列
df['date'] = pd.to_datetime(df['Timestamp'], unit='s').dt.date
# 根据日期进行分组
group = df.groupby('date')
# 计算每日加权平均价格(Weighted_Price)的均值
Price = group['Weighted_Price'].mean()
(4)对前面计算的每日平均加权价格数据进行了一系列操作,包括重塑数据框架、筛选数据和重新设置索引。具体实现代码如下所示。
# 将每日平均价格数据转换为DataFrame,并保留日期信息
df_price_zz = Price.to_frame()
df_price_zz['Timestamp'] = df_price_zz.index
df_price_zz['Timestamp'] = pd.to_datetime(df_price_zz['Timestamp'])
# 重置索引,删除原有索引列
df_price_zz.reset_index(drop=True, inplace=True)
# 过滤数据,仅保留从2017年及以后的数据
df_price_include_zz = df_price_zz[df_price_zz['Timestamp'].dt.year >= 2017]
# 再次重置索引,删除原有索引列
df_price_include_zz.reset_index(drop=True, inplace=True)
# 将Timestamp列设置为DataFrame的索引
df_price_include_zz.set_index("Timestamp", inplace=True)
最终的DataFrame df_price_include_zz 包含了从2017年开始的每日平均加权价格数据,执行后会输出:
Weighted_Price
Timestamp
2017-01-01 981.637688
2017-01-02 1013.199484
2017-01-03 1019.992995
2017-01-04 1079.434027
2017-01-05 1039.655397
... ...
2021-03-27 55193.357260
2021-03-28 55832.958824
2021-03-29 56913.993819
2021-03-30 58346.912268
2021-03-31 58764.349363
1551 rows × 1 columns
(5)继续处理时间序列数据,包括将数据转换为 NumPy 数组、筛选数据以及划分训练集和测试集。具体实现代码如下所示。
# 将每日平均价格数据转换为 NumPy 数组
Price_array = Price.to_numpy()
# 将每日平均价格数据转换为DataFrame,并保留日期信息
df_price = Price.to_frame()
df_price['Timestamp'] = df_price.index
df_price['Timestamp'] = pd.to_datetime(df_price['Timestamp'])
# 重置索引,删除原有索引列
df_price.reset_index(drop=True, inplace=True)
# 过滤数据,仅保留从2017年及以后的数据
df_price_include = df_price[df_price['Timestamp'].dt.year >= 2017]
# 再次重置索引,删除原有索引列
df_price_include.reset_index(drop=True, inplace=True)
# 设置预测的天数
prediction_days = 50
# 划分训练集和测试集
# 训练集包含除了最后 prediction_days 天的数据
df_train = df_price_include[:len(df_price_include) - prediction_days]
# 测试集包含最后 prediction_days 天的数据
df_test = df_price_include[len(df_price_include) - prediction_days:]
这样将拥有一个用于训练和测试时间序列预测模型的数据集,其中训练集包含历史数据,而测试集包含将用于未来预测的数据。