首页 > 解决方案 > Python Pandas 可以完成这些任务吗?

问题描述

我有一个八年(2013-2020)的时间序列数据框有每小时数据,每年有九个区域,每个区域下有两列(“Gen”,“Load”),如下所示:

                            A ZONE         B ZONE               ...   G ZONE       H ZONE           I ZONE         
        date_time           GEN    LOAD    GEN    LOAD          ...    LOAD      GEN    LOAD         GEN    LOAD
    2013-01-01 00:00:00    725.7 5,859.5  312.2 3,194.7        ...    77.1      706.0 227.1        495.0   861.9
    2013-01-01 01:00:00    436.2 450.5    248.0 198.0          ...    865.5     240.7 107.9        640.5 767.3
    2013-01-01 02:00:00    464.5 160.2    144.2 068.3          ...    738.7     044.7 32.7         509.3 700.4
    2013-01-01 03:00:00    169.9 733.8    268.1 869.5          ...    671.7     649.4 951.3        626.8 652.1
    2013-01-01 04:00:00    145.4 553.4    280.2 872.8          ...    761.5     561.0 912.9        552.1 637.3
...                  ...        ...     ...        ...          ...  ...        ...         ...     ...         ...     ...
    2020-12-31 19:00:00    450.9 951.7    371.4 516.3          ...    461.7     808.9 471.4        983.7 447.8
    2020-12-31 20:00:00    553.0 936.5    848.7 233.9          ...    397.3     978.3 404.3        490.9 233.0
    2020-12-31 21:00:00    458.6 735.6    716.8 121.7          ...    385.1     808.0 192.0        131.5 70.1
    2020-12-31 22:00:00    515.8 651.6    693.5 142.4          ...    291.4     826.1 16.8         591.9 863.2
    2020-12-31 23:00:00    218.6 293.4    448.2 14.2           ...    340.6     435.0 897.4        622.5 768.3

我想要的是以下内容:

1-检测每列中的异常值,该列或多或少是该列标准偏差的三倍,如果“A Zone”下的“GEN”列以及“ A_load_outliers" 如果“A 区”下的“LOAD”列中存在异常值。新列数为 18 列。

2- 一个新列代表“Gen”列的总和

3- 一个新列代表“加载”列的总和

4- 新列代表“GEN”列,计算 A_GEN_div = 单元格值/A 区下“GEN 列每年的最大值”,例如第一个单元格为 725.7/725.7=1,第二个单元格和最后一个单元格为 436.2/725.1 218.6/553. 等,对于所有“GEN”列和“LOAD”列也是如此——建议的名称为“A_Load_div”。

新列数为 18 列。

新列总数为“18 * 2 + 2”列

提前致谢。

标签: pythonpandas

解决方案


我认为这可能会有所帮助。请注意,这将保留列MultiIndex。你上面的观点似乎暗示你想要扁平化你的MultIndex. 如果是这种情况,您可能想看看这个问题

1:

df.join(df>(3*df.std()), rsuffix='_outlier')

2和3:

df.groupby(level=-1, axis=1).sum()

请注意,尚不清楚列的第一级MultIndex应该是什么。

4:

maxima = df.resample('1Y').max()
maxima.index = maxima.index + pd.DateOffset(hours=23)
maxima = maxima.reindex(df.index, method='bfill')
df.join(df.divide(maxima), rsuffix='_div')

推荐阅读