金融和经济数据应用
请阐述本章所述工具在处理金融领域特定挑战时的应用方法。同时,请对比说明与其他领域的处理方式以及分析任务,在数据整理这一环节投入的人力往往远高于构建模型与进行研究所需的人力。
1.数据规整化方面的话题
1.1 时间序列与截面对齐
1.2 频率不同的时间序列的运算
经济学中的时间序列数据通常会按照年度、季度、月份或每日等固定周期进行计算或记录,并可能采用其他特殊的时间间隔安排数据采集频率。然而,在某些情况下这些时间序列的数据呈现高度不规律特征例如某些企业的盈利预测结果往往会在市场状况发生变化时频繁调整以反映新的经营状况这一特性使得数据分析时需特别注意其动态变化性为处理这类复杂情况提供可靠的数据处理工具提供了重要依据在实际应用中常用的方法包括基于固定频率的数据转换操作以及基于新索引值的数据重新定位过程这两个核心操作分别由resample方法和reindex技术来实现其中resample方法的主要功能是将原始数据重新聚合至指定的时间间隔从而形成新的时间序列结构而reindex技术则是通过建立与目标索引一致的时间框架来进行数据对齐以确保不同来源或不同时间段的数据能够有效整合与分析
通过将时间频率设置为每日工作日类型来实现对每周采样数据的日志转换。通过调用resample方法并指定间隔参数(Business天),可以将每周频的数据转换为日志频次的数据。执行该操作后会使得原本没有观测值的日子出现缺失。只需将fill_method参数设置为ffill选项即可从前一观测值填补这些缺失值。
然而,在处理更为通用的非均匀时间序列时(即前向填充),这种方法可能不再适用了)。具体来说,在 ts1 中找到与 ts2 时间点最接近的值并将其添加到 ts2 中的方法存在一定的局限性。(建议)一种方法是将两个时间序列重新采样为均匀频率后再进行叠加运算;但如果不想破坏 ts2 中原有的索引结构,则可以考虑使用 reindex 方法
1.3 时间与最新数据选取
1.3.1 首先构建一个完整交易日内的时间序列。 利用Python中的datetime模块对时间进行索引操作即可提取出指定时间段内的数据片段:通过dt.datetime对象对时间序列进行索引操作后可获得特定时刻的数据项如dt.datetime(year=2023.month=5.day=23.hour=9.minute=34). 我们主要使用了dt.datetime对象的.at属性来进行精确时间点的筛选例如获取上午十一点的数据项可以通过dt.datetime(year=current.year.month=current.month.day=current.day.hour=9.minute=59).apartments 这种方式实现;此外还可以通过dt.datetime对象间的比较运算来获取时间段内的数据如判断某个小时段是否在工作时间内可使用dt.datetime(year=current.year.month=current.month.day=current.day.hour=8.minute=45) < dt.now() < dt.datetime(year=current.year.month=current.month.day=current.day.hour=9.minute=59)来实现时间段的选择功能。
如前所述,在某些情况下可能恰好没有数据出现在特定时间(例如十点整)。这时你可能会希望获取到十点前最后一个出现的数据值。通过将一组Timestamp输入到asof方法中就能获得这些时间点及其之前的最近有效值(非NA)。例如,请考虑一个每天上午十点的时间范围区间;然后将其传递给asof函数:selection = pd.date_range('2012-06-01 10:00', periods=4, freq='B');irr_ts.asof(selection)
1.4 拼接多个数据源
在金融或经济领域中还存在以下几种常见情况:
- 当达到某个特定时间点时,在现有数据源间进行切换
- 通过引入另一个时间序列填补当前序列的缺失值
- 将包含标识信息的数据字段替换为其实际数值
对于第一种情况,在特定时间点从一个时间序列转换到另一个,并非直接操作原始数据而是通过pandas库中的concat函数将两个TimeSeries或DataFrame对象合并在一起:spliced = pd.concat([data1.ix[:’2012-06-14’], data2.ix[‘2012-06-15’:]])
- 假设在data1中缺少了与data2中存在的时间序列段落,则可以通过调用combine_first方法,在合并点之前引入数据片段以填补缺失值。计算得到的填补后的数据集为spliced_filled = spliced.combine_first(data2);
DataFrame同样提供了一个名为update的方法(类似于fillna函数),它能够实现对现有数据框架的就地更新操作。若仅需填充而不进行覆盖操作,则应传递overwrite参数为False:spliced.update(data2, overwrite=False)。
所述的技术都可以应用符号替换为实际数据。然而,在处理这类问题时,默认情况下我们通常会采用更加便捷的方式即通过索引机制直接对目标列进行赋值:cp_spliced[['a', 'c']] = data1[['a', 'c']]
