平均上一行和当前行 - 熊猫

时间:2017-04-24 17:41:50

标签: pandas

目的

  • 计算avg_tot_assets其中 avg_tot_assets =(上年资产+当年资产)/ 2
  • 计算return_on_asset(ROA)= net income / avg_total_assets

APPROACH

  1. 使用Quandl的API提取波音财务信息
  2. 创建数据框
  3. 使用Pandas迭代数据框并计算每年的平均总资产
  4. 使用pandas计算ROA
  5. 工作代码

    df = data[['per_fisc_year',
               'consol_net_income_loss',
              'tot_asset',
              'curr_portion_debt',
              'tot_lterm_debt',
               'tot_share_holder_equity']]
    df
    

    输出

    dataframe

    问题

    1. 我认为循环数据帧并不是最有效/优雅的方式。我已经研究过使用groupby或index,但我不确定如何执行。
    2. 同样,如果我要计算ROA - 我可以在计算return_on_asset时并行计算avg_tot_asset,还是必须独立运行?

2 个答案:

答案 0 :(得分:3)

关于第一个问题,请查看Pandas Window Functions。这将处理您的avg_tot_assets

df['avg_tot_assets'] = df.tot_asset.rolling(window=2).mean() 

就并行计算另一列而言,可能有一种方法,但这样做不太可能获得任何性能。你会更好地顺序完成它。像这样:

df['ROA'] = df.net_income / df.avg_tot_assets

您可以尝试浪费大量时间编写一个复杂的函数,该函数将逐行遍历数据帧并依次计算每个值,然后将输出应用于原始数据帧,但这将是 DRASTICALLY 比内置方法慢。

答案 1 :(得分:0)

作为窗口函数的替代方法,您可以使用 df['avg_tot_assets'] = df['tot_asset'].add(df['tot_asset'].shift(1)) / 2 获取列的先前值:

df['ROA'] = df['consol_net_income_loss'] / df['avg_tot_assets']

对于 ROA 计算来说没有什么新东西。我想 pandas/numpy 可以矢量化该计算:

use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class AddDataToPage implements EventSubscriberInterface

{   

public static function getSubscribedEvents()
{
    return [BeforeLineItemAddedEvent::class => 'onLineItemAdded'];
}

/**
 * @param onLineItemAdded $event
 * @throws \Shopware\Core\Checkout\Cart\Exception\InvalidPayloadException
 */
public function onLineItemAdded(BeforeLineItemAddedEvent $event)
{
   
    $lineitems = $event->getLineItem();
    

    // I need a [IF] here: if product has a variation and parent product id is the same add the code below
    $lineitems->setPayloadValue("myVar", "test2");
}