2
votes

Comment ajouter des dataframes dans une boucle for en Python

J'ai essayé d'ajouter le DataFrame dans les quatre boucles, car la boucle fonctionne bien, mais elle n'ajoute pas les cadres de données, toute aide serait très appréciée.

MSFT
Empty DataFrame
Columns: []
Index: []
     1. open   2. high    3. low  4. close  5. volume
0   107.4600  107.9000  105.9100  107.7100   37427587
1   105.0000  106.6250  104.7600  106.1200   28393015
..       ...       ...       ...       ...        ...
99  109.2700  109.6400  108.5100  109.6000   19662331

[100 rows x 5 columns]
loop successful
GOOGL
Empty DataFrame
Columns: []
Index: []
      1. open    2. high     3. low   4. close 5. volume
0   1108.5900  1118.0000  1099.2800  1107.3000   2244569
1   1087.9900  1100.7000  1083.2600  1099.1200   1244801
..        ...        ...        ...        ...       ...
99  1244.1400  1257.8700  1240.6800  1256.2700   1428992

[100 rows x 5 columns]
loop successful
AAPL
Empty DataFrame
Columns: []
Index: []
     1. open   2. high    3. low  4. close 5. volume
0   157.5000  157.8800  155.9806  156.8200  33751023
1   154.2000  157.6600  153.2600  155.8600  29821160
..       ...       ...       ...       ...       ...
99  217.1500  218.7400  216.3300  217.9400  20525117

[100 rows x 5 columns]
loop successful
run successfull

Sorties:

   symbols = ['MSFT', 'GOOGL', 'AAPL']
   apikey = 'CR*****YDA'
   for s in symbols:
     print(s)
     url = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=%s&apikey=%s"  % (s, apikey)
     stockdata = urllib.request.urlopen(url)
     data = stockdata.read().decode()
     js = json.loads(data)
     a = pd.DataFrame(js['Time Series (Daily)']).T
     b = pd.DataFrame()
     print(b)
     b = b.append(a, ignore_index=True)
     print(b)
     print("loop successful")

print("run successfull")


0 commentaires

3 Réponses :


0
votes

Déplacer le code suivant

b = pd.DataFrame()

en dehors de la boucle résoudrait votre problème. À l'heure actuelle, 'b' est réinitialisé en tant que dataframe vide à chaque boucle.


0 commentaires

0
votes

Le problème immédiat est que vous définissez b comme un dataframe vide dans chaque itération de votre boucle for . Au lieu de cela, définissez-le une fois avant le début de votre boucle for :

list_of_dfs = []
for s in symbols:
    # some code
    list_of_dfs.append(pd.DataFrame(js['Time Series (Daily)']).T)

b = pd.concat(list_of_dfs, ignore_index=True)

Mais l'ajout de dataframes dans une boucle n'est pas recommandé. Cela nécessite des opérations de copie inutiles et est inefficace. La documentation recommande d'utiliser pd.concat sur un itérable de dataframes:

b = pd.DataFrame()
for s in symbols:
    # some code
    a = pd.DataFrame(js['Time Series (Daily)']).T
    b = b.append(a, ignore_index=True)


0 commentaires

0
votes

Le problème est que vous continuiez à effacer la valeur de b avec un DataFrame vide. Vous devez donc définir b comme DataFrame avant la boucle for.

symbols = ['MSFT', 'GOOGL', 'AAPL']
apikey = 'CR*****YDA'
b = pd.DataFrame()
for s in symbols:
  print(s)
  url = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=%s&apikey=%s"  % (s, apikey)
  stockdata = urllib.request.urlopen(url)
  data = stockdata.read().decode()
  js = json.loads(data)
  a = pd.DataFrame(js['Time Series (Daily)']).T
  print(b)
  b = b.append(a, ignore_index=True)
  print(b)
  print("loop successful")

print("run successfull")


0 commentaires