Python 计算时间序列中的连续值
这是我第一次在这里问问题,所以我希望我能做得对 我有一个数据框:Python 计算时间序列中的连续值,python,pandas,count,trend,Python,Pandas,Count,Trend,这是我第一次在这里问问题,所以我希望我能做得对 我有一个数据框: df2.data Out[66]: date 2016-01-02 0.0 2016-01-03 1.0 2016-01-04 1.0 2016-01-05 1.0 2016-01-06 0.0 2016-01-07 0.0 2016-01-08 1.0 2016-01-09 2.0 2016-01-10 1.0 2016-01-11 0.0 Name: data, d
df2.data
Out[66]:
date
2016-01-02 0.0
2016-01-03 1.0
2016-01-04 1.0
2016-01-05 1.0
2016-01-06 0.0
2016-01-07 0.0
2016-01-08 1.0
2016-01-09 2.0
2016-01-10 1.0
2016-01-11 0.0
Name: data, dtype: float64
我希望得到以下结果:
data trend trend_type
date
2016-01-02 0.0 0 0
2016-01-03 1.0 0 0
2016-01-04 1.0 1 1
2016-01-05 1.0 2 1
2016-01-06 0.0 0 0
2016-01-07 0.0 1 0
2016-01-08 1.0 0 0
2016-01-09 2.0 0 0
2016-01-10 1.0 0 0
2016-01-11 0.0 0 0
我的问题有点和你有关
到目前为止,我成功地获得了趋势,但它的效率不够(对于750行数据帧,大约8秒)
步骤1
要获取
趋势
,请执行groupby
+cumcount
-
df['trend'] = df.data.groupby(df.data.ne(df.data.shift()).cumsum()).cumcount()
df
data trend
2016-01-02 0.0 0
2016-01-03 1.0 0
2016-01-04 1.0 1
2016-01-05 1.0 2
2016-01-06 0.0 0
2016-01-07 0.0 1
2016-01-08 1.0 0
2016-01-09 2.0 0
2016-01-10 1.0 0
2016-01-11 0.0 0
步骤2(IIUC),要获取趋势类型,请比较连续行并分配
df['trend_type'] = 0
m = df.data.eq(df.data.shift())
df.loc[m, 'trend_type'] = df.loc[m, 'data']
df
data trend trend_type
2016-01-02 0.0 0 0.0
2016-01-03 1.0 0 0.0
2016-01-04 1.0 1 1.0
2016-01-05 1.0 2 1.0
2016-01-06 0.0 0 0.0
2016-01-07 0.0 1 0.0
2016-01-08 1.0 0 0.0
2016-01-09 2.0 0 0.0
2016-01-10 1.0 0 0.0
2016-01-11 0.0 0 0.0
编辑,添加列“trep_类型”
什么是趋势类型?你能解释一下你是如何得到这些结果的吗?为了得到趋势,你可以很容易地做一个groupby-
df.date.groupby(df.date.shift()).cumsum()).cumcount()
如果你能解释什么是trend\u type
,那就太好了。你好。对不起,不够清楚。趋势类型是指趋势(消费数据系列)是0、1还是2。默认情况下,它是一个0。这些结果是我写的。你是怎么计算的还不清楚。你的数据和你的解释不符合……这正是我要找的!非常感谢你的帮助!而且执行速度非常快,太完美了!我祝你有一个非常美好的一天,你刚刚做了我的@罗杰:别忘了,这也会让我开心的谢谢你关心我的问题曼纽尔!我认为你的解决方案有点像我的第一次尝试,问题是执行时间
df['trend_type'] = 0
m = df.data.eq(df.data.shift())
df.loc[m, 'trend_type'] = df.loc[m, 'data']
df
data trend trend_type
2016-01-02 0.0 0 0.0
2016-01-03 1.0 0 0.0
2016-01-04 1.0 1 1.0
2016-01-05 1.0 2 1.0
2016-01-06 0.0 0 0.0
2016-01-07 0.0 1 0.0
2016-01-08 1.0 0 0.0
2016-01-09 2.0 0 0.0
2016-01-10 1.0 0 0.0
2016-01-11 0.0 0 0.0
df.loc[0, "trend"] = 0
df.loc[0, "trend_type"] = 0
for nrow in range(df.shape[0]-1):
if df.loc[nrow+1, 1] == df.loc[nrow, 1]:
df.loc[nrow+1, "trend"] = df.loc[nrow, "trend"]+1
df.loc[nrow + 1, "trend_type"] = 1
else:
df.loc[nrow + 1, "trend"] = 0
df.loc[nrow + 1, "trend_type"] = 0