Pertanyaan mengkonversi data stok harian ke basis mingguan melalui panda dengan Python


Saya punya DataFrame menyimpan data berbasis harian yaitu sebagai berikut:

Date              Open        High         Low       Close   Volume
2010-01-04   38.660000   39.299999   38.509998   39.279999  1293400   
2010-01-05   39.389999   39.520000   39.029999   39.430000  1261400   
2010-01-06   39.549999   40.700001   39.020000   40.250000  1879800   
2010-01-07   40.090000   40.349998   39.910000   40.090000   836400   
2010-01-08   40.139999   40.310001   39.720001   40.290001   654600   
2010-01-11   40.209999   40.520000   40.040001   40.290001   963600   
2010-01-12   40.160000   40.340000   39.279999   39.980000  1012800   
2010-01-13   39.930000   40.669998   39.709999   40.560001  1773400   
2010-01-14   40.490002   40.970001   40.189999   40.520000  1240600   
2010-01-15   40.570000   40.939999   40.099998   40.450001  1244200   

Apa yang saya ingin lakukan adalah menggabungkannya ke dalam data berbasis mingguan. Setelah pengelompokan:

  1. itu Tanggal harus setiap Senin (pada titik ini, skenario liburan harus dipertimbangkan ketika Senin bukan hari perdagangan, kita harus menerapkan hari perdagangan pertama dalam minggu ini sebagai Tanggal).
  2. Buka harus hari Senin (atau hari perdagangan pertama minggu ini) Buka.
  3. Dekat harus hari Jumat (atau hari perdagangan terakhir dalam minggu ini) Tutup.
  4. Tinggi Seharusnya hari-hari perdagangan tertinggi dalam minggu ini.
  5. Rendah harus terendah terendah hari perdagangan dalam minggu ini.
  6. Volumn harus merupakan jumlah dari semua Volume hari perdagangan dalam minggu ini.

yang seharusnya terlihat seperti ini:

Date              Open        High         Low       Close   Volume
2010-01-04   38.660000   40.700001   38.509998   40.290001  5925600   
2010-01-11   40.209999   40.970001   39.279999   40.450001  6234600   

Saat ini, cuplikan kode saya adalah seperti di bawah ini, fungsi apa yang harus saya gunakan untuk memetakan data berbasis harian ke data berbasis mingguan yang diharapkan? Terimakasih banyak!

import pandas_datareader.data as web

start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2016, 12, 31)
f = web.DataReader("MNST", "yahoo", start, end, session=session)
print f

8
2018-01-04 18:56


asal


Jawaban:


Kamu bisa resample, aggregate dan gabungkan seperti ini:

open = f.Open.resample('W-MON', how='last')
close = f.Close.resample('W-FRI', how='last').resample('W-MON', how='last')
high = f.High.resample('W-MON', how='max')
low = f.Low.resample('W-MON', how='min')
vol = f.Volume.resample('W-MON', how='sum')
weekly_data = pd.concat([open, close, high, low, vol], axis=1)

mendapatkan:

pd.concat([open, close, high, low, vol], axis=1)


                  Open       Close        High         Low    Volume
Date                                                                
2010-01-04   38.660000         NaN   39.299999   38.509998   1293400
2010-01-11   40.209999   40.290001   40.700001   39.020000   5595800
2010-01-18   40.570000   40.450001   40.970001   39.279999   5271000
2010-01-25   39.779999   39.630001   41.580002   39.139999   5910000
2010-02-01   38.619999   38.450001   39.840000   38.330002   5772600
2010-02-08   38.900002   38.779999   39.459999   37.830002   5325800
2010-02-15   38.910000   39.230000   39.299999   38.080002   3699800
2010-02-22   40.970001   40.849998   41.119999   38.770000   6095200
2010-03-01   41.810001   41.580002   42.360001   39.450001  14777800
2010-03-08   41.290001   41.410000   42.020000   41.009998  10114200
2010-03-15   42.060001   42.029999   42.650002   40.709999   8768400

6
2018-01-04 19:35



Secara umum, dengan asumsi bahwa Anda memiliki dataframe dalam bentuk yang Anda tentukan, Anda perlu melakukan langkah-langkah berikut:

  1. taruh Date dalam indeks
  2. resample Indeks.

Apa yang Anda miliki adalah kasus penerapan fungsi yang berbeda ke kolom yang berbeda. Lihat.

Anda dapat menampal ulang dengan berbagai cara. untuk misalnya Anda dapat mengambil nilai rata-rata atau menghitung atau seterusnya. memeriksa pandas resample.

Anda juga dapat menerapkan agregator kustom (periksa tautan yang sama). Dengan itu, cuplikan kode untuk kasus Anda dapat diberikan sebagai:

f['Date'] = pd.to_datetime(f['Date'])
f.set_index('Date', inplace=True)
f.sort_index(inplace=True)

def take_first(array_like):
    return array_like[0]

def take_last(array_like):
    return array_like[-1]

output = f.resample('W',                                 # Weekly resample
                    how={'Open': take_first, 
                         'High': 'max',
                         'Low': 'min',
                         'Close': take_last,
                         'Volume': 'sum'}, 
                    loffset=pd.offsets.timedelta(days=-6))  # to put the labels to Monday

output = output[['Open', 'High', 'Low', 'Close', 'Volume']]

Sini, W menandakan resampling mingguan yang secara default mulai dari Senin hingga Minggu. Untuk menjaga labelnya sebagai Senin, loffset digunakan. Ada beberapa penentu hari yang telah ditentukan. Melihat panda offset. Anda bahkan dapat mendefinisikan offset kustom (Lihat).

Kembali ke metode resampling. Disini untuk Open dan Close Anda dapat menentukan metode khusus untuk mengambil nilai pertama atau lebih dan meneruskan fungsi menangani ke how argumen.

Jawaban ini didasarkan pada asumsi bahwa data tampaknya harian, yaitu setiap hari Anda hanya memiliki 1 entri. Juga, tidak ada data yang tersedia untuk hari-hari non-bisnis. yaitu Sat dan Sun. Jadi mengambil titik data terakhir untuk minggu ini sebagai hari Jumat adalah baik-baik saja. Jika Anda mau, Anda dapat menggunakan minggu bisnis, bukan 'W'. Juga, untuk data yang lebih kompleks yang mungkin ingin Anda gunakan groupby untuk mengelompokkan data mingguan dan kemudian bekerja pada indeks waktu di dalamnya.

btw intinya untuk solusinya dapat ditemukan di: https://gist.github.com/prithwi/339f87bf9c3c37bb3188


8
2018-01-04 19:24