Pandas 函数确定更改点日期
我正在处理一些时间序列数据,并希望创建一个函数来标识度量的变化点。在这种情况下,当第7天移动平均线穿过第30天移动平均线时,变化点就会出现 在我的df中,我希望能够标记这些日期,并计算固定到变更日期的滚动计算。例如,累积增量/pct变化等 我有一些相当难看的代码,让我大部分的方式。但是,我想从社区了解是否有不创建中间栏的方法来实现这一点Pandas 函数确定更改点日期,pandas,Pandas,我正在处理一些时间序列数据,并希望创建一个函数来标识度量的变化点。在这种情况下,当第7天移动平均线穿过第30天移动平均线时,变化点就会出现 在我的df中,我希望能够标记这些日期,并计算固定到变更日期的滚动计算。例如,累积增量/pct变化等 我有一些相当难看的代码,让我大部分的方式。但是,我想从社区了解是否有不创建中间栏的方法来实现这一点 data = {'rpc_avg_7d': {(48, '2018-11-26'): 2.8, (48, '2018-11-27'): 2.75, (4
data = {'rpc_avg_7d': {(48, '2018-11-26'): 2.8,
(48, '2018-11-27'): 2.75,
(48, '2018-11-28'): 2.62,
(48, '2018-11-29'): 2.48,
(48, '2018-11-30'): 2.39,
(48, '2018-12-01'): 2.41,
(48, '2018-12-02'): 2.46,
(49, '2018-12-04'): 2.56,
(49, '2018-12-05'): 2.73,
(49, '2018-12-06'): 2.86,
(49, '2018-12-07'): 3.01,
(49, '2018-12-08'): 3.09,
(49, '2018-12-09'): 3.2,
(50, '2018-12-10'): 3.36,
(50, '2018-12-11'): 3.4,
(50, '2018-12-12'): 3.36,
(50, '2018-12-13'): 3.43},
'rpc_avg_30d': {(48, '2018-11-26'): 2.76,
(48, '2018-11-27'): 2.77,
(48, '2018-11-28'): 2.76,
(48, '2018-11-29'): 2.76,
(48, '2018-11-30'): 2.74,
(48, '2018-12-01'): 2.73,
(48, '2018-12-02'): 2.71,
(49, '2018-12-04'): 2.73,
(49, '2018-12-05'): 2.78,
(49, '2018-12-06'): 2.79,
(49, '2018-12-07'): 2.8,
(49, '2018-12-08'): 2.8,
(49, '2018-12-09'): 2.82,
(50, '2018-12-10'): 2.83,
(50, '2018-12-11'): 2.87,
(50, '2018-12-12'): 2.91,
(50, '2018-12-13'): 2.94},
'MA_diff': {(48, '2018-11-26'): 0.04,
(48, '2018-11-27'): -0.02,
(48, '2018-11-28'): -0.14,
(48, '2018-11-29'): -0.27,
(48, '2018-11-30'): -0.35,
(48, '2018-12-01'): -0.32,
(48, '2018-12-02'): -0.25,
(49, '2018-12-04'): -0.18,
(49, '2018-12-05'): -0.05,
(49, '2018-12-06'): 0.08,
(49, '2018-12-07'): 0.21,
(49, '2018-12-08'): 0.29,
(49, '2018-12-09'): 0.38,
(50, '2018-12-10'): 0.53,
(50, '2018-12-11'): 0.54,
(50, '2018-12-12'): 0.45,
(50, '2018-12-13'): 0.48}}
df = pd.DataFrame.from_dict(data)
df['trend_flag'] = df['MA_diff'].transform(lambda x: 'up' if x > 0 else 'down')
df['change_pt'] = df['trend_flag'] != df['trend_flag'].shift(1)
print(df)
rpc_avg_7d rpc_avg_30d MA_diff trend_flag change_pt
48 2018-11-26 2.80 2.76 0.04 up True
2018-11-27 2.75 2.77 -0.02 down True
2018-11-28 2.62 2.76 -0.14 down False
2018-11-29 2.48 2.76 -0.27 down False
2018-11-30 2.39 2.74 -0.35 down False
2018-12-01 2.41 2.73 -0.32 down False
2018-12-02 2.46 2.71 -0.25 down False
49 2018-12-04 2.56 2.73 -0.18 down False
2018-12-05 2.73 2.78 -0.05 down False
2018-12-06 2.86 2.79 0.08 up True
2018-12-07 3.01 2.80 0.21 up False
2018-12-08 3.09 2.80 0.29 up False
2018-12-09 3.20 2.82 0.38 up False
50 2018-12-10 3.36 2.83 0.53 up False
2018-12-11 3.40 2.87 0.54 up False
2018-12-12 3.36 2.91 0.45 up False
2018-12-13 3.43 2.94 0.48 up False
当change\u pt==True
时,我不知道如何使用函数传递多索引的(第二)级别(日期)
加分-有人能解释一下允许您将滚动计算与时间序列组内的任意/计算日期联系起来的一般概念吗?通过按[change\u pt,date]分组并应用
.rolling
,这可能会起作用,但这看起来很混乱。如果我理解,您可以这样做:
df['change_point_date'] = np.where(np.sign(df['MA_diff']) != np.sign(df['MA_diff'].shift(1)), df.index.get_level_values(1), None)
它将当前MA_diff
的符号与前一个符号进行比较,如果它们不同,则输出多索引级别1的值
新df的尾部:
rpc_avg_7d rpc_avg_30d MA_diff change_point_date
49 2018-12-04 2.56 2.73 -0.18 None
2018-12-05 2.73 2.78 -0.05 None
2018-12-06 2.86 2.79 0.08 2018-12-06
2018-12-07 3.01 2.80 0.21 None
2018-12-08 3.09 2.80 0.29 None
2018-12-09 3.20 2.82 0.38 None
50 2018-12-10 3.36 2.83 0.53 None
2018-12-11 3.40 2.87 0.54 None
2018-12-12 3.36 2.91 0.45 None
2018-12-13 3.43 2.94 0.48 None
太好了,谢谢你。我不知道如何那样设置值。我想我现在需要做的就是填充/广播这些值,并计算每个值的日期偏移量。如果您发布所需的该位输出,可能会有所帮助。我实际上还不确定我想要的输出,由于在不明确定义列的情况下可能有更好的方法来实现这一点,我想计算的信息示例是:截至12-13日,XX组自2006年12月以来已连续8天呈上升趋势。7dMA增加了20%,比30dMA高出17%