【问题标题】:substract two ECDF time series减去两个 NETCDF 时间序列
【发布时间】:2021-11-06 10:16:44
【问题描述】:

嗨,我有一个 seaborn 的 ECDF 图,如下所示。

我可以通过sns.ecdfplot(data=df2, x='time', hue='seg_oper', stat='count')获得这个。

我的数据框很简单:

In [174]: df2
Out[174]: 
           time           seg_oper
265       18475     1->0:ADD['TX']
2342      78007     0->1:ADD['RX']
2399      78613  1->0:DELETE['TX']
2961      87097     0->1:ADD['RX']
2994      87210     0->1:ADD['RX']
...         ...                ...
330823  1002281  1->0:DELETE['TX']
331256  1003545  1->0:DELETE['TX']
331629  1004961  1->0:DELETE['TX']
332375  1006663  1->0:DELETE['TX']
333083  1008644  1->0:DELETE['TX']

[834 rows x 2 columns]

如何从1->0:DELETE['TX'] 中减去系列0->1:ADD['RX']

我喜欢 seaborn,因为大部分数据处理都是在库中完成的,但在这种情况下,我需要减去这两个系列...

谢谢。

【问题讨论】:

  • 我一定是遗漏了一些东西,但你能否通过从1->0DELETE['TX'] 中减去系列0->1:ADD['RX'] 来详细说明你的意思。例如,给定您的示例输入,您希望输出是什么样的?
  • 您必须手动计算每个seg_operecdf。但是,计算每个 ecdf 之间的差异是没有意义的。另外,请参阅here 并非来自多个 ecdf 的所有点都对齐。查看What, Why, and How to Read Empirical CDFCompare distributions of two ECDFs
  • @itprorh66,从给定的 DF 中,我想从另一个系列 df2[1->0:DELETE['TX']] 中减去一个系列 df2[0->1:ADD['RX']]。该情节是我从 seaborn 图书馆自动获得的。在我的 DF 中,我拥有全部;您通过提交的seg_oper 将一个系列与另一个系列区分开来。 Seaborn 使用hue 参数来执行此操作。但是我已经解决了;我会发布一个答案。
  • @TrentonMcKinney,是的,简单地说我想获得 seaborn 自己找到的系列(然后按照我想要的方式操作它们)。我已经看到样本未对齐,但我已经解决了这个问题。我会发布一个答案。谢谢。

标签: python-3.x pandas time-series seaborn cumulative-sum


【解决方案1】:

所以第一件事是获取seaborn 所做的事情,但要手动获取。之后(因为我需要)我可以从另一个系列中减去一个系列。

累计次数

首先我们需要获得每个系列的累积计数。

In [304]: df2['cum'] = df2.groupby(['seg_oper']).cumcount()                                                                                                                                                  

In [305]: df2
Out[305]: 
           time           seg_oper  cum
265       18475     1->0:ADD['TX']    0
2961      87097     0->1:ADD['RX']    1
2994      87210     0->1:ADD['RX']    2
...         ...                ...  ...
332375  1006663  1->0:DELETE['TX']  413
333083  1008644  1->0:DELETE['TX']  414

透视数据

重新排列 DF。

In [307]: df3 = df2.pivot(index='time', columns='seg_oper',values='cum').reset_index()

In [308]: df3
Out[308]: 
seg_oper     time  0->1:ADD['RX']  1->0:ADD['TX']  1->0:DELETE['TX']
0           18475             NaN             0.0                NaN
1           78007             0.0             NaN                NaN
2           78613             NaN             NaN                0.0
3           87097             1.0             NaN                NaN
4           87210             2.0             NaN                NaN
..            ...             ...             ...                ...
828       1002281             NaN             NaN              410.0
829       1003545             NaN             NaN              411.0
830       1004961             NaN             NaN              412.0
831       1006663             NaN             NaN              413.0
832       1008644             NaN             NaN              414.0

[833 rows x 4 columns]

填补空白

我假设NaN 值可以用该行的前一个值填充,直到下一个。

df3=df3.fillna(method='ffill')

此时,如果您绘制df3,您将获得与使用seaborn 绘制sns.ecdfplot(df2) 相同的结果。

我仍然想从另一个系列中减去一个系列。

df3['diff'] = df3["0->1:ADD['RX']"] - df3["1->0:DELETE['TX']"]
df3.plot(x='time') 

下图,就是结果。

pd:我不明白对这个问题的反对票。如果有人能解释一下,我将不胜感激。

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多