Spliting DataFrame na wiele ramek według dat Pythonie

głosy
0

W pełni rozumiem, istnieje kilka wersji tego pytania tam, ale żaden nie wydaje się uzyskać u podstaw mojego problemu. Mam pandy Dataframe z około 72000 wierszy z 2015 roku do chwili obecnej. Używam obliczenia, które znajdzie najwięcej wyrazistość słów dla danego zbioru tekstów (tf_idf). To wyliczenie nie uwzględnia czasu, więc muszę złamać mój główny Dataframe na segmenty w oparciu o czas, najlepiej co 15 do 30 dni (lub n dni naprawdę nie tydzień / miesiąc), a następnie uruchomić obliczenia na każdym-segmentowy Dataframe aby oglądnąć i działki jakie słowa wymyślić coraz mniej w czasie.

Byłem w stanie zbudować część to ta z pół-ręcznie z następujących powodów:

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)

To działa - jednak muszę ręcznie utworzyć 2 dat, które oczekiwane jest jak stworzyłem to jako test. W jaki sposób można podzielić Dataframe skokowo i uruchomić obliczenia dla każdego dataframe?

dictssą rzekomo sposób to zrobić. Próbowałem:

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

for frame in dict_of_dfs:
    calcForDateRange(frame)

Wynik DICT było 2015-01-02: Dataframebez ramki. Jak mogę podzielenie go na 100 lub tak Dataframes uruchomić mój funkcję?

Również nie w pełni zrozumieć, jak przełamać ['STATUSDATE']przez liczbę dni, konkretnie?

Chciałbym uniknąć Iterowanie jak najwięcej, ale wiem, że prawdopodobnie będzie musiał someehere.

Dziękuję Ci

Utwórz 02/12/2019 o 23:52
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Załóżmy, że masz ramkę danych takiego:

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()

wyjście :

    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

Więc to ramka danych ma 365 wierszy, po jednym na każdy dzień roku.

Teraz, jeśli chcesz, aby grupy te dane do odstępach 20 dni i przypisać każdej grupy do dict, można wykonać następujące czynności

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)
Odpowiedział 03/12/2019 o 00:17
źródło użytkownik

głosy
1

Jak o czymś takim. Tworzy słownika non pustych dataframes kluczach od dnia rozpoczęcia okresu.

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}
Odpowiedział 03/12/2019 o 00:24
źródło użytkownik

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