代码之家  ›  专栏  ›  技术社区  ›  karlphillip

如何计算同一身份证的月收入差额

  •  1
  • karlphillip  · 技术社区  · 6 年前

    下面的数据框显示了几年期间两个商店( shop_id=11 , shop_id=15 )的月收入:

    data='shop_id':[11,15,15,15,11,11],
    '月':[1,1,2,3,2,3],
    “年份”:[2011、2015、2015、2015、2014、2014],
    “收入”:[11000、5000、4500、5500、10000、8000]
    }
    
    df=pd.数据帧(数据)
    df=df[‘shop_id’、‘month’、‘year’、‘revenue’]
    显示(df)
    

    您可以注意到,在2011(1月)和2015(1月、2月、3月)中,shop_id=11只有一个条目。不过,值得注意的是,第一家商店在2014年还有更多的条目:

    我正在尝试优化一个自定义函数(与.apply()一起使用),该函数创建一个名为diff_revenue的新功能:此功能显示上个月收入的变化,适用于每个商店:

    我想解释一下在diff_revenue中找到的一些值是如何生成的:

    • 第一个单元格的值为0(红色),因为之前没有关于shop_id=11的信息
    • 第二个单元格也为0(橙色),原因相同:对于shop_id=15,没有以前的信息
    • 第3个单元格是500(绿色),因为从该商店的最后一个条目(2015年1月)更改为当前单元格的收入(2015年2月),是500个王牌。
    • 第5个单元格是1000(深蓝色),因为从该商店的最后一个条目(2011年1月)到当前单元格的收入(2014年2月)的变化是1000个王牌。
      • 我不是熊猫专家,我想知道熊猫的神是否知道更好的方法。我必须使用的数据框架相当大(+1米观测值),我目前的方法太慢。我正在寻找一种更快的选择,或者是更具可读性的选择。data = { 'shop_id' : [ 11, 15, 15, 15, 11, 11 ], 'month' : [ 1, 1, 2, 3, 2, 3 ], 'year' : [ 2011, 2015, 2015, 2015, 2014, 2014 ], 'revenue' : [11000, 5000, 4500, 5500, 10000, 8000] } df = pd.DataFrame(data) df = df[['shop_id', 'month', 'year', 'revenue']] display(df)

    enter image description here

    你可以注意到商店编号=112011年(1月)只有一个条目,并且商店编号=15在2015年(1月、2月、3月)有一些条目。不过,值得注意的是,第一家商店在2014年还新增了一些条目:

    enter image description here

    我正在尝试优化自定义函数(与.apply())创建一个新功能diff_revenue:此功能显示每个商店上个月的收入变化:

    enter image description here

    我想解释一下收入差异生成时间:

    • 第一个单元格的值是0(红色)因为之前没有商店编号=11(二)
    • 第二个单元也是0(橙色),原因相同:之前没有关于商店编号=15(二)
    • 第三个单元格是500个(绿色),因为从这家商店的最后一个入口(2015年1月)到当前的手机收入(2015年2月)的变化是500王牌。
    • 第五个牢房是1000个(深蓝色),因为从这家商店的最后一个入口(2011年1月)到当前的手机收入(2014年2月)的变化是1000个王牌。

    我不是熊猫专家,我想知道熊猫的神是否知道更好的方法。我必须使用的数据框架相当大(+1米观测值),我目前的方法太慢。我正在寻找一个更快的替代品,或者更具可读性的东西。

    1 回复  |  直到 6 年前
        1
  •  2
  •   root    6 年前

    你或多或少想用 Series.diff 'Revenue'

    • 排序以确保数据帧按时间顺序排列(稍后可以撤消此操作)
    • groupby 'shop_id'

    # sort the values so they're in order when we perform a groupby
    df = df.sort_values(by=['year', 'month'])
    
    # perform a groupby on 'shop_id' and get the row-wise difference within each group
    df['diff_revenue'] = df.groupby('shop_id')['revenue'].diff()
    
    # fill NA as zero (no previous info), take absolute value, convert float -> int
    df['diff_revenue'] = df['diff_revenue'].fillna(0).abs().astype('int')
    
    # revert to original order
    df = df.sort_index()
    

       shop_id  month  year  revenue  diff_revenue
    0       11      1  2011    11000             0
    1       15      1  2015     5000             0
    2       15      2  2015     4500           500
    3       15      3  2015     5500          1000
    4       11      2  2014    10000          1000
    5       11      3  2014     8000          2000
    

    编辑

    # sort the values so they're chronological order by shop_id
    df = df.sort_values(by=['shop_id', 'year', 'month'])
    
    # take the row-wise difference ignoring changes in shop_id
    df['diff_revenue'] = df['revenue'].diff()
    
    # zero out locations where shop_id changes (no previous info)
    df.loc[df['shop_id'] != df['shop_id'].shift(), 'diff_revenue'] = 0
    
    # Take the absolute value, convert float -> int
    df['diff_revenue'] = df['diff_revenue'].abs().astype('int')
    
    # revert to original order
    df = df.sort_index()