1
votes

Pourquoi ne puis-je pas diviser ces deux variables?

Je suis relativement nouveau en python. J'ai essayé d'importer mon csv pour 2 actions. Lorsque j'exécute le code ci-dessous, j'obtiens cette erreur:

 import pandas as pd 

stock1 = pd.read_csv('stock1.csv', parse_dates=['Date', 'Price'])
stock2 = pd.read_csv('stock2.csv', parse_dates=['Date', 'Price'])


for i in (stock1,stock2):
    i['Norm return'] = i['Price'] / i.iloc[0]['Price']

Cela signifie-t-il qu'il traite le prix comme une chaîne? Comment puis-je m'assurer qu'il est traité comme un nombre lors de son importation?

TypeError: unsupported operand type(s) for /: 'str' and 'str'


3 commentaires

Vous ne pouvez pas diviser les chaînes. Vous devez d'abord les convertir en nombres.


Comme l'indique le message d'erreur, les deux variables sont des chaînes. Vous pouvez les rendre entiers ou flottants en utilisant les conversions int (variable) ou float (variable). Par exemple, i ["Norm return '] = float (i [' Price ']) / float (i.iloc [0] [' Price])


@MishaMelnyk Quand j'ai essayé cela, il a dit: TypeError: impossible de convertir la série en


3 Réponses :


0
votes

Vous essayez de diviser une chaîne. Essayez de les convertir en type numérique, comme float:

for i in (stock1,stock2):
    i["Price"] = i["Price"].astype(float)
    i['Norm return'] = i['Price'] / i.iloc[0]['Price']


3 commentaires

Pourquoi le charge-t-il comme une chaîne en premier lieu? Dans le csv, c'est un nombre. J'ai essayé ce qui a suggéré et j'ai obtenu ceci: AttributeError: l'objet 'str' n'a pas d'attribut 'astype'


J'ai mis à jour ma solution, donc si vos valeurs de prix ne contiennent pas de caractères non numériques, cela devrait fonctionner.


"Pourquoi le charge-t-il sous forme de chaîne en premier lieu? Dans le csv, c'est un nombre." Non; dans le CSV, c'est une chaîne , garantie. Tout est une chaîne dans le CSV. Les fichiers sur disque ne stockent que des données brutes, qui n'ont pas de type; le format de fichier spécifie les types, mais CSV traite tout comme des chaînes. Toute autre interprétation de ces chaînes dépend de ce qui est utilisant le CSV. Dans votre cas, c'est votre programme, et il doit avoir un code réel qui examine le texte qui représente les nombres et le remplace par les nombres réels. Tels que fournis dans cette réponse.



0
votes

Je pense que vous avez le symbole «$» dans votre prix, alors vous devez d'abord supprimer «$» du prix.


1 commentaires

Je n'ai pas de $ dans le prix. Ce n'est qu'un nombre décimal.



0
votes

pd.read_csv essaiera de déduire le format mais parfois ne le pourra pas. Vous pouvez donner des indices de type via le paramètre dtype comme ceci:

stock1 = pd.read_csv('stock1.csv', parse_dates=['Date'], dtype={'Price': float})

Il suffit peut-être de le retirer de parse_dates . En écrivant parse_dates = ['Date', 'Price'] , vous dites aux pandas d'essayer de fixer les prix à une date.

Vous pourriez également rencontrer une erreur qui en serait la raison pandas ne lit pas la colonne comme float en premier lieu. Une chaîne comme «NAN» dans votre .csv pourrait le faire. Dans https://pandas.pydata.org/pandas -docs / stable / reference / api / pandas.read_csv.html il existe une multitude de paramètres supplémentaires que vous pouvez définir pour traiter un tel scénario.


0 commentaires