web-dev-qa-db-fra.com

Y a-t-il une différence de calcul entre Numpy et Pandas?

J'ai écrit un tas de code en supposant que j'allais utiliser des tableaux Numpy. Il s'avère que les données que j'obtiens sont chargées via Pandas. Je me souviens maintenant que je l'ai chargé dans Pandas parce que j'avais des problèmes pour le charger dans Numpy. Je pense que les données étaient tout simplement trop volumineuses.

Par conséquent, je me demandais, y a-t-il une différence dans la capacité de calcul lors de l'utilisation de Numpy vs Pandas?

Si Pandas est plus efficace, je préfère réécrire tout mon code pour Pandas mais s'il n'y a plus d'efficacité, je vais simplement utiliser un tableau numpy). ..

30
Terence Chow

Il peut y avoir une différence de performance significative, d'un ordre de grandeur pour les multiplications et de plusieurs ordres de grandeur pour l'indexation de quelques vaues aléatoires.

Je me demandais en fait la même chose et suis tombé sur cette comparaison intéressante: http://penandpants.com/2014/09/05/performance-of-pandas-series-vs-numpy-arrays/

17
Mark

Je pense qu'il s'agit plutôt d'utiliser les deux données stratégiquement et de les déplacer (de numpy à pandas ou vice versa) en fonction des performances que vous voyez. Comme exemple récent, j'essayais de concaténer 4 petites pickle fichiers avec 10k lignes chacun data.shape -> (10,000, 4) en utilisant numpy.

Le code était quelque chose comme:

n_concat = np.empty((0,4))
for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(file_path)
    n_concat = np.vstack((co_np, filtered_snp))
joblib.dump(co_np, 'data/save_file.pkl', compress = True)

Cela a fait planter mon ordinateur portable (8 Go, i5), ce qui était surprenant car le volume n'était pas vraiment ça énorme. Les 4 fichiers marinés compressés pesaient environ 5 Mo chacun.

La même chose, a très bien fonctionné sur les pandas.

for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(sd)
    try:
        df = pd.concat([df, pd.DataFrame(n_data, columns = [...])])
    except NameError:
        df = pd.concat([pd.DataFrame(n_data,columns = [...])])
joblib.dump(df, 'data/save_file.pkl', compress = True)

D'un autre côté, lorsque j'implémentais une descente de gradient en itérant sur une trame de données pandas, c'était horriblement lent, tandis que l'utilisation de numpy pour le travail était beaucoup plus rapide.

En général, j'ai vu que pandas fonctionne généralement mieux pour se déplacer/munging des morceaux de données modérément grands et effectuer des opérations de colonne communes tandis que numpy fonctionne mieux pour le travail vectorisé et récursif (peut-être plus intense en mathématiques travail) sur de plus petits ensembles de données.

Déplacer des données entre les deux est sans tracas, donc je suppose que l'utilisation des deux de manière stratégique est la voie à suivre.

3
Gaurav