Spliting Datenrahmen in mehrere Frames von Daten Python

stimmen
0

Ich verstehe es einige Versionen dieser Fragen da draußen sind, aber keiner scheint im Kern meines Problems zu bekommen. Ich habe einen Pandas Datenrahmen mit rund 72.000 Zeilen von 2015 bis jetzt. Ich verwende eine Berechnung, die die meisten impactful Worte für einen bestimmten Satz von Text (tf_idf) findet. Diese Berechnung berücksichtigt nicht Zeit, so dass ich nach unten in zeitbasierte Segmente meinen Hauptdatenrahmen müssen brechen, idealerweise alle 15 bis 30 Tage (oder n Tage wirklich nicht Woche / Monat), dann die Berechnung für jede Laufzeit segmentiert Datenrahmen, um zu sehen, und die Handlung, welche Worte kommen mehr und weniger über die Zeit.

Ich habe aus halb-manuell zu bauen Teil dieses diese in der Lage gewesen, mit dem folgenden:

def dateRange():
    start = input(Enter a start date (MM-DD-YYYY) or '30' for last 30 days: )
    if (start != '30'):
        datetime.strptime(start, '%m-%d-%Y')
        end = input(Enter a end date (MM-DD-YYYY): )
        datetime.strptime(end, '%m-%d-%Y')
        dataTime = data[(data['STATUSDATE'] > start) & (data['STATUSDATE'] <= end)]
    else:
        dataTime = data[data.STATUSDATE > datetime.now() - pd.to_timedelta('30day')]
    return dataTime

dataTime = dateRange()
dataTime2 = dateRange()

def calcForDateRange(dateRangeFrame):
    ##### LONG FUNCTION####
    return word and number

calcForDateRange(dataTime)
calcForDateRange(dataTime2)

Dies funktioniert - aber ich muss manuell die 2 Termine erstellen, die erwartet wird, wie ich dies als Test erstellt. Wie kann ich den Datenrahmen von Schritten geteilt und die Berechnung für jeden Datenrahmen laufen?

dictsist angeblich die Art und Weise, dies zu tun. Ich habe es versucht:

dict_of_dfs = {}
for n, g in data.groupby(data['STATUSDATE']):
    dict_of_dfs[n] = g

for frame in dict_of_dfs:
    calcForDateRange(frame)

Das dict Ergebnis war 2015-01-02: Dataframeohne Rahmen. Wie kann ich diese nach unten in einen 100 oder so brechen Dataframes auf meine Funktion laufen?

Auch ich verstehe nicht ganz, wie zu brechen ['STATUSDATE']speziell durch die Anzahl der Tage?

Ich würde das Iterieren so weit wie möglich zu vermeiden, aber ich weiß, dass ich wahrscheinlich muß someehere.

Danke dir

Veröffentlicht am 02/12/2019 um 23:52
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Nehmen wir an, Sie so einen Datenrahmen haben:

date = pd.date_range(start='1/1/2018', end='31/12/2018', normalize=True)
x = np.random.randint(0, 1000, size=365)

df = pd.DataFrame(x, columns = ["X"])
df['Date'] = date
df.head()

Ausgabe :

    X   Date
0   328 2018-01-01
1   188 2018-01-02
2   709 2018-01-03
3   259 2018-01-04
4   131 2018-01-05

Also dieser Datenrahmen hat 365 Zeilen, eine für jeden Tag des Jahres.

Nun, wenn Sie diese Daten in Abständen von 20 Tagen gruppieren möchten und jede Gruppe zu einem dict zuordnen, können Sie folgendermaßen vorgehen

df_dict = {}
for k,v in df.groupby(pd.Grouper(key="Date", freq='20D')):
    df_dict[k.strftime("%Y-%m-%d")] = pd.DataFrame(v)
print(df_dict)
Beantwortet am 03/12/2019 um 00:17
quelle vom benutzer

stimmen
1

Wie wäre es so etwas wie dieses. Es schafft ein Wörterbuch von nicht leeren Datenrahmen auf dem Startdatum der Periode eingegeben.

import datetime as dt

start = '12-31-2017'
interval_days = 30

start_date = pd.Timestamp(start)
end_date = pd.Timestamp(dt.date.today() + dt.timedelta(days=1))
dates = pd.date_range(start=start_date, end=end_date, freq=f'{interval_days}d')

sub_dfs = {d1.strftime('%Y%m%d'): df.loc[df.dates.ge(d1) & df.dates.lt(d2)]
           for d1, d2 in zip(dates, dates[1:])}
# Remove empty dataframes.
sub_dfs = {k: v for k, v in sub_dfs.items() if not v.empty}
Beantwortet am 03/12/2019 um 00:24
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more