Segítségével numpy találni átlagos érték az egész adathalmaz, néhány hiányzó adatok

szavazat
5

Én több (körülbelül 10) CSV-formátumú adatállományok. Minden oszlop egy adathalmaz képviseli egyik szempontja futó rendszer (RAM, CPU használat, nyitott TCP kapcsolat, és így tovább). Minden sor tartalmazza az értékeket ezeket az oszlopokat az egyik pillanatban az időben.

Az adatsorok elfogták során egyedi fut ugyanezen a teszten. A sorok száma nem garantált, hogy ugyanaz legyen minden adathalmaz (azaz néhány tesztet futott hosszabb mások).

Azt akarom, hogy egy új, CSV-fájlt, amely képviseli az „átlagos” érték, az összes adathalmaz egy adott időeltolódást és egy adott oszlopban. Ideális esetben értékek hiányzik az egyik adatsor lenne figyelmen kívül hagyni. Ha szükséges, bár a hiányzó értékeket feltételezni lehetett, hogy ugyanaz legyen, mint az utolsó ismert érték, illetve az átlagos ismert értékek azt a sort.

Egy egyszerűsített példa:

+---------------+    +---------------+       +---------------+
|     Set 1     |    |     Set 2     |       |    Average    |
+---+-----+-----+    +---+-----+-----+       +---+-----+-----+
| t |  A  |  B  |    | t |  A  |  B  |       | t |  A  |  B  |
+---+-----+-----+    +---+-----+-----+       +---+-----+-----+
| 1 | 10  | 50  |    | 1 | 12  | 48  |       | 1 | 11  | 49  |   
| 2 | 13  | 58  |    | 2 |  7  | 60  |       | 2 | 10  | 59  |   
| 3 |  9  | 43  |    | 3 | 17  | 51  |  =>   | 3 | 13  | 47  |   
| 4 | 14  | 61  |    | 4 | 12  | 57  |       | 4 | 13  | 59  |   
| : |  :  |  :  |    | : |  :  |  :  |       | : |  :  |  :  |   
| 7 |  4  | 82  |    | 7 | 10  | 88  |       | 7 |  7  | 86  |   
+---+-----+-----+    | 8 | 15  | 92  |       | 8 | 15  | 92  |
                     | 9 |  6  | 63  |       | 9 |  6  | 63  |
                     +---+-----+-----+       +---+-----+-----+

Új vagyok a numpy, miután felvette kifejezetten erre a projektre. Mi a legjobb módja ennek? Adathalmazok azonos sorok számát (amit már kényszerítve daraboltak hosszabb adatsorok rövid), én csak ezt:

d_avg = sum(dsets) / float(len(dsets))

ahol „dsets” egy listát a ndarrays tartalmazó adatokat CSV fájlba. Ez jól működik, de nem szeretné megtartani az adatokat a már fut.

Azt is lakik a rövidebb fut a hossza a leghosszabb, de az új mezők tele vannak „NoneType”. Később műveletek akkor Hiba, ha összeadjuk (például) egy úszó és egy NoneType.

Valami javaslat?

A kérdést 20/11/2009 01:00
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

Nos, az egyik módja az lenne, hogy végighaladni minden sorában minden adathalmaz, és mellékeli az adott oszlop értéket egy tömb, ami tárolja a szótárban, ahol az idő indexet használjuk a legfontosabb érték. Ezután végighaladni a szótárban, és húzza az átlagot az egyes tömbök tárolnak.

Ez nem különösebben hatékony - a másik lehetőség az, hogy megtalálják a leghosszabb tömb, végighaladni, és lekérdezheti a más adatbázisok létrehozására ideiglenes tömböt átlag. Így takaríthat meg a másodlagos iteráció alatt a szótárban.

Válaszolt 20/11/2009 03:03
a forrás felhasználó

szavazat
2

Edit: Én már módosított módszeremet, hogy felhagy scipy.nanmean javára maszkos tömbök.

Ha nem tudja, hogy mi a kód csinál bármikor, először próbálja a print utasítás. Ha ez még mindig nem világos, nyugodtan kérdezz; Megpróbálom a legjobb megmagyarázni. A trükk része kezd a t-értékek összevonásával. (Ez végeztük numpy tömb searchsorted módszer.)

Játék numpy vezetett, hogy higgyek, hogy a fordulatszám előnyök nem létezik, amíg az adatállományok kap elég nagy (talán szüksége lesz legalább 10.000 sorok egy adathalmaz). Ellenkező esetben, egy tiszta python megoldás lehet mind könnyebb írni és gyorsabb.

Íme a játék adathalmazok szoktam:

% cat set1
1, 10, 50
2, 13, 58
3,9,43
4,14,61
7, 4, 82

% cat set2
1, 12, 48
2, 7, 60
3,17,51
4,12,57
7,10,88
8,15,92
9,6,63

És itt van a kód:

#!/usr/bin/env python
import numpy as np

filenames=('set1','set2')   # change this to list all your csv files
column_names=('t','a','b')

# slurp the csv data files into a list of numpy arrays
data=[np.loadtxt(filename, delimiter=',') for filename in filenames]

# Find the complete list of t-values
# For each elt in data, elt[a,b] is the value in the a_th row and b_th column
t_values=np.array(list(reduce(set.union,(set(elt[:,0]) for elt in data))))
t_values.sort()
# print(t_values)
# [ 1.  2.  3.  4.  7.  8.  9.]

num_rows=len(t_values)
num_columns=len(column_names)
num_datasets=len(filenames)

# For each data set, we compute the indices of the t_values that are used.
idx=[(t_values.searchsorted(data[n][:,0])) for n in range(num_datasets)]

data2=np.ma.zeros((num_rows,num_columns,num_datasets))
for n in range(num_datasets):
    data2[idx[n],:,n]=data[n][:,:]
data2=np.ma.masked_equal(data2, 0)
averages=data2.mean(axis=-1)
print(averages)
# [[1.0 11.0 49.0]
#  [2.0 10.0 59.0]
#  [3.0 13.0 47.0]
#  [4.0 13.0 59.0]
#  [7.0 7.0 85.0]
#  [8.0 15.0 92.0]
#  [9.0 6.0 63.0]]
Válaszolt 20/11/2009 03:47
a forrás felhasználó

szavazat
3

Miért nem csak nekünk numpy MA (maszkírozott array) modul?

maxLen = reduce(lambda a,b : max(a, b.shape[0]),
                dSets, 0)
all = N.ma.zeros((maxLen,)+ dSets[0].shape[1:] + (len(dSets),),
                     dtype=float)      # set the dtype to whatever
all.mask = True
for i, set in enumerate(dSets):
    all.mask[:len(set),...,i] = False
    all[:len(set),...,i] = set

mean = all.mean(axis=-1)

Természetesen ez csak akkor működik, ha tudja garantálni, hogy az idő minden sorban ugyanaz az összes tömbök, azaz az [i, 0] == beállítása [j, 0] minden i, j

Válaszolt 20/11/2009 08:49
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more