Spliting dataframe dans plusieurs images par Dates Python

voix
0

Je comprends très bien il y a quelques versions de cette question là-bas, mais aucun ne semble avoir au cœur de mon problème. J'ai un pandas géants dataframe avec environ 72000 lignes de 2015 à maintenant. J'utilise un calcul qui trouve le plus de mots percutants pour un ensemble donné de texte (tf_idf). Ce calcul ne tient pas compte du temps, donc je dois briser ma principale dataframe en segments temporels, idéalement tous les 15 jours et 30 jours (ou n jours vraiment, pas la semaine / mois), puis exécutez le calcul sur chaque segmentée dataframe afin de voir et tracer ce que les mots viennent de plus en moins au fil du temps.

J'ai pu partie de la construction de cette présente avec les éléments suivants semi-manuelle:

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)

Cela fonctionne - cependant, je dois créer manuellement les 2 dates qui devrait comme je l'ai créé cela comme un test. Comment puis-je diviser la trame de données par incréments et exécutez le calcul pour chaque trame de données?

dictssont prétendument la façon de le faire. J'ai essayé:

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

for frame in dict_of_dfs:
    calcForDateRange(frame)

Le résultat dict était 2015-01-02: Dataframesans cadre. Comment puis - je le décomposer en 100 ou si Dataframes pour exécuter ma fonction sur?

De plus, je ne comprends pas bien comment briser ['STATUSDATE']par le nombre de jours en particulier?

Plût à itérer éviter autant que possible, mais je sais que je devrai probablement someehere.

Je vous remercie

Créé 02/12/2019 à 23:52
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Supposons que vous avez une trame de données comme ceci:

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

sortie :

    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

Donc, ce cadre de données a 365 lignes, une pour chaque jour de l'année.

Maintenant, si vous voulez regrouper ces données dans des intervalles de 20 jours et d'assigner chaque groupe à un dict, vous pouvez faire ce qui suit

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)
Créé 03/12/2019 à 00:17
source utilisateur

voix
1

Que diriez-vous quelque chose comme ça. Il crée un dictionnaire de dataframes non vide calée sur la date de début de la période.

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}
Créé 03/12/2019 à 00:24
source utilisateur

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