Spliting trama de dados em quadros Múltiplas por datas Python

votos
0

Compreendo perfeitamente existem algumas versões deste perguntas lá fora, mas nenhum parecem ficar no cerne do meu problema. Eu tenho um pandas trama de dados com cerca de 72.000 linhas de 2015 para agora. Eu estou usando um cálculo que se encontra a maioria das palavras impactantes para um determinado conjunto de texto (tf_idf). Este cálculo não leva em conta o tempo, assim que eu preciso para quebrar a minha principal trama de dados em segmentos baseados no tempo, idealmente a cada 15 e 30 dias (ou n dias realmente, não semana / mês), em seguida, executar o cálculo em cada time-segmentado trama de dados a fim de ver e enredo que palavras surgem mais e menos ao longo do tempo.

Eu tenho sido capaz de parte de construção deste isso semi-manualmente com o seguinte:

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)

Isso funciona - no entanto, eu tenho que criar manualmente os 2 datas que se espera como eu criei este como um teste. Como posso dividir a trama de dados em incrementos e executar o cálculo para cada trama de dados?

dictssão supostamente a maneira de fazer isso. Eu tentei:

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

for frame in dict_of_dfs:
    calcForDateRange(frame)

O resultado foi Dict 2015-01-02: Dataframesem moldura. Como posso decompô-lo em um 100 ou assim Dataframes para executar a minha função em?

Além disso, eu não entender completamente como a quebrar ['STATUSDATE']pelo número de dias, especificamente?

Eu gostaria de evitar a iteração, tanto quanto possível, mas eu sei que eu provavelmente terá que someehere.

Obrigado

Publicado 02/12/2019 em 23:52
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Vamos supor que você tem um quadro de dados como este:

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

saída :

    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

Portanto, este quadro de dados tem 365 linhas, uma para cada dia do ano.

Agora, se você deseja agrupar esses dados em intervalos de 20 dias e atribuir a cada grupo para um dicionário, você pode fazer o seguinte

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)
Respondeu 03/12/2019 em 00:17
fonte usuário

votos
1

Que tal algo como isso. Ela cria um dicionário de dataframes não vazios introduzidos na data de início do período.

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}
Respondeu 03/12/2019 em 00:24
fonte usuário

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