【问题标题】:How to get the cumulative sum of different linearized line plots when they are overlapped重叠时如何获得不同线性化线图的累积和
【发布时间】:2021-12-08 09:58:04
【问题描述】:

所以我有以下熊猫数据框

开始时间 |结束时间 |价值| 0;50;50 20;100;800 10;45;700 其中每一行代表从开始时间到结束时间线性化的曲线(时间是x轴)

结果数据框应该有 x |价值 0;0 10;10 20;220 45;995 50; 1050; 100; 1550

每个值对应图形中的一个点,并通过折线图连接

例如:开始时间:0 结束时间:5,从 0 到 5 会有一条线性化的线。

问题是当有两行时间重叠时。对于重叠部分,我想获得每行分数的累积和。 (这也应该适用于其余的行)

我怎样才能做到这一点?我尝试按开始时间排序,但不知道如何继续。

Example

我会画一个图来更好地说明我想要实现的目标

如您所见,第二张图中的每个圆圈对应于重叠线的分数之和

提前致谢!!!

【问题讨论】:

  • 您能否(在代码中)创建一组测试数据(例如 3 行)?以及对应的情节? “价值”应该如何解读?是否从开始处的 0 和结束处的给定值线性增加(当前示例不包含“值”)?
  • 是的,要添加它

标签: python pandas math plot


【解决方案1】:

这可能无法扩展,具体取决于您的 DataFrame 的大小。

一些数据让我们开始。

import pandas as pd
from plotnine import *

df = pd.DataFrame({
    'StartTime':(0,20,10),
    'EndTime':(50,100,45),
    'Value':(50,800,700)
})

首先,为所有拐点创建一个 x 坐标 DataFrame

xyCoordinates = df['StartTime']
xyCoordinates = xyCoordinates.append(df['EndTime']).sort_values()
xyCoordinates = xyCoordinates.reset_index(drop=True)
xyCoordinates = xyCoordinates.to_frame('x')
xyCoordinates['y'] = 0

然后遍历df 中的每一行并遍历xyCoordinates 中的每个拐点,并为xyCoordinates 中的每个x 坐标计算基于直线斜率的y 坐标。将此值迭代地添加到 xyCoordinates 中的 y 坐标。因为在您的示例中,当 x=50 时的值是 1050 而不是 350,所以我假设一旦一行结束,它就会保持在最大值,并有助于累积总数,而不是消失为 0。

for df_index, df_row in df.iterrows():
    for xy_index, xy_row in xyCoordinates.iterrows():
        if (xy_row['x'] >= df_row['StartTime']):
            y = ( df_row['Value'] / (df_row['EndTime']-df_row['StartTime']) ) * ( min(xy_row['x'],df_row['EndTime'])-df_row['StartTime'])
            xy_row['y'] += y

这会产生:

我们可以绘制成:

p = (ggplot(xyCoordinates, aes(x='x',y='y'))
  + geom_line()
)
p

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2020-11-17
    • 2022-01-13
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多