x.max()
, x.min()
,x.sum()
,x.mean()
# dask arrays
import dask.array as da
import numpy as np
x = np.ones((1000, 5000))
print(x.sum()) # 500000.0
y = da.ones((1000, 5000), chunks = (500, 1000))
print(y.sum().compute()) # 500000.0
# da로 계산한 과정이 더 빠름
print(type(y)) # <class 'dask.array.core.Array'>
print(type(y.sum().compute())) # <class 'numpy.float64'>
DASK Chunking Array (source : DASK document) |
Numpy vs DASK Array |
import dask.array as da
import da.image
.map_blocks()
사용import dask.array as da
import da.image
img_array = da.image.imread('img/*.png') # lazy 값
# 위의 코드는 전체 이미지를 다 보는 경우
# chunk 이미지만 보는 경우는 아래와 같이 사용함
chunk_func_img = img_array.map_blocks(my_func)
# Convert the color photos to grayscale
grayscale_images = image_array.mean(axis=-1)
# Apply the edge detection function
edge_images = grayscale_images.map_blocks(compute_edges)
# Select the zeroth image and compute its values
sample_image = edge_images[0].compute()
# Show the result
plt.imshow(sample_image, cmap='gray')
plt.show()
import dask.dataframe as dd
.delayed
를 사용하지 않고 효율적인 작업을 가능하게 함
import dask.dataframe as dd
d_df = dd.read_csv('data/*.csv', blocksize = '100mb')
# data 폴더 내의 모든 csv 파일을 lazy하게 읽음
column name(Structure), data type, 그리고 n개의 chunk(npartitions = n)의 결과 확인 가능
(n개의 csv파일이 존재한다는 의미)
파일이 너무 큰 경우 chunk size를 직접 설정
blocksize = ''
한 csv 파일의 용량이 blocksize보다 작으면 해당 csv 파일이 1 partition. 클 경우엔 나눠짐
데이터 프레임 분석 속도를 높이길 원한다면 Parquet을 사용해야 함. 데이터 읽고 쓰는 것이 빨라짐. dd.read_parquet()
, dask_df.to_parquet()
.head()
, .to_csv('file-*.csv')
,.groupby()
, .nlargest(n= , columns =)
, .min()
등의 DataFrame과 동일한 작업이 가능함
Datetime function 사용 가능
-import dask.datetime as dd
-dd.to_datetime(d_df['date'])
-d_df['date'].dt.year
# Convert the release_date column from string to datetime
df['release_date'] = dd.to_datetime(df['release_date'])
# df['release_date'].to_datetime()은 오류남
# Show 5 rows of the DataFrame
print(df.head())
이미지, 음성, 비디오 등의 데이터
Array like data는 다양한 포맷이 존재함
hierarchical data format
하나의 file 내에 multiple dataset이 존재함(한 폴더 안에 다양한 file이 존재하듯이)
python에서는 h5py package
를 사용함
chunk size를 수동으로 지정해주어야 함
import h5py
#open
file = h5py.File('data.hdf5')
# print the available datasets inside the file
print(file.keys())
# 위의 결과를 통해 해당 파일 안에 몇 개의 데이터셋이 있는지 확인할 수 있음
# dictionary 처럼 확인됨
# <KeysViewHDF5 ['alpha', 'beta', 'gamma']>
# select dataset alpha
dataset_1 = file['/alpha']
print(dataset_1)
# data shape 및 type 확인 가능
# <HDF5 dataset 'alpha' : shape (5000, 100, 100), type '<f4'>
# 아직 데이터 load는 안됨
# data chunk size를 지정해주어야 함
import dask.array as da
# load dataset into a dask array
alpha = da.from_array(dataset_1, chunks = (100, 50, 50))
hierarchical dataset
조금 더 현대화된 array, designed to be chunked → chunk size를 자동으로 지정해줌
AWS, Google Cloud와 같은 cloud computing service에 스트리밍하기 좋음
hdf5와는 다르게 해당 파일 structure 확인할 수 있음
hdf5_file = h5py.File('data/esample.hdf5')
exam = da.from_array(hdf5_file['/exam'], chunks = (12, 20, 20))
# Select only the 24 am
hour_24 = exam[0::24]
# Calculate the mean exam on 24 a.m. for each location
hour24_mean = hour_24.mean(axis = 0)
plt.imshow(hour24_mean.compute())
plt.show()
# data.zarr file, weather dataset
weather_ = da.from_zarr('data.zarr', component = 'weather')
# To see the chunk sizes
print(weather_)
# dask.array<from-zarr, shape = (1000, 100, 100), dtype = float32, chunksize = (100, 20, 20), chunktype = numpy.ndarray>
# Find the min
low_mean = weather_.min().mean()
low_mean_value = low_mean.compute()
print(low_mean_value)
# xr open
import xarray as xr
ds = xr.open_zarr('data.zarr')
print(ds)
# xr 생성
def rand_time(start = '2022-01-01', end = '2022-05-10', number=1):
time_list = []
current = datetime.datetime.strptime(start, "%Y-%m-%d")
while current < datetime.datetime.strptime(end, "%Y-%m-%d"):
current += datetime.timedelta(days = number)
time_list.append(current)
return time_list
rand_time('2022-01-01', '2022-05-10', number=1)
xarray_1 = xr.Dataset(
{'weather' : (('lat', 'lon', 'time_'), np.random.rand(1000, 1000, 100)),
'temp' : (('lat', 'lon', 'time_'), np.random.rand(1000, 1000, 100))},
coords = {
'lat': list(np.random.rand(1000)),
'lon': list(np.random.rand(1000)),
'time_': rand_time('2022-01-01', '2022-04-11', number=1)
},
)
print(xarray_1)
# variable : data_array(2개 존재 _ weather, temp)
# variable 안에는 3개의 coordinates _lat, lon, time_ 이 존재 (multi index 정보)
xarray_1.to_zarr('test3.zarr')
import dask.array as da
xarray_1_read = da.from_zarr('test3.zarr', component='weather')
xarray_1_read
- data variable: data of interest
- coordinate: label to describe the data of interest
i.e. latitude, longitude, time : coordinates // temperature : data variable
DataFrame | DataSet |
---|---|
df.loc['2022-01-01'] | ds.sel(time = '2022-01-01') |
df.iloc[0] | ds.isel(time = 0) |
df['column0'] | ds['variable0'] |
df.mean() | ds.mean() ds.mean(dim = ('dim0', 'dim1')) |
df.rolling(10).mean() | x = ds.rolling(dim1=10).mean() x.compute() |
ds['variable0'].plot()
fig, (ax1, ax2) = plt.subplots(1,2, figsize=(8, 5))
# Plot ax1
ds_sel['weather'].plot(ax = ax1)
# Plot x
x.plot(col='month', col_wrap=4, add_colorbar=False)
# col_wrap 한 줄에 몇 개의 그래프를 그릴 것인가
plt.show()