Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据分析问题的最佳解决方案_Python_Pandas_Performance_Numpy_Data Analysis - Fatal编程技术网

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

Python 数据分析问题的最佳解决方案,python,pandas,performance,numpy,data-analysis,Python,Pandas,Performance,Numpy,Data Analysis,我们有两位买家的投标价格和规模表。投标价格p和尺寸s表示买方愿意以p的价格购买s数量的产品。我们有一个由四列组成的表: 两位买家提供的投标价格,pA和pB 投标规模,sA和sB。 我们的工作是向表中添加一个新的最佳大小列(bS),该列以最佳价格返回大小。如果两个买家的价格相同,那么bS等于sA+sB,否则,我们需要采用出价较高的买家的出价大小 下面是我解决这个问题的一个方法 import numpy as np import pandas as pd N = 1000 *1000 t =

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

  • 两位买家提供的投标价格,
    pA
    pB
  • 投标规模,
    sA
    sB
    。 我们的工作是向表中添加一个新的最佳大小列(
    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']))
我写了一篇文章,列出了其他解决方案。我想知道我是否错过了什么。我们可以从中学习的反馈非常受欢迎

博登

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

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函数是使用
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

嗨,天使!我喜欢你的方法-谢谢你提交它们。测试结果提供了一些令人惊讶的见解。了解这三种解决方案的所有性能方面会很好。非常欢迎您。你指的是什么令人惊讶的见解?