【问题标题】:Best solutions for a data analytics problem数据分析问题的最佳解决方案
【发布时间】:2019-09-20 23:56:09
【问题描述】:

我们有一个包含两个买家的出价和规模的表格。投标价格p 和尺寸s 表示买方愿意以p 的价格购买数量s 的产品。我们有一个四列的表格:

  • pApB 两个买家提供的出价。
  • 出价大小,sAsB。 我们的工作是在表中添加一个新的最佳尺寸列 (bS),它以最优惠的价格返回尺寸。如果两个买家的价格相同,则bS 等于sA + sB,否则,我们需要采用出价较高的买家的出价大小。

我对这个问题的一个解决方案如下。

import numpy as np
import pandas as pd
N = 1000 *1000

t = pd.DataFrame({
   'pA': [np.random.randint(0, 5, N)],
   'pB': [np.random.randint(0, 5, N)],
   'sA': [np.random.randint(0, 100, N)],
   'sB': [np.random.randint(0, 100, N)]})

t['bS'] = np.where(t['pA'] == t['pB'], 
             t['sA'] + t['sB'],
             np.where(t['pA'] > t['pB'], 
                      t['sA'], t['sB']))

我写了一篇文章并列出了其他解决方案。我想知道我是否错过了什么。非常欢迎提供我们可以学习的反馈!

https://www.linkedin.com/pulse/data-analysis-example-python-q-ferenc-bodon-ph-d-/

【问题讨论】:

    标签: python pandas performance numpy data-analysis


    【解决方案1】:

    博登,

    我很好奇这个函数的性能与您相比如何。

    def func2(df):
        list2 = []
        for r in zip(t['pA'],t['pB'],t['sA'],t['sB']):
            if r[0] == r[1]:
                list2.append(r[2] + r[3])
            if r[0] > r[1]:
                list2.append(r[2])
            if r[1] > r[0]:
                list2.append(r[3])
        df['bS'] = list2
        return df
    

    这是我在我的系统上运行的和相应的结果。我的 go to function 是一个使用 iterrows() 的 for 循环。在检查并意识到它比您的np.where() 慢后,我尝试了zip(),性能似乎略快。

    import numpy as np
    import pandas as pd
    import timeit
    
    N = 1000*1000
    
    t = pd.DataFrame({'pA' : np.random.randint(0,5,size = N),
            'pB' : np.random.randint(0,5,size = N),
            'sA' : np.random.randint(0,100,size = N),
            'sB' : np.random.randint(0,100,size = N)})
    
    t['bS'] = np.where(t['pA'] == t['pB'], 
                 t['sA'] + t['sB'],
                 np.where(t['pA'] > t['pB'], 
                          t['sA'], t['sB']))
    
    def func1(df):
        list1 = []
        for index, row in df.iterrows():
            if row['pA'] == row['pB']:
                list1.append(row['sA'] + row['sB'])
            if row['pA'] > row['pB']:
                list1.append(row['sA'])
            if row['pB'] > row['pA']:
                list1.append(row['sB'])
        df['bS'] = list1
        return df
    
    def func2(df):
        list2 = []
        for r in zip(t['pA'],t['pB'],t['sA'],t['sB']):
            if r[0] == r[1]:
                list2.append(r[2] + r[3])
            if r[0] > r[1]:
                list2.append(r[2])
            if r[1] > r[0]:
                list2.append(r[3])
        df['bS'] = list2
        return df
    
    setup = '''
    import numpy as np
    import pandas as pd
    import timeit
    
    N = 10
    
    t = pd.DataFrame({'pA' : np.random.randint(0,5,size = N),
            'pB' : np.random.randint(0,5,size = N),
            'sA' : np.random.randint(0,100,size = N),
            'sB' : np.random.randint(0,100,size = N)})
    
    t['bS'] = np.where(t['pA'] == t['pB'], 
                 t['sA'] + t['sB'],
                 np.where(t['pA'] > t['pB'], 
                          t['sA'], t['sB']))
    
    def func1(df):
        list1 = []
        for index, row in df.iterrows():
            if row['pA'] == row['pB']:
                list1.append(row['sA'] + row['sB'])
            if row['pA'] > row['pB']:
                list1.append(row['sA'])
            if row['pB'] > row['pA']:
                list1.append(row['sB'])
        df['bS'] = list1
        return df
    
    def func2(df):
        list2 = []
        for r in zip(t['pA'],t['pB'],t['sA'],t['sB']):
            if r[0] == r[1]:
                list2.append(r[2] + r[3])
            if r[0] > r[1]:
                list2.append(r[2])
            if r[1] > r[0]:
                list2.append(r[3])
        df['bS'] = list2
        return df
    '''
    
    timeit.timeit("t['bS'] = np.where(t['pA'] == t['pB'], t['sA'] + t['sB'],np.where(t['pA'] > t['pB'], t['sA'], t['sB']))", setup = setup, number = 1000)
    Out[0]: 0.6907481750604347    
    timeit.timeit("func1(t)", setup = setup, number = 1000)
    Out[1]: 1.7969895842306869
    timeit.timeit("func2(t)", setup = setup, number = 1000)
    Out[2]: 0.40988909450607025
    

    【讨论】:

    • 嗨,天使!我喜欢您的方法-感谢您提交它们。测试结果提供了一些令人惊讶的见解。最好了解这三种解决方案的所有性能方面。
    • 不客气,费伦茨。您指的是哪些令人惊讶的见解?
    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多