Parto de la documentación de pandas DataFrame aquí: http://pandas.pydata.org/pandas-docs/stable/dsintro.html
Me gustaría llenar iterativamente el DataFrame con valores en un tipo de cálculo de series de tiempo. Así que, básicamente, me gustaría inicializar el DataFrame con las columnas A, B y las filas del timestamp, todas 0 o todas NaN.
Luego añadiría los valores iniciales y pasaría por encima de estos datos calculando la nueva fila a partir de la fila anterior, digamos row[A][t] = row[A][t-1]+1
o así.
Actualmente estoy usando el código de abajo, pero creo que es un poco feo y debe haber una manera de hacer esto con un DataFrame directamente, o simplemente una manera mejor en general. Nota: Estoy usando Python 2.7.
import datetime as dt
import pandas as pd
import scipy as s
if __name__ == '__main__':
base = dt.datetime.today().date()
dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
dates.sort()
valdict = {}
symbols = ['A','B', 'C']
for symb in symbols:
valdict[symb] = pd.Series( s.zeros( len(dates)), dates )
for thedate in dates:
if thedate > dates[0]:
for symb in valdict:
valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]
print valdict
He aquí un par de sugerencias:
Utilice date_range
para el índice:
import datetime
import pandas as pd
import numpy as np
todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq='D')
columns = ['A','B', 'C']
Nota: podríamos crear un DataFrame vacío (con NaN
s) simplemente escribiendo:
df_ = pd.DataFrame(index=index, columns=columns)
df_ = df_.fillna(0) # with 0s rather than NaNs
Para hacer este tipo de cálculos para los datos, utiliza un array de numpy:
data = np.array([np.arange(10)]*3).T
Así podemos crear el DataFrame:
In [10]: df = pd.DataFrame(data, index=index, columns=columns)
In [11]: df
Out[11]:
A B C
2012-11-29 0 0 0
2012-11-30 1 1 1
2012-12-01 2 2 2
2012-12-02 3 3 3
2012-12-03 4 4 4
2012-12-04 5 5 5
2012-12-05 6 6 6
2012-12-06 7 7 7
2012-12-07 8 8 8
2012-12-08 9 9 9
Si simplemente quieres crear una trama de datos vacía y rellenarla con algunas tramas de datos entrantes más tarde, prueba esto:
En este ejemplo estoy usando this pandas doc para crear un nuevo marco de datos y luego usando append para escribir en el nuevo marco de datos con los datos del viejo marco de datos.
**Mira esto...
newDF = pd.DataFrame() #creates a new dataframe that's empty
newDF = newDF.append(oldDF, ignore_index = True) # ignoring index is optional
# try printing some data from newDF
print newDF.head() #again optional
Si quiere tener los nombres de las columnas desde el principio, utilice este método:
import pandas as pd
col_names = ['A', 'B', 'C']
my_df = pd.DataFrame(columns = col_names)
my_df
Si quieres añadir un registro al marco de datos, sería mejor utilizar:
my_df.loc[len(my_df)] = [2, 4, 5]
También es posible que desee pasar un diccionario:
my_dic = {'A':2, 'B':4, 'C':5}
my_df.loc[len(my_df)] = my_dic
Si quieres añadir otro marco de datos a mi_df, haz lo siguiente:
col_names = ['A', 'B', 'C']
my_df2 = pd.DataFrame(columns = col_names)
my_df = my_df.append(my_df2)
Si estás añadiendo filas dentro de un bucle considera los problemas de rendimiento:
Para los primeros 1000 registros "mi_df.loc" el rendimiento es mejor, pero se vuelve gradualmente más lento al aumentar el número de registros en el bucle.
Si planea hacer delgados dentro de un bucle grande (digamos 10M registros o así):
Es mejor que use una mezcla de estos dos;
Llenar un dataframe con iloc hasta que el tamaño sea alrededor de 1000, luego anexarlo al dataframe original, y vaciar el dataframe temporal.
Esto aumentaría el rendimiento en unas 10 veces.