使用 GroupBy 为给定列计算 Pandas 中的指标

如何解决使用 GroupBy 为给定列计算 Pandas 中的指标

我正在查看此解决方python pandas groupby calculate change 或此解决方Adding new column to pandas dataframe after groupby and rolling on a column解决我遇到的类似问题。这是我的熊猫数据框:

Pandas Dataframe,Indexed on DATE

又名:

<style type="text/css">
    table.tableizer-table {
        font-size: 12px;
        border: 1px solid #CCC; 
        font-family: Arial,Helvetica,sans-serif;
    } 
    .tableizer-table td {
        padding: 4px;
        margin: 3px;
        border: 1px solid #CCC;
    }
    .tableizer-table th {
        background-color: #104E8B; 
        color: #FFF;
        font-weight: bold;
    }
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th>DATE</th><th>ID</th><th>Open</th><th>High</th><th>Low</th><th>Close</th><th>Volume</th><th>TR_Gross</th><th>SMA21</th><th>SMA200</th><th>MAX21</th><th>MIN21</th><th>ROC12</th></tr></thead><tbody>
 <tr><td>21/12/2020</td><td>ENI IM Equity</td><td>8.32</td><td>8.399</td><td>8.058</td><td>8.244</td><td>28249676</td><td>-4.373043</td><td>8.622905</td><td>8.043255</td><td>8.936</td><td>8.244</td><td>-2.460956</td></tr>
 <tr><td>21/12/2020</td><td>VOD LN Equity</td><td>124.5</td><td>124.5</td><td>119.94</td><td>121.96</td><td>84372015</td><td>-3.190983</td><td>127.687619</td><td>117.8816</td><td>133.74</td><td>121.96</td><td>-4.089336</td></tr>
 <tr><td>21/12/2020</td><td>AAPL US Equity</td><td>125.02</td><td>128.31</td><td>123.449</td><td>128.23</td><td>121251553</td><td>1.243536</td><td>122.173095</td><td>98.195537</td><td>128.7</td><td>113.85</td><td>4.302912</td></tr>
 <tr><td>22/12/2020</td><td>ENI IM Equity</td><td>8.212</td><td>8.36</td><td>8.18</td><td>8.36</td><td>13150428</td><td>1.407084</td><td>8.624333</td><td>8.052095</td><td>8.936</td><td>8.244</td><td>-4.391583</td></tr>
 <tr><td>22/12/2020</td><td>VOD LN Equity</td><td>121.3</td><td>121.94</td><td>120.38</td><td>121.78</td><td>66429299</td><td>-0.147589</td><td>127.678095</td><td>117.8814</td><td>133.74</td><td>121.78</td><td>-6.43823</td></tr>
 <tr><td>22/12/2020</td><td>AAPL US Equity</td><td>131.61</td><td>134.405</td><td>129.65</td><td>131.88</td><td>169351825</td><td>2.846448</td><td>122.865476</td><td>98.498262</td><td>131.88</td><td>113.85</td><td>7.877301</td></tr>
 <tr><td>23/12/2020</td><td>VOD LN Equity</td><td>121.16</td><td>123.36</td><td>120.48</td><td>123</td><td>37746858</td><td>1.001807</td><td>127.567619</td><td>117.909</td><td>133.74</td><td>121.78</td><td>-6.973226</td></tr>
 <tr><td>23/12/2020</td><td>AAPL US Equity</td><td>132.16</td><td>132.43</td><td>130.78</td><td>130.96</td><td>88223692</td><td>-0.697604</td><td>123.680238</td><td>98.808775</td><td>131.88</td><td>115.17</td><td>5.826263</td></tr>
 <tr><td>23/12/2020</td><td>ENI IM Equity</td><td>8.39</td><td>8.617</td><td>8.37</td><td>8.584</td><td>12593097</td><td>2.679426</td><td>8.622619</td><td>8.06046</td><td>8.936</td><td>8.244</td><td>-2.087373</td></tr>
 <tr><td>24/12/2020</td><td>VOD LN Equity</td><td>123</td><td>124.5</td><td>122.9</td><td>123.24</td><td>16399048</td><td>0.195122</td><td>127.514286</td><td>118.0055</td><td>133.74</td><td>121.78</td><td>-5.750994</td></tr>
 <tr><td>24/12/2020</td><td>AAPL US Equity</td><td>131.32</td><td>133.46</td><td>131.1</td><td>131.97</td><td>54930064</td><td>0.771228</td><td>124.480238</td><td>99.158338</td><td>131.97</td><td>116.03</td><td>6.102267</td></tr>
 <tr><td>28/12/2020</td><td>AAPL US Equity</td><td>133.99</td><td>137.34</td><td>133.51</td><td>136.69</td><td>124486237</td><td>3.57657</td><td>125.464048</td><td>99.494325</td><td>136.69</td><td>116.59</td><td>12.24339</td></tr>
 <tr><td>28/12/2020</td><td>ENI IM Equity</td><td>8.66</td><td>8.698</td><td>8.582</td><td>8.596</td><td>8202365</td><td>0.139795</td><td>8.619</td><td>8.07098</td><td>8.936</td><td>8.244</td><td>-2.207053</td></tr>
</tbody></table>

就我而言,我需要计算数据库中每个日期、数据库中每个 ID(代码)的 12 个周期变化率。所以 AAPL 的 12 个周期滚动百分比变化,然后是 ENI 的滚动百分比变化,然后是 VOD 等

使用以下代码,我可以这样做,在“数据”数据框的末尾添加一个新列 ROC12:

ROC12 = pd.DataFrame(data.groupby('ID').Close.rolling(13).apply(lambda x: x[-1]/x[0]-1)*100).reset_index().rename(columns={"Close":"ROC12"})

   data = pd.merge(data.reset_index(),ROC12,left_on=['DATE','ID'],right_on =['DATE','ID']).set_index('DATE')

我的问题是:为什么我不能使用下面的代码,如上面提到的前几篇文章所述?有没有比我在 pd.merge 中找到的更好的“风格”解决方案?

data['ROC12'] = data.groupby('ID').Close.apply(lambda x: x.pct_change(12))

或者这个:

data['ROC12'] = data.groupby('ID')['Close'].apply(lambda x: x.pct_change(12))

我在上面最后一个代码中遇到的错误是“无法从重复轴重新索引”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?