Ξεκινάω από τα έγγραφα για το DataFrame του pandas εδώ: http://pandas.pydata.org/pandas-docs/stable/dsintro.html
Θα ήθελα να γεμίσω επαναληπτικά το DataFrame με τιμές σε ένα είδος υπολογισμού χρονοσειράς. Οπότε βασικά, θα ήθελα να αρχικοποιήσω το DataFrame με τις στήλες A, B και τις γραμμές timestamp, όλες 0 ή όλες NaN.
Στη συνέχεια, θα πρόσθετα αρχικές τιμές και θα περνούσα πάνω από αυτά τα δεδομένα υπολογίζοντας τη νέα γραμμή από τη γραμμή πριν, ας πούμε row[A][t] = row[A][t-1]+1
ή έτσι.
I'm επί του παρόντος χρησιμοποιώντας τον κώδικα όπως παρακάτω, αλλά αισθάνομαι ότι's κάπως άσχημο και πρέπει να υπάρχει ένας τρόπος για να γίνει αυτό με ένα DataFrame άμεσα, ή απλά ένας καλύτερος τρόπος γενικά. Σημείωση: Χρησιμοποιώ την 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
Ακολουθούν μερικές προτάσεις:
Χρησιμοποιήστε 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']
Σημείωση: θα μπορούσαμε να δημιουργήσουμε ένα κενό DataFrame (με NaN
) απλά γράφοντας:
df_ = pd.DataFrame(index=index, columns=columns)
df_ = df_.fillna(0) # with 0s rather than NaNs
Για να κάνετε τέτοιου είδους υπολογισμούς για τα δεδομένα, χρησιμοποιήστε έναν πίνακα numpy:
data = np.array([np.arange(10)]*3).T
Ως εκ τούτου, μπορούμε να δημιουργήσουμε το 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
Εάν θέλετε απλώς να δημιουργήσετε ένα κενό πλαίσιο δεδομένων και να το γεμίσετε αργότερα με κάποια εισερχόμενα πλαίσια δεδομένων, δοκιμάστε αυτό:
Σε αυτό το παράδειγμα χρησιμοποιώ το this pandas doc για να δημιουργήσω ένα νέο πλαίσιο δεδομένων και στη συνέχεια χρησιμοποιώ το append για να γράψω στο newDF με δεδομένα από το oldDF.
Ρίξτε μια ματιά σε αυτό
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
Εάν θέλετε να έχετε τα ονόματα των στηλών σας από την αρχή, χρησιμοποιήστε την εξής προσέγγιση:
import pandas as pd
col_names = ['A', 'B', 'C']
my_df = pd.DataFrame(columns = col_names)
my_df
IΑν θέλετε να προσθέσετε μια εγγραφή στο πλαίσιο δεδομένων, θα ήταν καλύτερα να χρησιμοποιήσετε:
my_df.loc[len(my_df)] = [2, 4, 5]
Μπορεί επίσης να θέλετε να περάσετε ένα λεξικό:
my_dic = {'A':2, 'B':4, 'C':5}
my_df.loc[len(my_df)] = my_dic
Πάντως αν θέλετε να προσθέσετε ένα άλλο πλαίσιο δεδομένων στο my_df κάντε τα εξής:
col_names = ['A', 'B', 'C']
my_df2 = pd.DataFrame(columns = col_names)
my_df = my_df.append(my_df2)
Αν προσθέτετε γραμμές μέσα σε βρόχο, λάβετε υπόψη τα ζητήματα απόδοσης: <br>, Για περίπου τις πρώτες 1000 εγγραφές "my_df.loc" η απόδοση είναι καλύτερη, αλλά σταδιακά γίνεται πιο αργή με την αύξηση του αριθμού των εγγραφών στο βρόχο.
Εάν σκοπεύετε να κάνετε αραιώσεις μέσα σε ένα μεγάλο βρόχο (π.χ. 10 εκατ. εγγραφές ή κάτι τέτοιο):
Καλύτερα να χρησιμοποιήσετε ένα μείγμα αυτών των δύο,
να γεμίσετε ένα πλαίσιο δεδομένων με iloc μέχρι το μέγεθος να φτάσει περίπου 1000, στη συνέχεια να το προσαρτήσετε στο αρχικό πλαίσιο δεδομένων και να αδειάσετε το προσωρινό πλαίσιο δεδομένων.
Αυτό θα αυξήσει την απόδοσή σας κατά περίπου 10 φορές.