【问题标题】:How to find percentage difference in values between two consecutive dates and skip if dates not consecutive?如何查找两个连续日期之间值的百分比差异并在日期不连续时跳过?
【发布时间】:2018-04-19 15:28:00
【问题描述】:

我有一个 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 有一个前一个日期@987654324 @ 但2018-03-14 没有以前的日期,所以应该跳过它。但是2018-03-15 有以前的日期2018-03-14,所以它应该再次找到统计差异。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    不确定是否可以在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
    

    【讨论】:

    • 嘿,理想情况下应该有 2018-03-10,因为 2018-03-09 在那里,所以它是连续的,但没有 2018-03-11,因为它不存在,然后直接 2018-02-15自 2018-02-14 存在及其连续等等..
    • @SouvikRay - 答案变了,主要是shift是先申请,然后和原来的df比较,所以最后过滤掉2018-03-112018-03-13的行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2018-08-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多