[PYTHON] Précautions lors de l'utilisation de l'instruction for dans les pandas

Notes sur l'accélération du code Python avec Numba C'est une continuation ou un supplément.

pandas est pratique pour traiter les données de séries chronologiques, mais si vous utilisez l'instruction for telle quelle, elle sera extrêmement lente.

import numpy as np
import pandas as pd
dataM1 = pd.read_csv('DAT_ASCII_EURUSD_M1_2015.csv', sep=';',
                     names=('Time','Open','High','Low','Close', ''),
                     index_col='Time', parse_dates=True)

def LWMA(s, ma_period):
    y = pd.Series(0.0, index=s.index)
    for i in range(len(y)):
        for j in range(ma_period):
            y[i] += s[i-j]*(ma_period-j)
        y[i] /= ma_period*(ma_period+1)/2
    return y

%time MA = LWMA(dataM1['Close'], 10)
Wall time: 3min 10s

Le nombre de données est aussi grand que 370 000, mais il est difficile de prendre 3 minutes sur une moyenne mobile de 10 échantillons. Pour des périodes plus longues, cela peut prendre 10 minutes ou plus. (Core i7-6700 3,4 GHz)

Dans Article précédent, je l'ai remplacé par array et j'ai essayé de l'accélérer en utilisant Numba, mais en fait, ce sera plus rapide simplement en utilisant array.

def LWMA1(s, ma_period):
    a = s.values
    y = np.zeros(len(a))
    for i in range(len(y)):
        for j in range(ma_period):
            y[i] += a[i-j]*(ma_period-j)
        y[i] /= ma_period*(ma_period+1)/2
    return pd.Series(y, index=s.index)

%timeit MA = LWMA1(dataM1['Close'], 10)
1 loop, best of 3: 1.92 s per loop

Même sans utiliser Numba, il est environ 100 fois plus rapide que les pandas.

Bien sûr, dans cet état, l'utilisation de Numba le rendra encore plus rapide.

from numba import jit
@jit
def LWMA2(s, ma_period):
    a = s.values
    y = np.zeros(len(a))
    for i in range(len(y)):
        for j in range(ma_period):
            y[i] += a[i-j]*(ma_period-j)
        y[i] /= ma_period*(ma_period+1)/2
    return pd.Series(y, index=s.index)

%timeit MA = LWMA2(dataM1['Close'], 10)
100 loops, best of 3: 5.31 ms per loop

Même si vous utilisez l'instruction for dans les pandas, il est sage de le faire si elle peut être remplacée par array (l'index n'est pas pertinent). Il semble qu'une petite astuce soit nécessaire pour bien s'entendre avec les pandas.

Recommended Posts

Précautions lors de l'utilisation de l'instruction for dans les pandas
Précautions lors de l'utilisation de Pit avec Python
Précautions lors de l'utilisation de codecs et de pandas
Précautions lors de l'utilisation de Chainer
Précautions lors de l'utilisation de tf.keras.layers.TimeDistributed pour la couche personnalisée tf.keras
Précautions lors du changement d'heure Unix en type datetime dans les pandas
Précautions lors de l'utilisation de l'analyse des traits TextBlob
Précautions lors de l'utilisation de la fonction urllib.parse.quote
[TouchDesigner] Conseils pour la déclaration par python
Précautions lors de l'utilisation de phantomjs de python
Précautions lors de l'utilisation de six avec Python 2.5
Lors de l'utilisation d'expressions régulières en Python
Choses à surveiller lors de l'utilisation d'arguments par défaut en Python
Afficher l'étiquette de chaque élément lors du dessin d'un diagramme de dispersion dans Pandas
Précautions lors du décapage d'une fonction en python
[python, multitraitement] Comportement des exceptions lors de l'utilisation du multitraitement
Remarques sur l'utilisation de python (pydev) avec eclipse
Une note utile lors de l'utilisation de Python après une longue période
Prétraitement de texte japonais sans instruction for dans les pandas
Fonctions pouvant être utilisées dans l'instruction for
Conseils pour utiliser Realsense SR300 sur MacBook en 2020
Pandas Python: recherchez DataFrame à l'aide d'expressions régulières
Précautions lors du traitement des structures de contrôle dans Python 2.6
Précautions lors de l'ajout d'éléments à l'aide de DateField à un modèle existant ultérieurement dans Django
Précautions lors de l'installation de packages dans l'environnement conda
Points à garder à l'esprit lors de l'utilisation de Python pour ceux qui utilisent MATLAB
Précautions lors de l'utilisation de la bibliothèque google-cloud avec GAE / py
Conseils pour utiliser Elastic Search de manière efficace
Précautions concernant cv2.cvtcolor
Erreur survenue dans OpenCV3 et sa solution Précautions lors de l'utilisation d'OpenCV3 sur Mac
Structure de répertoire pour le développement piloté par les tests à l'aide de pytest en python
Précautions lors de l'utilisation de sqlite3 de macOS Sierra (10.12) avec le multitraitement
Paramètres initiaux lors de l'utilisation de l'API foursquare avec python
Précautions lors du traitement du type ROS MultiArray en Python
Comment accéder avec cache lors de la lecture_json avec pandas
Comment quitter lors de l'utilisation de Python dans Terminal (Mac)
Emplacement de modification du code lors de l'utilisation de plotly gratuitement
Une collection de lignes de commande qui utilisent des environnements virtuels avec Anaconda
Résumé des choses qui étaient pratiques lors de l'utilisation de pandas
Lorsque vous voulez plt.save dans l'instruction for
[Mémo] Correspondance de texte dans le cadre de données pandas à l'aide de Flashtext
[Introduction à Python] Comment écrire des instructions répétitives à l'aide d'instructions for
Python3> slice copy / slice notation> utilisé dans les instructions for, etc.
Précautions lors du calcul avec une chaîne pour TmeStampType de PySpark
[Pour enregistrement] Mémorandum Pandas
Résumé lors de l'utilisation de Fabric
Apprenez les pandas en 10 minutes
Précautions à prendre lors de la manipulation de Luigi
Tableau croisé à l'aide de Pandas
UnicodeDecodeError dans pandas read_csv
Précautions lors de l'installation de fbprophet
Conversion de Pandas DataFrame en System.Data.DataTable à l'aide de Python pour .NET
Une note lors de la création d'un graphe dirigé à l'aide de Graphviz en Python
Comportement dans chaque langue lorsque les collouts sont réutilisés avec for
Astuces utiles liées à la liste et aux instructions en Python
Utilisez «% tensorflow_version 2.x» lorsque vous utilisez TPU avec Tensorflow 2.1.0 dans Colaboratory
Résolvez le problème japonais lors de l'utilisation du module CSV en Python.
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
Problèmes et solutions à la demande de MySQL db dans Python 3