Metadata-Version: 2.3
Name: readerLUNA
Version: 1.7.4
Summary: Reader dati processati da interrogatore LUNA
Author: Marco Brunero
Author-email: marco.brunero@cohaerentia.com
Requires-Python: >=3.12,<4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Dist: h5py (>=3.12.1)
Requires-Dist: ipympl (>=0.9.4)
Requires-Dist: matplotlib (>=3.9.3)
Requires-Dist: nbformat (>=4.2.0)
Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
Requires-Dist: pandas (>=2.2.3)
Requires-Dist: plotly (>=5.24.1)
Requires-Dist: scipy (>=1.14.1)
Description-Content-Type: text/markdown

# Reader LUNA

## Installazione

Per installare il pacchetto, da terminale nella cartella che contiene il file wheel:

```cmd
pip install \readerluna-0.1.0-py3-none-any.whl
```

modificando opportunamente la versione nel nome del file.

## Utilizzo

Per caricare un file testuale:

```python
from readerLUNA import Luna
file = 'desrf/ytgy-2024-11-21T15;47;18.425138.txt'
misura = Luna(file=file)
```

Oppure un file `h5` precedentemente esportato (vedere sotto):

```python
misura = Luna(file='prova.h5')
```

E' possibile effettuare smooth lungo entrambe le direzioni:

```python
misura.smooth(samples_time=10,samples_position=5)
```

### Plot

Esistono metodi per plottare la heatmap oppure le linee con andamento nel tempo di alcuni punti indicati, in cm, o ancora andamento delle posizioni per alcuni momenti temporali indicati (come variabili `datetime` con timezone utc indicata).

```python
misura.plot_heatmap().show()
misura.plot_heatmap(zmin=-10,zmax=500).show()
misura.plot_positions_vs_time(positions_cm=[5,20,27.8]).show()

from datetime import datetime, timezone, timedelta 
start_time = datetime( 2024,11,25,16,46,42,tzinfo=timezone.utc )
misura.plot_times_vs_position(times_utc=[start_time + timedelta( minutes=i*10 ) for i in range(5)]).show()
```

E' possibile utilizzare `matplotlib` invece che `plotly`.

```python
misura.plot_heatmap(library='matplotlib')
misura.plot_positions_vs_time(positions_cm=[5,20,27.8],library='matplotlib')
```

### Post-processing

#### Sostituzione NaN

Gli eventuali NaN nell'array 2d vengono sostituiti con valor medio dei due non NaN adiacienti, lungo l'asse dei tempi o delle posizioni, in base a parametro `axis`.

```python
misura.clean_nan()
misura.clean_nan(axis='position')
```

Non molto veloce, andrebbe cercato qualche metodo meno iterativo.

### Sostituzione outliers

Outliers vengono individuati e poi sostituiti con valore interpolato tra i vicini.

```python
number_of_outliers = misura.clean_outliers()
```

Andrebbero provati [hampel](https://github.com/MichaelisTrofficus/hampel_filter) o [altri](https://github.com/jsosa/outlierml) metodi per trovare outliers; mentre la decisione di usare media di finestra rettangolare è una mia idea con zero fondamenti scientifici a supporto. Provato ed implementato [interquantile range threshold (IQR)](https://www.geeksforgeeks.org/detect-and-remove-the-outliers-using-python/) ma sembra funzionare peggio.

### Concatenare nel tempo

Possibile concatenare due o più misure usando l'operatore `+`. La concatenazione avviene lungo la direzione temporale e deve avere stessa dimensione lungo l'asse spaziale. Nell'esempio sotto, avendo un solo file di dati, introduco un delta fittizio di un'ora.

```python
misura2 = Luna(file=file)
misura2.time_utc = [time + timedelta(hours=1) for time in misura2.time_utc]

misura_sum = misura + misura2
misura_sum.plot_heatmap()
```

Per esempio, per leggere tutti i files in una cartella con una parte comune nel nome:

```python
from glob import glob
from pandas.errors import EmptyDataError

folder = 'C:/Users/marbr/OneDrive/Cohaerentia/01 - Progetti/Autostrade - Valdera/Misure/Trave1_8m_Ciclo/Strain'
first = True
for file in glob(f"{folder}/Processed_1Hz_*.txt"):
    try:
        if first:
            misura = Luna(file=file)
            first = False
        else:
            misura = misura + Luna(file=file)
    except EmptyDataError:
        print(file)
```

Stare attenti che i nomi files siano ordinati per nome correttamente, ovvero in ordine temporale. Non c'è nessun controllo e riordinamento via codice.

### Esportare in file h5

```python
misura.export(filename='prova.h5`)
```

