python - 数据分析问题的最佳解决方案

标签 python pandas performance numpy data-analysis

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

  • 两位买家提供的出价,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-/

最佳答案

博登,

我很好奇这个函数的性能对您来说如何。

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

这是我在我的系统上运行的以及相应的结果。我的转到函数是使用 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

关于python - 数据分析问题的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55952816/

相关文章:

python - 如何让 pip 再次工作?

python - Scipy interp2d 插值屏蔽填充值

python - DBus Finch/Pidgin 不带 X11

python - 将 numpy 数组转换为类别

python - 优化多个for循环

python - 用两个固定长度的数字对正则表达式进行分组并删除其前导零

python - Pandas:如何剪辑数据帧并获取替换值的数量

python - pandas read_csv 按列索引(不是名称)设置 `dtype`

java - 隐形JFrame/JTable 快多少?

mysql - 考虑到性能,如何设计允许每个用户一票的评级系统?