{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\n\nfrom typing import List, NoReturn, Union\n\nimport numpy as np\nimport pandas as pd\n\n\nclass Sentinel2TimeSeriesDataframe:\n    \"\"\"This class creates a dataframe containing Sentinel-2 time series\"\"\"\n\n    def __init__(self, directory: str) -> NoReturn:\n        \"\"\"Inits the class providing a directory containing the data.\n        Args:\n            directory (str): Path to the image time series.\n        Returns:\n            NoReturn\n        \"\"\"\n        self.extension = \".png\"\n        self.data_separator = \"_\"\n        self.columns = [\"Path\", \"Time series ID\", \"Image ID\"]\n        self.directory = directory\n        self.dataframe = self.get_dataframe()\n        self.id_list = self.get_time_series_id_list()\n\n    def is_png(self, filename: str) -> bool:\n        return filename.lower().endswith(self.extension)\n\n    def get_path_list(self) -> List[str]:\n        path_list = []\n        for filename in os.listdir(self.directory):\n            if self.is_png(filename):\n                path_list.append(os.path.join(self.directory, filename))\n            else:\n                raise Exception(\"No png file found: {}\".format(filename))\n\n        return path_list\n\n    def create_dataframe(\n        self, data: List[List[Union[str, int]]]\n    ) -> pd.DataFrame:  # noqa: E501\n        dataframe = pd.DataFrame(data=data, columns=self.columns)\n\n        return dataframe\n\n    def split_information(self, path: str) -> List[str]:\n        filename = os.path.basename(path)\n        filename = filename.split(self.extension)[0]\n        information = filename.split(self.data_separator)\n        information = [int(information[-2]), int(information[-1])]\n        information = [path] + information\n\n        return information\n\n    def get_data(self, path_list: List[str]) -> List[List[Union[str, int]]]:\n        data = [self.split_information(path) for path in path_list]\n\n        return data\n\n    def sort_dataframe(self, dataframe: pd.DataFrame) -> pd.DataFrame:\n        dataframe = dataframe.sort_values([self.columns[1], self.columns[2]])\n\n        return dataframe\n\n    def get_dataframe(self) -> pd.DataFrame:\n        path_list = self.get_path_list()\n        data = self.get_data(path_list)\n        dataframe = self.create_dataframe(data)\n        dataframe = self.sort_dataframe(dataframe)\n\n        return dataframe\n\n    def get_time_series_id_list(self) -> List[int]:\n        id_list = self.dataframe[self.columns[1]].unique()\n\n        return id_list\n\n    def get_paths_as_list(self, dataframe) -> List[str]:\n        path_list = dataframe[self.columns[0]].tolist()\n\n        return path_list\n\n    def get_time_series_dataframe(self, time_series_id: int) -> pd.DataFrame:\n        time_series_dataframe = self.dataframe.loc[\n            self.dataframe[self.columns[1]] == time_series_id\n        ]\n\n        return time_series_dataframe\n\n    def get_time_series_paths(self, time_series_id: int) -> List[str]:\n        time_series_dataframe = self.get_time_series_dataframe(time_series_id)\n        path_list = self.get_paths_as_list(time_series_dataframe)\n\n        return path_list\n\n\nclass Sentinel2ImagesDataframe:\n    \"\"\"This class creates a dataframe containing Sentinel-2 images to retrieve\"\"\"\n\n    def __init__(self, directory: str) -> NoReturn:\n        \"\"\"Inits the class providing a directory containing the data.\n        Args:\n            directory (str): Path to the images to be retrieved.\n        Returns:\n            NoReturn\n        \"\"\"\n        self.extension = \".png\"\n        self.columns = [\"Path\"]\n        self.directory = directory\n        self.dataframe = self.get_dataframe()\n        self.id_list = self.create_id_list()\n\n    def is_png(self, filename: str) -> bool:\n        return filename.lower().endswith(self.extension)\n\n    def get_path_list(self) -> List[str]:\n        path_list = []\n        for filename in os.listdir(self.directory):\n            if self.is_png(filename):\n                path_list.append(os.path.join(self.directory, filename))\n            else:\n                raise Exception(\"No png file found: {}\".format(filename))\n\n        return path_list\n\n    def create_dataframe(\n        self, data: List[List[Union[str, int]]]\n    ) -> pd.DataFrame:  # noqa: E501\n        dataframe = pd.DataFrame(data=data, columns=self.columns)\n\n        return dataframe\n\n    def get_dataframe(self) -> pd.DataFrame:\n        data = self.get_path_list()\n        dataframe = self.create_dataframe(data)\n\n        return dataframe\n\n    def create_id_list(self) -> List[int]:\n        id_list = [i for i in range(len(self.dataframe))]\n\n        return id_list\n\n    def get_paths_as_list(self, dataframe) -> List[str]:\n        path_list = dataframe[self.columns[0]].tolist()\n\n        return path_list\n\n    def get_image_dataframe(self, image_id: int) -> pd.DataFrame:\n        image_dataframe = self.dataframe.iloc[[image_id]]\n\n        return image_dataframe\n\n    def get_image_path(self, image_id: int) -> List[str]:\n        image_dataframe = self.get_image_dataframe(image_id)\n        path_list = self.get_paths_as_list(image_dataframe)\n        path_list = path_list[0]\n\n        return path_list","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nfrom skimage import io\nfrom typing import List, NoReturn, Union\nfrom torch.utils.data import Dataset\n\n\nclass TimeSeries(Dataset):\n    \"\"\"Creates a dataset containing the Sentinel-2 time series.\n    Args:\n        Dataset ([PyTorch Dataset])\n    \"\"\"\n\n    def __init__(\n        self,\n        dataframe: Sentinel2TimeSeriesDataframe,\n        transform=None,\n    ) -> NoReturn:\n        \"\"\"Creates a time series dataset.\n        Args:\n            dataframe ([Sentinel2TimeSeriesDataframe]): Dataframe containing the time series information.\n            transform ([type], optional): [description]. Optional transform to be applied.\n        \"\"\"\n        self.dataframe = dataframe\n        self.transform = transform\n\n    def __len__(self) -> int:\n        return len(self.dataframe.id_list)\n\n    def get_time_series(self, path_list: str) -> np.ndarray:\n        time_series = []\n        for path in path_list:\n            image = io.imread(path)\n            time_series.append(image)\n        time_series = np.stack(time_series, axis=3)\n\n        return time_series\n\n    def __getitem__(self, index: int) -> torch.Tensor:\n        index = self.dataframe.id_list[index]\n        time_series_paths = self.dataframe.get_time_series_paths(index)\n        time_series = self.get_time_series(time_series_paths)\n\n        if self.transform:\n            time_series = self.transform(time_series)\n\n        return time_series\n\n\nclass Images(Dataset):\n    \"\"\"Creates a dataset containing the Sentinel-2 images to retrieve.\n    Args:\n        Dataset ([PyTorch Dataset])\n    \"\"\"\n\n    def __init__(\n        self,\n        dataframe: Sentinel2ImagesDataframe,\n        transform=None,\n    ) -> NoReturn:\n        \"\"\"Create an image dataset\n        Args:\n            dataframe ([Sentinel2ImagesDataframe]): Dataframe containing the image information.\n            transform ([type], optional): [description]. Optional transform to be applied.\n        \"\"\"\n        self.dataframe = dataframe\n        self.transform = transform\n\n    def __len__(self) -> int:\n        return len(self.dataframe.id_list)\n\n    def get_image(self, image_path: str) -> np.ndarray:\n        image = io.imread(image_path)\n\n        return image\n\n    def __getitem__(self, index: int) -> np.ndarray:\n        index = self.dataframe.id_list[index]\n        image_path = self.dataframe.get_image_path(index)\n        image = self.get_image(image_path)\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}