6
votes

Stocker des données tabulaires sur Swift

Quel type de structure de données dois-je utiliser qui me permettrait de stocker des données tabulaires (et d'y ajouter de nouvelles données), ainsi que de les exploiter (agrégations de calcul, etc.).

Plus précisément, je recherche quelque chose de similaire aux pandas (pour python). Pour le moment, je n'ai pas besoin de dessiner la table de données, mais uniquement de stocker des données.

Par exemple, imaginez que je veuille ajouter des valeurs à une table toutes les 5 secondes, de sorte que, toutes les heures, je vais agréger les informations dans une nouvelle structure de données.


1 commentaires

Avez-vous vérifié ce projet? github.com/siegesmund/dataframe Il est inspiré des Pandas


3 Réponses :


2
votes

Peut-être que cela pourrait vous aider?

struct Table<T>{
    typealias Columns = [T]
    typealias Rows = [Columns]
    private var data: Rows = []

    mutating func appendRow(row: Columns){
        data.append(row)
    }

    func getRow(index: Int) -> Columns?{
        return data[safe: index]
    }
}

var intTable = Table<Int>()
intTable.appendRow(row: [1,2,3,4])
intTable.appendRow(row: [1,2,3])

var anyTable = Table<Any>()
anyTable.appendRow(row: ["Hello World", 12])


4 commentaires

Bien sûr, je peux implémenter mes propres opérations de table et d'agrégation mais j'ai tendance à éviter de réinventer la roue. Existe-t-il une bibliothèque qui fournit déjà cette fonctionnalité? Cela m'étonne.


@CarlosVega demander un outil est hors sujet sur le débordement de pile


Je ne demande pas d'outil. Je demande la meilleure pratique ou la bibliothèque. Je ne dis pas que votre réponse est une mauvaise réponse. Merci pour cela au fait.


Les recommandations de la bibliothèque @CarlosVega sont également hors-sujet. Les meilleures pratiques sont basées sur l'opinion.



0
votes

Vous pouvez utiliser SwiftyTextTable: https://github.com/scottrhoyt/SwiftyTextTable .

C'est génial et très facile à utiliser aussi. Disons que vous pouvez stocker des données dans une table comme celle-ci.

// create columns

let column1 = TextTableColumn(header: "foo")
let column2 = TextTableColumn(header: "bar")
let column3 = TextTableColumn(header: "baz")

// Then create a table with the columns

var table = TextTable(columns: [column1, column2, column3])


// Then add some rows

table.addRow([1, 2, 3])
table.addRow([11, 22, 33])

Le code Swift pour stocker ces données serait

/*
+-----+-----+-----+
| foo | bar | baz |
+-----+-----+-----+
| 1   | 2   | 3   |
| 11  | 22  | 33  |
+-----+-----+-----+
*/


4 commentaires

cela ne prend pas en charge les opérations mathématiques, n'est-ce pas?


Pour les opérations mathématiques, vous pouvez simplement créer vos extensions vers le bas à l'aide des fonctions d'ordre supérieur.


Quelles opérations mathématiques devez-vous prendre en charge?


std, mean, sum, median, etc. Je pourrais le faire moi-même (mon approche actuelle) mais je préfère utiliser des bibliothèques matures.



0
votes

Vous pouvez également utiliser cette bibliothèque: https://github.com/AramKoorn/swifty

Pour stocker des données sous forme de tableau, vous pouvez facilement créer un DataFrame comme

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
  <tr>
    <th class="tg-0pky">col1</th>
    <th class="tg-0pky">col2</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0pky">1</td>
    <td class="tg-0pky">a</td>
  </tr>
  <tr>
    <td class="tg-0pky">2</td>
    <td class="tg-0pky">b</td>
  </tr>
  <tr>
    <td class="tg-0pky">3</td>
    <td class="tg-0pky">c</td>
  </tr>
  <tr>
    <td class="tg-0pky">4</td>
    <td class="tg-0pky">d</td>
  </tr>
</tbody>
</table>

Si vous souhaitez ajouter des données, vous pouvez utiliser la fonction concat (). Par exemple

  var df2 = DataFrame(data: [[3, 4], ["c", "d"]], columns: ["col1", "col2"])
  df1.concat(data: [df2], axis: "rows")

la sortie sera:

 var df1 = DataFrame(data: [[1, 2], ["a", "b"]], columns: ["col1", "col2"])


0 commentaires