Une fonctionnalité intéressante de DataFrames est qu'il peut stocker les colonnes avec différents types et il peut « reconnaître automatiquement » eux, par exemple:Comment convertir une matrice de type mixte à dataframe Julia reconnaissant les types de colonnes
using DataFrames, DataStructures
df1 = wsv"""
parName region forType value
vol AL broadL_highF 3.3055628012
vol AL con_highF 2.1360975151
vol AQ broadL_highF 5.81984502
vol AQ con_highF 8.1462998309
"""
typeof(df1[:parName])
DataArrays.DataArray{String,1}
typeof(df1[:value])
DataArrays.DataArray{Float64,1}
Quand j'essaie cependant d'atteindre le même résultat à partir d'une matrice (importée de feuille de calcul) I « lâche » que la conversion automatique:
dataMatrix = [
"parName" "region" "forType" "value";
"vol" "AL" "broadL_highF" 3.3055628012;
"vol" "AL" "con_highF" 2.1360975151;
"vol" "AQ" "broadL_highF" 5.81984502;
"vol" "AQ" "con_highF" 8.1462998309;
]
h = [Symbol(c) for c in dataMatrix[1,:]]
vals = dataMatrix[2:end, :]
df2 = convert(DataFrame,OrderedDict(zip(h,[vals[:,i] for i in 1:size(vals,2)])))
typeof(df2[:parName])
DataArrays.DataArray{Any,1}
typeof(df2[:value])
DataArrays.DataArray{Any,1}
Il y a plusieurs questions sur le SO sur la façon de convertir une matrice en une trame de données (par exemple, DataFrame from Array with Header, Convert Julia array to dataframe), mais aucune des réponses ne traite de la conversion d'une matrice de type mixte.
Comment est-ce que je pourrais créer un DataFrame à partir d'une matrice reconnaissant automatiquement le type des colonnes? (1) convertir le df (en utilisant le dictionnaire ou le constructeur de la matrice .. le premier est plus rapide) et ensuite appliquer try-catch pour la conversion de type (ma réponse d'origine); (2) convertir en chaîne, puis utiliser df.inlinetable (réponse Dan Getz); (3) vérifier le type de chaque élément et leur cohérence par colonne (réponse Alexander Morley).
Voici les résultats:
# second time for compilation.. further times ~ results
@time toDf1(m) # 0.000946 seconds (336 allocations: 19.811 KiB)
@time toDf2(m) # 0.000194 seconds (306 allocations: 17.406 KiB)
@time toDf3(m) # 0.001820 seconds (445 allocations: 35.297 KiB)
Ainsi, il est fou, la solution la plus efficace semble « verser l'eau » et de réduire le problème à une déjà résolu un ;-)
Merci pour toutes les réponses.
Pourquoi ne pas vous venez de sauver un fichier CSV à partir de la feuille de calcul et le charger avec CSV.read()? Cela devrai prendre soin de ça. –
@ MichaelK.Borregaard parce que j'ai un modèle qui charge tous les paramètres et les données de plusieurs feuilles, et je veux éviter de les exporter tous à cvs chaque fois que je fais un changement. – Antonello