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 Réponses :
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']
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.
Je pense que vous avez le symbole «$» dans votre prix, alors vous devez d'abord supprimer «$» du prix.
Je n'ai pas de $ dans le prix. Ce n'est qu'un nombre décimal.
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.
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