pandas updated its interface in its version 0.22. More particularly v0.22.0 (December 29, 2017),
print(pd.Series([]).sum())
0.0 # It was nan in 0.21.
This is typically the kind of change which could have a huge impact on many functions if you don't have unit tests to capture that. According to the documentation of sum, the previous behaviour can be retrieved by adding min_count=1.
print(pd.Series([]).sum(min_count=1))
nan
And in 10 days, computers might slow down: Kernel-memory-leaking Intel processor design flaw forces Linux, Windows redesign. See also KASLR is Dead: Long Live KASLR.
pandas is widely used by data scientists. It is one of the modules which contributed a lot to the Python ecosystem to manipulate data. It is not perfect, a dataset takes in memory three times the space it takes on disk in average and reading a couple of gigabytes is necessarily fast. However, a couple of gigabytes is not enough to think about stronger approaches such parallelization (dask, ...) but with a little bit of overhead for such size. All I wanted was the same functionalities as pandas but implemented in a streaming way. No need to load the whole datasets in memory, no need to wait for the data to be fully loaded in memory. That's why I started pandas_streaming.
import pandas df = pandas.DataFrame([dict(cf=0, cint=0, cstr="0"), dict(cf=1, cint=1, cstr="1"), dict(cf=3, cint=3, cstr="3")]) from pandas_streaming.df import StreamingDataFrame sdf = StreamingDataFrame.read_df(df) for df in sdf: # process this chunk of data # df is a dataframe print(df)
The module will continue to grow probably not as fast as I would like it to.
J'utilise les DataFrame quasiment quotidiennement pour manipuler les données. Je n'écris plus de code pour lire ou écrire des données. Je n'écris plus de fichiers plats pour récupérer les données sous Excel. J'écris beaucoup moins de boucles. Je manipule des fichiers de plus d'un millions de lignes. J'utilise beaucoup moins Excel. Les premières opérations qu'on applique sont toujours les mêmes et elles sont résumées ici : DataFrame et Matrice (autre mise en forme).
I use a lot openpyxl with pandas. But the new version of openpyxl is not compatible anymore with pandas. So be careful to install an older version until this compatibility issue is fixed:
pip install openpyxl==1.8.6
L'environnement que je suggère est celui que j'utilise pour préparer mes cours. Il permet d'utiliser les outils que je propose et d'obtenir un espace de travail équivalent à celui que propose R. Plusieurs options sont possibles :
2014/10/25
Si je devais choisir une distribution, ce serait Anaconda. C'est la plus à jour et la plus complète. Une fois installée, elle devient la distribution par défaut sous Linux. Cela évite les confusions entre les différentes versions de Python (Python 2.7 est installée par défaut). Sous Windows, elle est plus complète que WinPython. Elle inclut notamment le package paramiko dont je me sers pour ouvrir une connexion SSH avec un serveur Linux et utiliser PIG.
Il existe deux numéros de versions important à retenir :
L'exercice est le suivant : on récupère deux tableaux depuis le site http://www.data.gouv.fr/. On récupère les deux fichiers suivants :
Ministère Libellé Catégorie d'emploi Emploi ETPPLF 1 Affaires étrangères 1101 Titulaires et CDI en administration centrale 3 059 1 Affaires étrangères 1102 Titulaires et CDI dans le réseau 2 895 1 Affaires étrangères 1103 CDD et volontaires internationaux 2 877 1 Affaires étrangères 1104 Militaires 712 1 Affaires étrangères 1105 Agents de droit local 4 962 ...
On cherche à mesurer l'évolution des effectifs entre ces deux années même si la liste des ministères et des catégories évolue.
Ce n'est pas toujours évident d'apprendre à manipuler un nouveau module. On commence toujours par des trucs simples qu'on peine toujours à faire même après quelques requêtes sur un moteur de recherche. Bref, voici quelques raccourcis (on suppose que df est un DataFrame). Je recommande un rapide coup d'oeil à 10 Minutes to Pandas (et celle-ci aussi : Essential Basic Functionality).
Parcourir tous les éléments (version lente) :
self.header = ['index'] + [ _ for _ in df.columns ] self.values = [] for i in range(len(df) : row = [ df.index[i] ] + [ df.ix[i,j] for j in range(len(self.header)) ] self.values.append(row)
Parcourir tous les éléments (version plus rapide) :
self.header = ['index'] + [ _ for _ in df.columns ] self.values = [] for i,row in enumerate(df.values) : row = [ df.index[i] ] + [ x for x in row ] self.values.append(row)
Créer un DataFrame à partir d'une matrice (liste de listes) :
df = pandas.DataFrame(liste_de_listes, columns = list_nom_colonnes)