Spliting dataframe in meerdere frames door Data Python

stemmen
0

Ik begrijp er zijn een paar versies van deze vragen die er zijn, maar niets schijnt de kern van mijn probleem te krijgen. Ik heb een panda dataframe met ongeveer 72.000 rijen van 2015 tot nu. Ik gebruik een berekening die de meest invloedrijke woorden vindt voor een bepaalde set van tekst (tf_idf). Deze berekening houdt geen rekening met de tijd, dus ik moet mijn belangrijkste dataframe breken in op tijd gebaseerde segmenten, ideaal om de 15 en 30 dagen (of n dagen echt, geen week / maand), voer de berekening op elke time-gesegmenteerde dataframe om te zien en plot welke woorden komen meer en minder na verloop van tijd.

Ik ben in staat geweest om te bouwen deel van deze dit uit semi-handmatig door het volgende:

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)

Deze werken - maar ik moet handmatig de 2 data die naar verwachting als ik dit gemaakt als een test te maken. Hoe kan ik deelden de dataframe in stappen en laat de berekening voor elk dataframe?

dictszijn naar verluidt de manier om dit te doen. Ik heb geprobeerd:

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

for frame in dict_of_dfs:
    calcForDateRange(frame)

Het resultaat was dict 2015-01-02: Dataframezonder lijst. Hoe kan ik dit naar beneden in een 100 breken of zo Dataframes aan mijn functie draaien op?

Ook heb ik niet volledig begrijpen hoe af te breken ['STATUSDATE']door het aantal dagen in het bijzonder?

Ik zou naar iteratie vermijden zoveel mogelijk, maar ik weet dat ik waarschijnlijk zal moeten someehere.

Dank je

De vraag is gesteld op 02/12/2019 om 23:52
bron van user
In andere talen...                            


2 antwoorden

stemmen
1

Laten we aannemen dat u een dataframe als volgt uit:

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

Output :

    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

Dus dit dataframe heeft 365 rijen, één voor elke dag van het jaar.

Nu, als u deze gegevens in intervallen van 20 dagen wilt groeperen en elke groep toewijzen aan een DICT, kunt u het volgende doen

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)
antwoordde op 03/12/2019 om 00:17
bron van user

stemmen
1

Hoe zit het met iets als dit. Het creëert een woordenboek van niet lege dataframes ingetoetst op de startdatum van de periode.

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}
antwoordde op 03/12/2019 om 00:24
bron van user

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