Vychádzam z dokumentácie pandas DataFrame tu: http://pandas.pydata.org/pandas-docs/stable/dsintro.html
Chcel by som iteratívne napĺňať DataFrame hodnotami pri výpočte typu časového radu. Takže v podstate by som chcel inicializovať DataFrame stĺpcami A, B a riadkami časových značiek, všetky 0 alebo všetky NaN.
Potom by som pridával počiatočné hodnoty a prechádzal cez tieto údaje a počítal nový riadok z predchádzajúceho riadku, povedzme riadok[A][t] = riadok[A][t-1]+1
alebo tak nejako.
Momentálne používam kód, ako je uvedený nižšie, ale mám pocit, že je to trochu škaredé a musí existovať spôsob, ako to urobiť priamo s DataFrame, alebo jednoducho lepší spôsob vo všeobecnosti. Poznámka: Používam 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
Tu je niekoľko návrhov:
Pre index použite date_range
:
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']
Poznámka: mohli by sme vytvoriť prázdny DataFrame (s NaN
) jednoducho napísaním:
df_ = pd.DataFrame(index=index, columns=columns)
df_ = df_.fillna(0) # with 0s rather than NaNs
Ak chcete vykonať tento typ výpočtov pre údaje, použite pole numpy:
data = np.array([np.arange(10)]*3).T
Preto môžeme vytvoriť 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
I Ak chcete jednoducho vytvoriť prázdny dátový rámec a neskôr ho naplniť niektorými prichádzajúcimi dátovými rámcami, skúste toto:
V tomto príklade používam tento dokument pandas na vytvorenie nového dátového rámca a potom pomocou append zapisujem do novéhoDF údaje zo staréhoDF.
Pozrite sa na toto
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
I Ak chcete mať názvy stĺpcov zavedené od začiatku, použite tento postup:
import pandas as pd
col_names = ['A', 'B', 'C']
my_df = pd.DataFrame(columns = col_names)
my_df
I Ak chcete pridať záznam do dátového rámca, bolo by lepšie použiť tento postup:
my_df.loc[len(my_df)] = [2, 4, 5]
Možno budete chcieť odovzdať aj slovník:
my_dic = {'A':2, 'B':4, 'C':5}
my_df.loc[len(my_df)] = my_dic
Ak však chcete do my_df pridať ďalší dátový rámec, postupujte takto:
col_names = ['A', 'B', 'C']
my_df2 = pd.DataFrame(columns = col_names)
my_df = my_df.append(my_df2)
I Ak pridávate riadky vo vnútri cyklu, zvážte výkonnostné problémy:
Približne pre prvých 1000 záznamov "my_df.loc" je výkon lepší, ale postupne sa spomaľuje zvyšovaním počtu záznamov v slučke.
IAk plánujete vykonávať drobné operácie vo veľkej slučke (napríklad 10 miliónov záznamov alebo viac):
Je lepšie použiť kombináciu týchto dvoch možností;
naplňte dátový rámec pomocou iloc, kým jeho veľkosť nedosiahne približne 1000, potom ho pripojte k pôvodnému dátovému rámcu a dočasný dátový rámec vyprázdnite.
To by zvýšilo váš výkon približne 10-krát.