【问题标题】:Data manipulation based on trends value基于趋势值的数据操作
【发布时间】:2019-04-16 20:54:04
【问题描述】:

给定一个包含日期列和值列的数据集,我需要根据值列中的趋势提出按日期对数据进行分段的最佳解决方案。我的输出应该是包含以下列的 CSV 文件:StartDate、EndDate、StartValue、EndValue。开始日期和结束日期定义了段的界限。 给出一个简短的例子:输入数据:

 **Date**        **Value**
  01/01/2014        10
  01/02/2014        5
  01/03/2014        5
  01/04/2014        0

输出:

 **StartDate**   **EndDate**   **StartValue**   **EndValue**
   01/01/2014      01/15/2014        10              5
   01/16/2014      02/03/2014         5              5
   02/04/2014      03/10/2014         5              4

【问题讨论】:

    标签: python-3.x data-mining data-science data-manipulation


    【解决方案1】:

    一种使用pandas.DataFrame.shift (docs) 的方法。

    首先,我将创建一个包含一些数据的数据框:

    import pandas as pd
    datelist = pd.date_range('1/1/2019', periods=100).tolist()
    values = np.random.randint(1, 5, 100)
    df = pd.DataFrame({'Date': datelist, 'Value': values})
    df = df.set_index('Date')
    df.head(10)
    
    Date        Value
    2019-01-01  1
    2019-01-02  4
    2019-01-03  2
    2019-01-04  2
    2019-01-05  2
    2019-01-06  3
    2019-01-07  2
    2019-01-08  2
    2019-01-09  3
    2019-01-10  2
    

    删除连续重复的行:

    df = df.loc[df.Value.shift() != df.Value]
    
    Date        Value
    2019-01-01  2
    2019-01-02  1
    2019-01-04  2
    2019-01-05  3
    2019-01-06  1
    

    重置索引(如果Date列是原始数据中的索引):

    df = df.reset_index()
    

    将现有列重命名为起始列。

    df.columns = ['Start_Date', 'Start_Value']
    

    通过将起始列向后移动一行来创建结束列。

    df['End_Date'] = df.Start_Date.shift(-1)
    df['End_Value'] = df.Start_Value.shift(-1)
    

    删除 NaN(由于 shift(-1) 而导致数据帧的最后一行。

    df = df.dropna()
    

    End_Value 类型设置为int(如果愿意)。

    df['End_Value'] = df['End_Value'].astype(int)
    df.head(10)
    
        Start_Date  Start_Value End_Date    End_Value
    0   2019-01-01  1           2019-01-02  4
    1   2019-01-02  4           2019-01-03  2
    2   2019-01-03  2           2019-01-06  3
    3   2019-01-06  3           2019-01-07  2
    4   2019-01-07  2           2019-01-09  3
    5   2019-01-09  3           2019-01-10  2
    6   2019-01-10  2           2019-01-11  1
    7   2019-01-11  1           2019-01-12  2
    8   2019-01-12  2           2019-01-15  1
    9   2019-01-15  1           2019-01-16  4
    

    从数据框创建一个 CSV 文件:

    df.to_csv('trends.csv')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多