cmars / pystdf

Python module for working with STDF files
GNU General Public License v2.0
149 stars 83 forks source link

Outdated functions/methods in ParametricSummarizer #52

Open xdonu2x opened 1 year ago

xdonu2x commented 1 year ago

Hi,

I encountered a couple errors in the ParametricSummarizer. I've traced it down to the xrange and iteritems methods/functions that is not supported in PythonV3.

Another error was in the SummaryStatistics class, where it throws an error if count is not divisible by two. I've also managed to fixed that using numpy to calculate the statistics instead.

Traceback (most recent call last): File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\IO.py", line 190, in parse self.parse_records(count) File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\IO.py", line 165, in parse_records self.send((recType, fields)) File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\Pipeline.py", line 25, in new_fn action(ds, *args) File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\ParametricSummarizer.py", line 54, in before_send self.onMpr(row) File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\ParametricSummarizer.py", line 63, in onMpr for i in xrange(row[mpr.RSLT_CNT]): NameError: name 'xrange' is not defined


        #Original code change to range for PythonV3 xdonu2x 8Nov2023
        # for i in xrange(row[mpr.RSLT_CNT]):
        for i in range(row[mpr.RSLT_CNT]):
            values = self.rawMap.setdefault((row[ptr.SITE_NUM],row[ptr.TEST_NUM],i), [])
            values.append(row[mpr.RTN_RSLT][i])

Traceback (most recent call last): File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\IO.py", line 191, in parse self.complete() File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\Pipeline.py", line 25, in new_fn action(ds, *args) File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\ParametricSummarizer.py", line 43, in before_complete for key, values in self.rawMap.iteritems(): AttributeError: 'dict' object has no attribute 'iteritems'

    # change .iteritems to .items for PyhonV3 xdonu2x 8Nov2023
    # for key, values in self.rawMap.iteritems():
    for key, values in self.rawMap.items():

def getAllRows(self):
    # change .iteritems to .items for PyhonV3 Ejo 8Nov2023
    #return self.summaryMap.iteritems()
    return self.summaryMap.items()

Traceback (most recent call last): File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\IO.py", line 191, in parse self.complete() File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\Pipeline.py", line 25, in new_fn action(ds, *args) File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\ParametricSummarizer.py", line 46, in before_complete self.summaryMap[key] = SummaryStatistics(values) File "C:\Users\xdonu2x\PycharmProjects\usingpySTDF\venv\lib\site-packages\pystdf\SummaryStatistics.py", line 29, in init self.median = self.q2 = self.values[self.count / 2] TypeError: list indices must be integers or slices, not float

import numpy as np

class SummaryStatistics:
    def __init__(self, values):
        self.values = values
        self.min = min(values)
        self.max = max(values)
        self.count = len(values)
        self.sum = sum(values)
        self.sumsqrs = sum([value*value for value in values])
        self.mean = self.sum / float(self.count)
        # self.median = self.q2 = self.values[int(self.count / 2)]
        self.median = self.q2 = np.median(self.values)
        # self.q1 = self.values[int(self.count / 4)]
        # self.q3 = self.values[3 *int(self.count / 4)]
        self.q1 = np.quantile(self.values,0.25)
        self.q3 = np.quantile(self.values,0.75)