Mam codzienną serię czasu zamknięcia cen instrumentu finansowego wracając do 1990 roku.

Próbuję porównać codzienną zmianę procentową dla każdego dnia obrotu z poprzednich lat do tego dnia handlowego w 2019 r. W tym czasie mam 41 dni handlowych danych na 2019 roku.

Dostaję tak daleko, że filtrowanie i tworzę nową dataframe z zaledwie pierwsze 41 dat, zamknięcie cen, codziennych zmian procentowych oraz "Dnia handlowego Roku" ("TDOY") Klasyfikator dla każdego dnia w zestawie, ale nie jestem mieć szczęście.

Znalazłem inne pytania o przepełnienie stosu, które pomagają ludziom porównać datetime dni, tygodnie, lat itp. Ale nie jestem w stanie odtworzyć tego ze względu na dowolną wartość "TDOY" reprezentuje.

Nie będę zawracać sobie głowy tworzeniem przykładowej dataframe ze względu na liczbę wierszy, więc powiązałem CSV, z którą wymyśliłem do tego punktu: Przykład CSV.

Myślę, że najłatwiejsze podejście po prostu będzie stworzyć nową kolumnę, która zwraca, co wchodząca zmiana procentowa 2019 jest dla każdego odpowiedniego "TDOY" (dzień handlowy rocznie) przy użyciu df.loc, a jeśli mógłbym zrozumieć to wiele Następnie utwórz jeszcze jedną kolumnę, aby wykonać prostą różnicę między rokiem rocznika / dzień zmienić odpowiednią wartość 2019. Poniżej znajduje się, co próbuję użyć (i próbowałem innych wariantów) bezskutecznie. df['2019'] = df['perc'].loc[((df.year == 2019) & (df.tdoy == df.tdoy))]

Próbowałem wyszukać stos i Google w prawdopodobnie 20 różnych odmianach mojego problemu i nie można znaleźć odpowiedzi, która pasuje do mojego problemu arbitralnego "handlowego dnia roku" klasyfikacji.

Jestem pewien, że odpowiedź jest taka przed moją twarzą gdzieś, ale wciąż jestem nowa do wymiany danych.

0
serranzau 28 luty 2019, 21:17

2 odpowiedzi

Najlepsza odpowiedź

Pierwszym krokiem jest prawidłowe importowanie CSV. Nie jestem pewien, czy dokonałeś regulacji, ale kolumna daty danych jest obiektem ciągowym.

# import the csv and assign to df. parse dates to datetime
df = pd.read_csv('TimeSeriesEx.csv', parse_dates=['Dates'])

# filter the dataframe so that you only have 2019 and 2018 data
df=df[df['year'] >= 2018]
df.tail()

    Unnamed: 0  Dates       last    perc        year    tdoy
1225    7601    2019-02-20  29.96   0.007397    2019    37
1226    7602    2019-02-21  30.49   0.017690    2019    38
1227    7603    2019-02-22  30.51   0.000656    2019    39
1228    7604    2019-02-25  30.36   -0.004916   2019    40
1229    7605    2019-02-26  30.03   -0.010870   2019    41

Umieść TDOY i rok w multiinindex.

# create a multiindex
df.set_index(['tdoy','year'], inplace=True)

df.tail()

                    Dates       last    perc
tdoy    year                
37  2019    7601    2019-02-20  29.96   0.007397
38  2019    7602    2019-02-21  30.49   0.017690
39  2019    7603    2019-02-22  30.51   0.000656
40  2019    7604    2019-02-25  30.36   -0.004916
41  2019    7605    2019-02-26  30.03   -0.010870

Zrobić stół obrotowy

# make a pivot table and assign it to a variable
df1 = df.pivot_table(values='last', index='tdoy', columns='year')

df1.head()

year 2018   2019
tdoy        
1   33.08   27.55
2   33.38   27.90
3   33.76   28.18
4   33.74   28.41
5   33.65   28.26

Utwórz obliczoną kolumnę

# create the new column
df1['pct_change'] = (df1[2019]-df1[2018])/df1[2018]

df1

year 2018   2019    pct_change
tdoy            
1   33.08   27.55   -0.167170
2   33.38   27.90   -0.164170
3   33.76   28.18   -0.165284
4   33.74   28.41   -0.157973
5   33.65   28.26   -0.160178
6   33.43   28.18   -0.157045
7   33.55   28.32   -0.155887
8   33.29   27.94   -0.160709
9   32.97   28.17   -0.145587
10  32.93   28.11   -0.146371
11  32.93   28.24   -0.142423
12  32.79   28.23   -0.139067
13  32.51   28.77   -0.115042
14  32.23   29.01   -0.099907
15  32.28   29.01   -0.101301
16  32.16   29.06   -0.096393
17  32.52   29.38   -0.096556
18  32.68   29.51   -0.097001
19  32.50   30.03   -0.076000
20  32.79   30.30   -0.075938
21  32.87   30.11   -0.083967
22  33.08   30.42   -0.080411
23  33.07   30.17   -0.087693
24  32.90   29.89   -0.091489
25  32.51   30.13   -0.073208
26  32.50   30.38   -0.065231
27  33.16   30.90   -0.068154
28  32.56   30.81   -0.053747
29  32.21   30.87   -0.041602
30  31.96   30.24   -0.053817
31  31.85   30.33   -0.047724
32  31.57   29.99   -0.050048
33  31.80   29.89   -0.060063
34  31.70   29.95   -0.055205
35  31.54   29.95   -0.050412
36  31.54   29.74   -0.057070
37  31.86   29.96   -0.059636
38  32.07   30.49   -0.049267
39  32.04   30.51   -0.047753
40  32.36   30.36   -0.061805
41  32.62   30.03   -0.079399

W sumie bez komentarzy i danych, kody wyglądają:

df = pd.read_csv('TimeSeriesEx.csv', parse_dates=['Dates'])
df=df[df['year'] >= 2018]
df.set_index(['tdoy','year'], inplace=True)
df1 = df.pivot_table(values='last', index='tdoy', columns='year')
df1['pct_change'] = (df1[2019]-df1[2018])/df1[2018]

[Edytuj] Plakat Prośba o wszystkie daty w porównaniu z 2019 r.

df = pd.read_csv('TimeSeriesEx.csv', parse_dates=['Dates'])
df.set_index(['tdoy','year'], inplace=True)

Ignoruj filtr rok powyżej, utwórz tabelę obrotową

df1 = df.pivot_table(values='last', index='tdoy', columns='year')

Utwórz pętlę przechodząc przez lata / kolumny i utwórz nowe pole na każdy rok w porównaniu do 2019 roku.

for y in df1.columns:    
    df1[str(y) + '_pct_change'] = (df1[2019]-df1[y])/df1[y]

Aby wyświetlić niektóre dane ...

df1.loc[1:4, "1990_pct_change":"1994_pct_change"]

year    1990_pct_change 1991_pct_change 1992_pct_change 1993_pct_change 1994_pct_change
tdoy                    
1       0.494845        0.328351        0.489189        0.345872    -0.069257
2       0.496781        0.364971        0.516304        0.361640    -0.045828
3       0.523243        0.382050        0.527371        0.369956    -0.035262
4       0.524960        0.400888        0.531536        0.367838    -0.034659

Ostateczny kod przez cały rok:

df = pd.read_csv('TimeSeriesEx.csv', parse_dates=['Dates'])
df.set_index(['tdoy','year'], inplace=True)
df1 = df.pivot_table(values='last', index='tdoy', columns='year')
for y in df1.columns:    
    df1[str(y) + '_pct_change'] = (df1[2019]-df1[y])/df1[y]

df1
0
run-out 28 luty 2019, 19:37

Wymyśliłem też moją własną odpowiedź bardziej wzdłuż linii tego, co próbowałem pierwotnie osiągnąć. Dataframe będę pracować z przykładem. df:

Dates last perc year tdoy 0 2016-01-04 29.93 -0.020295 2016 2 1 2016-01-05 29.63 -0.010023 2016 3 2 2016-01-06 29.59 -0.001350 2016 4 3 2016-01-07 29.44 -0.005069 2016 5 4 2017-01-03 34.57 0.004358 2017 2 5 2017-01-04 34.98 0.011860 2017 3 6 2017-01-05 35.00 0.000572 2017 4 7 2017-01-06 34.77 -0.006571 2017 5 8 2018-01-02 33.38 0.009069 2018 2 9 2018-01-03 33.76 0.011384 2018 3 10 2018-01-04 33.74 -0.000592 2018 4 11 2018-01-05 33.65 -0.002667 2018 5 12 2019-01-02 27.90 0.012704 2019 2 13 2019-01-03 28.18 0.010036 2019 3 14 2019-01-04 28.41 0.008162 2019 4 15 2019-01-07 28.26 -0.005280 2019 5

Stworzyłem dataframe z tylko wartościami 2019 dla tdoy i perc

df19 = df[['tdoy','perc']].loc[df['year'] == 2019]

A następnie zapinać się na słownik tych wartości perc19 = dict(zip(df19.tdoy,df19.perc))

Skończyć

perc19= {2: 0.012704174228675058, 3: 0.010035842293906852, 4: 0.008161816891412365, 5: -0.005279831045406497}

Następnie mapuj te klawisze za pomocą kolumny tdoy w oryginalnym dataframe, aby utworzyć kolumnę zatytułowaną {X1}}, która ma odpowiednią wartość zmian w 2019 roku dla tego dnia handlowego

df['2019'] = df['tdoy'].map(perc19)

A następnie utworzyć kolumnę vs2019, gdzie znajduję różnicę 2019 vs. perc i plon

Dates last perc year tdoy 2019 vs2019 0 2016-01-04 29.93 -0.020295 2016 2 0.012704 6.746876 1 2016-01-05 29.63 -0.010023 2016 3 0.010036 3.995038 2 2016-01-06 29.59 -0.001350 2016 4 0.008162 1.358162 3 2016-01-07 29.44 -0.005069 2016 5 -0.005280 0.001590 4 2017-01-03 34.57 0.004358 2017 2 0.012704 0.431608 5 2017-01-04 34.98 0.011860 2017 3 0.010036 0.033038 6 2017-01-05 35.00 0.000572 2017 4 0.008162 0.864802 7 2017-01-06 34.77 -0.006571 2017 5 -0.005280 0.059843 8 2018-01-02 33.38 0.009069 2018 2 0.012704 0.081880 9 2018-01-03 33.76 0.011384 2018 3 0.010036 0.018047 10 2018-01-04 33.74 -0.000592 2018 4 0.008162 1.150436

Stąd mogę groupby na różne sposoby i dalej obliczyć, aby znaleźć najbardziej podobne zmiany procentowe w porównaniu z rokiem, w którym porównuję się z (2019).

0
serranzau 28 luty 2019, 20:38