如何找到两个连续日期之间的值百分比差异,如果日期不连续,则跳过?



我有一个csv文件,我看起来像这样

date    mem
2018-03-09 13:27:05 23
2018-03-09 13:27:13 22
2018-03-09 13:54:34 21
2018-03-10 13:54:42 12
2018-03-10 16:18:34 34
2018-03-10 16:18:41 45
2018-03-12 22:40:36 45
2018-03-12 22:40:36 12
2018-03-14 22:40:44 35
2018-03-14 22:40:44 25
2018-03-15 23:12:36 26
2018-03-15 23:12:44 28
2018-03-15 23:22:34 12
2018-03-15 13:27:05 14
2018-03-16 13:27:13 54
2018-03-16 13:54:34 12
2018-03-16 13:54:42 56
2018-03-17 16:18:34 45
2018-03-18 16:18:41 76
2018-03-18 22:40:36 56
2018-03-18 22:40:44 23
2018-03-18 23:12:36 22
2018-03-18 23:12:44 24
2018-03-19 23:22:34 23

现在我想找到两个连续日期之间的统计数据(平均值、最小值、最大值、标准)的百分比差异,并使用该值创建一个列。

现在我可以手动找到两个给定日期之间的百分比差异。这是我下面的代码

df = pd.read_csv("metrics.csv", parse_dates=["date"])
df.set_index("date", inplace=True)
df_prev = df.loc['2018-03-09'].resample('D')['mem'].agg(['mean', 'min', 'max', 'std']).fillna(0)
df_next = df.loc['2018-03-10'].resample('D')['mem'].agg(['mean', 'min', 'max', 'std']).fillna(0)
df_diff_pt = abs(df_next - df_prev.values)/(df_prev.values) * 100
print(df_diff_pt)

如何以自动方式执行此操作,其中它会找到两个日期之间的统计信息百分比差异,并在给定日期没有前一个日期时跳过操作?例如,2018-03-10有上一个日期2018-03-92018-03-14没有上一个日期,因此应跳过它。但是2018-03-15有一个以前的日期2018-03-14所以它应该再次找到统计数据差异。

不确定是否可能,如果在resample之前这样做,但在之后可以过滤掉所有仅包含inf行的行:

df1 = df.resample('D').agg(['mean', 'min', 'max', 'std']).fillna(0)
df2 = df1.shift(freq='d').sub(df1).abs().div(df1).mul(100).iloc[:-1]
print (df2)
mem                                    
mean         min         max         std
date                                                      
2018-03-09         NaN         NaN         NaN         NaN
2018-03-10   27.472527   75.000000   48.888889   94.048603
2018-03-11         inf         inf         inf         inf
2018-03-12  100.000000  100.000000  100.000000  100.000000
2018-03-13         inf         inf         inf         inf
2018-03-14  100.000000  100.000000  100.000000  100.000000
2018-03-15   50.000000  108.333333   25.000000   13.397460
2018-03-16   50.819672    0.000000   50.000000   67.137961
2018-03-17    9.629630   73.333333   24.444444         inf
2018-03-18   11.940299  104.545455   40.789474  100.000000
2018-03-19   74.782609    4.347826  230.434783         inf

#compare if not equal inf
mask = df2 != np.inf
print (mask)
mem                     
mean    min    max    std
date                                  
2018-03-09   True   True   True   True
2018-03-10   True   True   True   True
2018-03-11  False  False  False  False
2018-03-12   True   True   True   True
2018-03-13  False  False  False  False
2018-03-14   True   True   True   True
2018-03-15   True   True   True   True
2018-03-16   True   True   True   True
2018-03-17   True   True   True  False
2018-03-18   True   True   True   True
2018-03-19   True   True   True  False

#check if at least one True per row
print (mask.any(axis=1))
date
2018-03-09     True
2018-03-10     True
2018-03-11    False
2018-03-12     True
2018-03-13    False
2018-03-14     True
2018-03-15     True
2018-03-16     True
2018-03-17     True
2018-03-18     True
2018-03-19     True
Freq: D, dtype: bool

#filter by boolean indexing
df2 = df2[mask.any(axis=1)]
print (df2)
mem                                    
mean         min         max         std
date                                                      
2018-03-09         NaN         NaN         NaN         NaN
2018-03-10   27.472527   75.000000   48.888889   94.048603
2018-03-12  100.000000  100.000000  100.000000  100.000000
2018-03-14  100.000000  100.000000  100.000000  100.000000
2018-03-15   50.000000  108.333333   25.000000   13.397460
2018-03-16   50.819672    0.000000   50.000000   67.137961
2018-03-17    9.629630   73.333333   24.444444         inf
2018-03-18   11.940299  104.545455   40.789474  100.000000
2018-03-19   74.782609    4.347826  230.434783         inf

最新更新