2017-10-20 11 views
2

Sagen wir, ich habe ein pd.Series von täglich S & P 500 Werte, und ich möchte diese Serie filtern, um die ersten Geschäftstag zu erhalten und den zugehörigen Wert von jede Woche.Erster Wert jeder Woche in pd.Series/Dataframe

So würde zum Beispiel meine gefilterte Serie den 5. September 2017 enthalten (Dienstag - kein Wert für den Montag), dann 11. September 2017 (Montag).

Source series: 
2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-06 2465.54 
2017-09-07 2465.10 
2017-09-08 2461.43 
2017-09-11 2488.11 
2017-09-12 2496.48 

Filtered series 
2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-11 2488.11 

Meine Lösung besteht derzeit aus:

mask  = SP500.apply(lambda row: SP500[row.name - datetime.timedelta(days=row.name.weekday()):].index[0], axis=1).unique() 
filtered = SP500.loc[mask] 

Dies ist jedoch suboptimal/nicht-pythonic fühlt. Irgendwelche besseren/schnelleren/saubereren Lösungen?

+0

warum '2017-09-01' nicht – Wen

+0

inbegriffen Vielleicht kannst du einen Pandas-Datenrahmen erstellen und groupby verwenden und das erste Element der Woche nehmen? – Michal

+0

@wen ja 01-09-2017 wäre enthalten ja –

Antwort

0

Mit resample auf pd.Series.index.to_series

s[s.index.to_series().resample('W').first()] 

2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-11 2488.11 
dtype: float64 
0

Ich bin nicht sicher, dass die Lösung, die Sie geben, funktioniert, da die App.-Methode für Serien nicht auf den Index zugreifen kann und kein Achsenargument hat. Was Sie gab auf einem Datenrahmen funktionieren würde, aber das ist einfacher, wenn Sie einen Datenrahmen haben:

#Make some fake data 
x = pd.DataFrame(pd.date_range(date(2017, 10, 9), date(2017, 10, 23)), columns = ['date']) 
x['value'] = x.index 
print(x) 
     date value 
0 2017-10-09  0 
1 2017-10-10  1 
2 2017-10-11  2 
3 2017-10-12  3 
4 2017-10-13  4 
5 2017-10-14  5 
6 2017-10-15  6 
7 2017-10-16  7 
8 2017-10-17  8 
9 2017-10-18  9 
10 2017-10-19  10 
11 2017-10-20  11 
12 2017-10-21  12 
13 2017-10-22  13 
14 2017-10-23  14 

#filter 
filtered = x.groupby(x['date'].apply(lambda d: d-timedelta(d.weekday())), as_index = False).first() 
print(filtered) 
     date value 
0 2017-10-09  0 
1 2017-10-16  7 
2 2017-10-23  14 
1
df.sort_index().assign(week=df.index.get_level_values(0).week).drop_duplicates('week',keep='first').drop('week',1) 
Out[774]: 
       price 
2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-11 2488.11