【问题标题】:Python change the function to compute for an arrayPython更改函数以计算数组
【发布时间】:2017-04-13 02:36:41
【问题描述】:

我有一个名为“r2.csv”的示例 csv 文件:

Factory | Product_Number |   Date     |   mu   |   cs   |  co 
--------------------------------------------------------------
   A    |      1         | 01APR2017  |   5.6  |  125   |  275
--------------------------------------------------------------
   A    |      1         | 02APR2017  |   4.5  |  200   |  300
--------------------------------------------------------------
   A    |      1         | 03APR2017  |   6.6  |  150   |  250
--------------------------------------------------------------
   A    |      1         | 04APR2017  |   7.5  |  175   |  325
--------------------------------------------------------------

我有以下代码:

import numpy as np
from scipy.stats import poisson, norm
import csv

# Read Data
with open('r2.csv', 'r') as infile:
    reader = csv.DictReader(infile)
    data = {}
    for row in reader:
        for header, value in row.items():
            try:
                data[header].append(value)
            except KeyError:
                data[header] = [value]

# To create a list for the following parameters 
mu = data['mu']
cs = data['cs']
co = data['co']

# Convert data type to 'float' 
mu = map(float,mu)  
cs = map(float,cs)  
co = map(float,co)

Order_Number = map(lambda mu_,cs_,co_:np.ceil(poisson.ppf(co_/(cs_+co_),mu_)),mu,cs,co)

代码运行良好。如果我想定义一个可以按照您上面建议的那样用于数组的函数。

G = poisson(mu) 
p = G.pmf(np.arange(3*mu)) 

def Z(Q): 
    for i in range(len(p)): 
        yield p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0) 

如果我尝试运行它,它会显示错误消息。 **ValueError:只能将大小为 1 的数组转换为 Python 标量。 ** 谢谢!

此外,如果我想为每一行存储每对 (Q, sum(Z(Q))) ,我该怎么做?由于每行数据有多个 (Q, sum(Z(Q)); 让 Cost = sum(Z(Q)) 并且附加列名是 Q = 0, 1, 2, ...;值为 Cost,即 sum(Z(Q))

输出文件如下:

Factory | Product_Number |   Date     |   mu   |   cs   |  co | Q=0 | Q=1 | ... | Q = 30 
---------------------------------------------------------------------------------------
   A    |      1         | 01APR2017  |   5.6  |  125   | 275 |Cost |Cost |.....| Cost 
---------------------------------------------------------------------------------------
   A    |      1         | 02APR2017  |   4.5  |  200   |  300|Cost |Cost |.....| Cost 
---------------------------------------------------------------------------------------
   A    |      1         | 03APR2017  |   6.6  |  150   |  250|Cost |Cost |.....| Cost 
---------------------------------------------------------------------------------------
   A    |      1         | 04APR2017  |   7.5  |  175   |  325|Cost |Cost |.....| Cost 
---------------------------------------------------------------------------------------

如果输入只有一行数据,则以下代码运行正常,但对于多行或数组无用。

with open('output2.csv', 'wb') as fq:
     csv_writer = csv.writer(fq, delimiter=',', lineterminator='\n', )
     csv_writer.writerow(("Order_Number", "Cost Expectation"))
         for Q in range(0, 30):
             this_x = Q
             this_y = sum(Z(Q))
             x.append(this_x)
             y.append(this_y)
             csv_writer.writerow((this_x, this_y))

【问题讨论】:

  • 什么都不懂。看起来像是一些先前讨论的摘录 - 但我不是心电感应者来推断缺失的部分。
  • @ivan_pozdeev 你是对的!我最初发布了另一个与此相关的问题,并得到了解决。但我遇到了新的麻烦。所以,再发一次……
  • @Chenxi:对于从csv 读取的每一行,您将有多个Qsum(z(q)) - 正确吗?您打算如何将它们存储在一条线上? , 可以用逗号分隔吗?
  • @Chenxi:由于您使用的是3*Order_Number,您将拥有那么多Q 和sum(z(Q)) 的值。所以你需要为此做好计划。可能会找到平均值/中位数?您可以在关键行打印以查看数据输出。
  • 谢谢!@Anil_M 对,正如你所说,每个(Factory / Product_Number / Date / mu / cs / co)组合会有多对Q, Z(Q),我想存储它到 csv 文件中,只需在先前的输入文件中再添加两列,这可行吗?

标签: python arrays function output


【解决方案1】:

如前所述,这是解决方案。

import numpy as np
from scipy.stats import poisson, norm
import csv
from collections import OrderedDict


def Z(Q,p,cs,co):
    for i in range(len(p)):
        yield p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0)


# Read Data
with open('r2.csv', 'r') as infile , open("output.csv",'wb') as resultFile:    
    reader = csv.DictReader(infile)
    writer = csv.writer(resultFile,quoting=csv.QUOTE_ALL)
    header_written = False

    for row in reader:
        row_data = {}
        out_data = OrderedDict()
        for header, value in row.items():
            header = header.strip()
            value = value.strip()
            try:
                row_data[header].append(''.join(value))
            except KeyError:
                row_data[header] = ''.join(value)

        #Process row data        
        mu = float(''.join(row_data['mu']))
        cs = float(''.join(row_data['cs']))
        co = float(''.join(row_data['co']))

        # Obtain Order_Number 
        Order_Number =np.ceil(poisson.ppf(co/(cs+ co), mu))

        #Add titles to out dict
        for title in 'Factory','Product_Number','Date','mu','cs','co':
            out_data[title]=row_data[title]

        G = poisson(mu)
        p = G.pmf(np.arange(3*mu))

        # Q and sum_z_q calcs
        for Q in range(0, 30):
            sum_z_q = round(sum(Z(Q,p,cs,co)), 3)
            row_data["Q={}".format(Q)]= sum_z_q
            out_data["Q={}".format(Q)]= sum_z_q

        #Write header only once
        if header_written == False:
            header = out_data.keys()
            writer.writerow(out_data.keys()) # write headers
            header_written = True

        #Write values
        writer.writerow(out_data.values()) #write rows
        del out_data  #del object
        del row_data #del dict object

输出 CSV

【讨论】:

  • 感谢您的帮助! @Anil_M
  • 很高兴为您提供帮助。如果您喜欢我的两种解决方案,那么赞成会很好。它显示了解决方案的价值。只需点击我的答案旁边的向上箭头即可。
猜你喜欢
  • 1970-01-01
  • 2010-10-07
  • 2020-07-23
  • 2023-01-08
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多