【问题标题】:Pandas -- Plotting cumulative days vs volumePandas - 绘制累积天数与交易量
【发布时间】:2023-03-22 16:09:01
【问题描述】:

我正在尝试使用 pandas 绘制体积/天与天数,但我的解决方案输出的值不超过第一个值(CumTime[0],R[0])。下面是初始表的外观示例,伴随它的是我想要获得的输出/结果。任何建议/帮助将不胜感激。谢谢

表:

<table style="width:50%">
  <tr>
    <th>ID</th>
    <th>Date</th> 
    <th>Days</th>
    <th>Volume/Day</th>
  </tr>
    <tr>
    <td>a2</td>
    <td>01/01/2014</td>
    <td>20</td>
    <td>60</td>
  </tr>
  <tr>
    <td>a1</td>
    <td>01/01/2014</td>
    <td>15</td>
    <td>100</td>
  </tr>
  <tr>
    <td>a1</td>
    <td>02/01/2014</td>
    <td>30</td>
    <td>80</td>
  </tr>
  <tr>
    <td>a2</td>
    <td>02/01/2014</td>
    <td>20</td>
    <td>40</td>
  </tr>
</table>

尝试过的解决方案:

df_grp=df.groupby('ID')
for key, grp in df_grp:
def final_result(all_data):
    for key, grp in all_data:
        grp.set_index('Date',inplace=True)
        CumTime = grp['Days'].cumsum()
        R = grp['Volume/Day']
    return CumTime,R  

CumTime,R = final_result(df_grp)

预期结果:

<table style="width:50%">
  <tr>
    <th>ID</th>
    <th>Date</th>
    <th>Days(***Cumulative_days)</th>
    <th>Volume/Day</th>
  </tr>
  <tr>
    <td>a1</td>
    <td>01/01/2014</td>
    <td>15</td>
    <td>100</td>
  </tr>
  <tr>
    <td>a1</td>
    <td>02/01/2014</td>
    <td>45</td>
    <td>80</td>
  </tr>
 <tr>
    <th>ID</th>
    <th>Date</th>
    <th>Days(***Cumulative_days)</th>
    <th>Volume/Day</th>
  </tr>
  <tr>
    <td>a2</td>
    <td>01/01/2014</td>
    <td>65</td>
    <td>60</td>
  </tr>
  <tr>
    <td>a2</td>
    <td>02/01/2014</td>
    <td>85</td>
    <td>40</td>
  </tr>
</table>

【问题讨论】:

  • 您提供的数据具有唯一 ID。 groupby 在这里有什么用?
  • @COLDSPEED,刚刚更新了表格。每个 ID 在同一月份的时间范围内都有它的值。这有助于回答您的问题吗?
  • 如果我理解正确,请告诉我。
  • @COLDSPEED,根据我之前设置表格的方式,您对我的理解是正确的。抱歉,我一直在更改结果的外观。我希望下面的解决方案按 ID 分组并按日期编入索引。我刚刚更新了我希望表格看起来像上面的样子。你能帮忙吗?谢谢
  • 原来如此,但是你想根据id来分离结果?

标签: python pandas matplotlib dataframe


【解决方案1】:

IIUC,你可以按IDDays排序,然后找到cumsum

df = df.sort_values(['ID', 'Days'])
df.Days = df.Days.cumsum()
df

   ID        Date  Days  Volume/Day
1  a1  01/01/2014    15         100
2  a1  02/01/2014    45          80
0  a2  01/01/2014    65          60
3  a2  02/01/2014    85          40

要仅显示,您可以致电df.groupby 并分别打印每个组。

for k, g in df.groupby("ID"):
     print(g.drop('ID', 1).set_index("Date"))

            Days  Volume/Day
Date                        
01/01/2014    15         100
02/01/2014    45          80

            Days  Volume/Day
Date                        
01/01/2014    65          60
02/01/2014    85          40

要绘图,请使用plt.subplots:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8,6))
for k, g in df.groupby("ID"):
    g.plot(x='Days', y='Volume/Day', ax=ax, label=k)

ax.set_xlabel('Days')
ax.set_ylabel('Volume/Day')

plt.legend(loc='best')
plt.show()

【讨论】:

  • @COLDSPEED,感谢您迄今为止的帮助。这接近我想要的解决方案,但我没有很好地捕捉到我想要的结果。我希望您提出的解决方案按 ID 分组并按日期编入索引。我刚刚更新了我希望表格的外观。你能帮忙吗?谢谢
  • @dlvr 这是否充分回答了您的问题?
  • @COLDSPEED,这还不够。虽然,这适用于这个只有几个点的样本数据集,但是当我在主数据集上运行它时,它不会产生任何绘图或错误。我看到的只是我的 jupyter 笔记本旁边的星号(*)。知道是什么原因造成的吗?谢谢
  • @dlvr 星号表示您有大量数据需要很长时间才能处理。
  • @dlvr 如果我的回答没有帮助,我会删除它。
猜你喜欢
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
相关资源
最近更新 更多