我有一个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
现在我想在两个连续日期之间找到统计数据的百分比差异(mean,min,max,std),并创建一个具有该值的列。
现在我可以手动找到两个给定日期之间的百分比差异。这是我的代码
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-9
,但2018-03-14
没有上一个日期,因此应该跳过它。但是2018-03-15
之前有一个日期2018-03-14
,那么它应该会找到统计信息差。
答案 0 :(得分:0)
不确定是否可以在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