web-dev-qa-db-fra.com

TypeError: l'argument float () doit être une chaîne ou un nombre, et non "Period"

J'ai un cadre de données pandas avec des colonnes comme celle-ci:

df.columns = pd.to_datetime(list(df)) #list(df) = ["2017-01", "2016-01", ...]

Ensuite, j'ai effectué une interpolation dans chaque ligne de l'ensemble de données, car je souhaite supprimer certains NaN. Voici le résultat imprimé:

ORIGINAL  
2007-12-01     NaN 
2008-12-01     NaN 
2009-12-01     NaN 
2010-12-01   -0.35 
2011-12-01    0.67 
2012-12-01     NaN 
2013-12-01     NaN 
2014-12-01    1.03 
2015-12-01    0.37 
2016-12-01     NaN 
2017-12-01     NaN 
Name: row1, dtype: float64 

INTERPOLATION  
2007-12-01   -0.350000 
2008-12-01   -0.350000 
2009-12-01   -0.350000 
2010-12-01   -0.350000 
2011-12-01    0.670000 
2012-12-01    0.790219 
2013-12-01    0.910109 
2014-12-01    1.030000 
2015-12-01    0.370000 
2016-12-01    0.370000 
2017-12-01    0.370000 
Name: row1, dtype: float64

Ensuite, j'essaie de tracer la ligne interpolée et d'obtenir:

TypeError: float() argument must be a string or a number, not 'Period' 

Le code entier:

print("ORIGINAL\n", series)
interpolation = series.interpolate(method=func, limit=10, limit_direction='both')
interpolation.plot()
print("INTERPOLATION\n",interpolation)

Il me semble que l'erreur réside dans les valeurs temporelles de la série, mais je pense que matplotlib devrait être capable de la gérer, alors je fais quelque chose de mal, à coup sûr. Merci d'avance.

7
J63

Ceci est un bogue dans les pandas et sera corrigé par la prochaine version majeure de d’ici le 31 août 2018 si tout se passe bien.

Pour l'instant, la solution de contournement de @ J63 doit être remplie. Cela, ou installez une version antérieure de pandas, telle que 0.20.2.

3
Xavier Ho

Cela fonctionne si je le fais:

plt.plot(row.index, row.values)
plt.show()

Je ne sais pas pourquoi si ...

3
J63

Copié vos résultats d'interpolation

df = pd.read_clipboard(header=None)
df.columns = ['Period','Value']
df['Period'] = pd.to_datetime(df['Period'])
df  = df.set_index('Period')
print(df)

               Value
Period              
2007-12-01 -0.350000
2008-12-01 -0.350000
2009-12-01 -0.350000
2010-12-01 -0.350000
2011-12-01  0.670000
2012-12-01  0.790219
2013-12-01  0.910109
2014-12-01  1.030000
2015-12-01  0.370000
2016-12-01  0.370000
2017-12-01  0.370000


df.plot()

 enter image description here

1
Scott Boston