{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"![tcs_1x](https://user-images.githubusercontent.com/50532530/121583499-f6fcfe80-ca4d-11eb-875f-c79d63fca3b5.jpeg)","metadata":{"_uuid":"4db0fc7f-bd05-48f2-bbb2-a5ea5f81169f","_cell_guid":"14b1b4cf-4a42-46ae-aff2-e1514d4deebe","id":"2dt7oG43VAqc","jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"import numpy as np\nimport librosa as lb\nimport librosa.display as lbd\nimport soundfile as sf\nfrom  soundfile import SoundFile\nimport pandas as pd\nfrom  IPython.display import Audio\nfrom pathlib import Path\n\nfrom matplotlib import pyplot as plt\n\nfrom tqdm.notebook import tqdm\nimport joblib, json\n\nfrom  sklearn.model_selection  import StratifiedKFold","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PART_ID = 0 # The start index in the below list, by changing it you will compute mels on another subset\nPART_INDEXES = [0,15718, 31436, 47154, 62874] # The train_set is splitted into 4 subsets","metadata":{"_uuid":"702f48af-9224-41b2-a759-397d35e63b0c","_cell_guid":"fa643fca-fe5d-484b-9183-08411b2b681e","collapsed":false,"id":"fJB9IS2RVAqe","jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T20:58:57.904662Z","iopub.execute_input":"2021-05-30T20:58:57.904993Z","iopub.status.idle":"2021-05-30T20:58:57.915405Z","shell.execute_reply.started":"2021-05-30T20:58:57.904959Z","shell.execute_reply":"2021-05-30T20:58:57.914345Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SR = 32_000\nDURATION = 7 \nSEED = 666\n\nDATA_ROOT = Path(\"../input/birdclef-2021\")\nTRAIN_AUDIO_ROOT = Path(\"../input/birdclef-2021/train_short_audio\")\nTRAIN_AUDIO_IMAGES_SAVE_ROOT = Path(\"audio_images\") # Where to save the mels images\nTRAIN_AUDIO_IMAGES_SAVE_ROOT.mkdir(exist_ok=True, parents=True)","metadata":{"_uuid":"6a9e2696-783c-412b-ba8e-90a867ef9569","_cell_guid":"87b66f91-d914-4740-8891-87408d117095","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T20:58:57.917042Z","iopub.execute_input":"2021-05-30T20:58:57.917291Z","iopub.status.idle":"2021-05-30T20:58:57.926895Z","shell.execute_reply.started":"2021-05-30T20:58:57.917267Z","shell.execute_reply":"2021-05-30T20:58:57.925976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_audio_info(filepath):\n    \"\"\"Get some properties from  an audio file\"\"\"\n    with SoundFile(filepath) as f:\n        sr = f.samplerate\n        frames = f.frames\n        duration = float(frames)/sr\n    return {\"frames\": frames, \"sr\": sr, \"duration\": duration}","metadata":{"_uuid":"31f916c2-b7aa-4ba1-9393-e917d7862744","_cell_guid":"a05a1be7-0948-4a2d-bcdc-0c4a08b21e84","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T20:58:57.928647Z","iopub.execute_input":"2021-05-30T20:58:57.929157Z","iopub.status.idle":"2021-05-30T20:58:57.939503Z","shell.execute_reply.started":"2021-05-30T20:58:57.929115Z","shell.execute_reply":"2021-05-30T20:58:57.938422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PART_ID+1","metadata":{"execution":{"iopub.status.busy":"2021-05-30T20:58:58.079084Z","iopub.execute_input":"2021-05-30T20:58:58.079436Z","iopub.status.idle":"2021-05-30T20:58:58.085211Z","shell.execute_reply.started":"2021-05-30T20:58:58.07941Z","shell.execute_reply":"2021-05-30T20:58:58.084216Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_df(n_splits=5, seed=SEED, nrows=None):\n    \n    df = pd.read_csv(DATA_ROOT/\"train_metadata.csv\", nrows=nrows)\n\n    LABEL_IDS = {label: label_id for label_id,label in enumerate(sorted(df[\"primary_label\"].unique()))}\n    \n    df = df.iloc[0:15718]\n\n    df[\"label_id\"] = df[\"primary_label\"].map(LABEL_IDS)\n\n    df[\"filepath\"] =[str(TRAIN_AUDIO_ROOT/primary_label/filename) for primary_label,filename in zip(df.primary_label, df.filename) ]\n\n    pool = joblib.Parallel(4)\n    mapper = joblib.delayed(get_audio_info)\n    tasks = [mapper(filepath) for filepath in df.filepath]\n\n    df = pd.concat([df, pd.DataFrame(pool(tqdm(tasks)))], axis=1, sort=False)\n    \n    skf = StratifiedKFold(n_splits=n_splits, random_state=seed, shuffle=True)\n    splits = skf.split(np.arange(len(df)), y=df.label_id.values)\n    df[\"fold\"] = -1\n\n    for fold, (train_set, val_set) in enumerate(splits):\n        \n        df.loc[df.index[val_set], \"fold\"] = fold\n\n    return LABEL_IDS, df","metadata":{"_uuid":"32175932-bfb4-42bf-823c-dd8ebef5878a","_cell_guid":"17d4dd7e-9a07-4138-832b-20015ab64b03","collapsed":false,"id":"Kmh6xx5_NCjJ","outputId":"ad61f09f-6f0e-4204-c658-21112e051785","jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T20:58:58.086671Z","iopub.execute_input":"2021-05-30T20:58:58.086969Z","iopub.status.idle":"2021-05-30T20:58:58.099081Z","shell.execute_reply.started":"2021-05-30T20:58:58.086927Z","shell.execute_reply":"2021-05-30T20:58:58.098017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_,df2 = make_df(nrows=None)","metadata":{"_uuid":"cad0cef6-62b0-4001-b4f6-e14a32fb24a6","_cell_guid":"284d2f77-f4b4-4726-a14d-be0033bb2954","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T20:58:58.101288Z","iopub.execute_input":"2021-05-30T20:58:58.101681Z","iopub.status.idle":"2021-05-30T20:59:25.233926Z","shell.execute_reply.started":"2021-05-30T20:58:58.101642Z","shell.execute_reply":"2021-05-30T20:59:25.23316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df=pd.read_csv(\"../input/train-meta-2/gandfaatgaya.csv\")\ndf=df[0:15718]","metadata":{"execution":{"iopub.status.busy":"2021-05-30T20:59:25.235378Z","iopub.execute_input":"2021-05-30T20:59:25.235861Z","iopub.status.idle":"2021-05-30T20:59:26.206523Z","shell.execute_reply.started":"2021-05-30T20:59:25.235829Z","shell.execute_reply":"2021-05-30T20:59:26.205433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2['Cluster_point']=df['Cluster_point']\ndf=df2\npath1='../input/240255-noise-signal/noise1'\npath2='../input/3060-signal-noise/noise1'\npath3='../input/120135signalandnoise/noise1'\npath4='../input/135150signalandnoise/noise1'\npath5='../input/150180-signal-and-noise/noise1'\npath6='../input/180210-signal-and-noise/noise1'\npath7='../input/210240signalandnoise/noise1'\npath8='../input/255270noisesignal/noise1'\npath9='../input/270300-signal-and-noise/noise1'\npath10='../input/300330-signal-and-noise/noise1'\npath11='../input/360397signalandnoise/noise1'\npath12='../input/6090-signal-and-noise/noise1'\npath13='../input/90120-signal-noise/noise1'\npath14='../input/signals-and-noise-part-1/noise1'\npath15='../input/330345signalandnoise/noise1'\npath16='../input/345360signalandnoise/noise1'\n\nnoise=[]\n\npaths=[path1,path2,path3,path4,path5,path6,path7,path8,path9,path10,path11,path12,path13,path14,path15,path16]\n\nfor j in range(len(df)):\n    c=0\n    for path in paths:\n        for i in os.listdir(path):\n            #print(df['primary_label'][j])\n            if(df['primary_label'][j]==i):\n                #print(os.listdir(path+'/'+i))\n                for x in os.listdir(path+'/'+i):\n                    if(df['filename'][j][:-4]==x[:-4]):\n                        noise.append(path+'/'+i+'/'+x)\n                        #print('ok2')\n                        c=1\n                        break\n            if(c==1):\n                break\n        if(c==1):\n            break\n\ndf['noise filepath'] = noise\n\nnoise_cluster=[]\nfor i in df['Cluster_point'].unique():\n    noise_cluster.append(df['noise filepath'][np.where(df['Cluster_point']==i)[0]])\n\nnoise_cluster_final=[]\nfor i in df['Cluster_point']:\n    noise_cluster_final.append(noise_cluster[i])\n    \ndf['final_noise']=noise_cluster_final","metadata":{"execution":{"iopub.status.busy":"2021-05-30T20:59:26.20787Z","iopub.execute_input":"2021-05-30T20:59:26.208173Z","iopub.status.idle":"2021-05-30T21:01:05.882258Z","shell.execute_reply.started":"2021-05-30T20:59:26.208144Z","shell.execute_reply":"2021-05-30T21:01:05.881274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(noise)","metadata":{"execution":{"iopub.status.busy":"2021-05-30T21:01:05.883452Z","iopub.execute_input":"2021-05-30T21:01:05.883697Z","iopub.status.idle":"2021-05-30T21:01:05.889498Z","shell.execute_reply.started":"2021-05-30T21:01:05.883673Z","shell.execute_reply":"2021-05-30T21:01:05.888552Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-30T21:01:05.890634Z","iopub.execute_input":"2021-05-30T21:01:05.890994Z","iopub.status.idle":"2021-05-30T21:01:05.937286Z","shell.execute_reply.started":"2021-05-30T21:01:05.89094Z","shell.execute_reply":"2021-05-30T21:01:05.936205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MelSpecComputer:\n    def __init__(self, sr, n_mels, fmin, fmax, **kwargs):\n        self.sr = sr\n        self.n_mels = n_mels\n        self.fmin = fmin\n        self.fmax = fmax\n        kwargs[\"n_fft\"] = kwargs.get(\"n_fft\", self.sr//10)\n        kwargs[\"hop_length\"] = kwargs.get(\"hop_length\", self.sr//(10*4))\n        self.kwargs = kwargs\n\n    def __call__(self, y):\n\n        melspec = lb.feature.melspectrogram(\n            y, sr=self.sr, n_mels=self.n_mels, fmin=self.fmin, fmax=self.fmax, **self.kwargs,\n        )\n\n        melspec = lb.power_to_db(melspec).astype(np.float32)\n        return melspec","metadata":{"_uuid":"ad6c6c32-4aaf-4677-a012-eec5d3c36161","_cell_guid":"83d4d6f9-72df-4305-9fe7-cd23e1263c6c","collapsed":false,"id":"7NZq43qTVAqi","jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:05.938503Z","iopub.execute_input":"2021-05-30T21:01:05.938775Z","iopub.status.idle":"2021-05-30T21:01:05.947815Z","shell.execute_reply.started":"2021-05-30T21:01:05.93875Z","shell.execute_reply":"2021-05-30T21:01:05.946795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mono_to_color(X, eps=1e-6, mean=None, std=None):\n    mean = mean or X.mean()\n    std = std or X.std()\n    X = (X - mean) / (std + eps)\n    \n    _min, _max = X.min(), X.max()\n\n    if (_max - _min) > eps:\n        V = np.clip(X, _min, _max)\n        V = 255 * (V - _min) / (_max - _min)\n        V = V.astype(np.uint8)\n    else:\n        V = np.zeros_like(X, dtype=np.uint8)\n\n    return V\n\ndef crop_or_pad(y, length, is_train=True, start=None):\n    if len(y) < length:\n        y = np.concatenate([y, np.zeros(length - len(y))])\n        \n        n_repeats = length // len(y)\n        epsilon = length % len(y)\n        \n        y = np.concatenate([y]*n_repeats + [y[:epsilon]])\n        \n    elif len(y) > length:\n        if not is_train:\n            start = start or 0\n        else:\n            start = start or np.random.randint(len(y) - length)\n\n        y = y[start:start + length]\n\n    return y","metadata":{"_uuid":"7133d8a5-a88b-4fbe-a69c-574be6c98ec8","_cell_guid":"fe0f9f95-eb60-4024-99b2-8f01e2d05ae1","collapsed":false,"id":"-Nlw4E5UVAqi","jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:05.949919Z","iopub.execute_input":"2021-05-30T21:01:05.950207Z","iopub.status.idle":"2021-05-30T21:01:05.965336Z","shell.execute_reply.started":"2021-05-30T21:01:05.950179Z","shell.execute_reply":"2021-05-30T21:01:05.964393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AudioToImage:\n    def __init__(self, sr=SR, n_mels=128, fmin=0, fmax=None, duration=DURATION, step=None, res_type=\"kaiser_fast\", resample=True):\n\n        self.sr = sr\n        self.n_mels = n_mels\n        self.fmin = fmin\n        self.fmax = fmax or self.sr//2\n\n        self.duration = duration\n        self.audio_length = self.duration*self.sr\n        self.step = step or self.audio_length\n        \n        self.res_type = res_type\n        self.resample = resample\n\n        self.mel_spec_computer = MelSpecComputer(sr=self.sr, n_mels=self.n_mels, fmin=self.fmin,\n                                                 fmax=self.fmax)\n        \n    def audio_to_image(self, audio,row):\n        \n        audio=add_noise(audio,row.final_noise)\n        melspec = self.mel_spec_computer(audio)\n        #melspec=signal_noise_ratio(melspec)\n        image = mono_to_color(melspec)\n#         image = normalize(image, mean=None, std=None)\n        return image\n\n    def __call__(self, row, save=True):\n#       max_audio_duration = 10*self.duration\n#       init_audio_length = max_audio_duration*row.sr\n        \n#       start = 0 if row.duration <  max_audio_duration else np.random.randint(row.frames - init_audio_length)\n    \n      audio, orig_sr = sf.read(row.filepath, dtype=\"float32\")\n      #audio,_=signal_noise_split(audio)\n      if self.resample and orig_sr != self.sr:\n        audio = lb.resample(audio, orig_sr, self.sr, res_type=self.res_type)\n        \n      audios = [audio[i:i+self.audio_length] for i in range(0, max(1, len(audio) - self.audio_length + 1), self.step)]\n      audios[-1] = crop_or_pad(audios[-1] , length=self.audio_length)\n      images = [self.audio_to_image(audio,row) for audio in audios]\n      images = np.stack(images)\n        \n      if save:\n        path = TRAIN_AUDIO_IMAGES_SAVE_ROOT/f\"{row.primary_label}/{row.filename}.npy\"\n        path.parent.mkdir(exist_ok=True, parents=True)\n        np.save(str(path), images)\n      else:\n        return  row.filename, images","metadata":{"_uuid":"d3406343-04b7-4668-a510-6fa8c599b8ad","_cell_guid":"5b7e1347-12fe-43b2-9286-9ecb5b36e060","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:05.96676Z","iopub.execute_input":"2021-05-30T21:01:05.967022Z","iopub.status.idle":"2021-05-30T21:01:05.979194Z","shell.execute_reply.started":"2021-05-30T21:01:05.966997Z","shell.execute_reply":"2021-05-30T21:01:05.978143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os","metadata":{"_uuid":"09f9fc8f-c24c-4bdc-b6ba-9e49eb255a76","_cell_guid":"cba162d0-a012-4ce4-ab7b-90f2bb0d0904","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:05.980336Z","iopub.execute_input":"2021-05-30T21:01:05.980618Z","iopub.status.idle":"2021-05-30T21:01:05.996177Z","shell.execute_reply.started":"2021-05-30T21:01:05.980591Z","shell.execute_reply":"2021-05-30T21:01:05.995427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dur_frame = 7\nlen_frame = dur_frame * SR\nn_frame = len_frame // 512 + 1\nimport cv2","metadata":{"_uuid":"9b6aece5-b63e-4f73-808a-22090dae382b","_cell_guid":"5fab348c-a978-40be-be1e-0240444093b0","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:05.997068Z","iopub.execute_input":"2021-05-30T21:01:05.997359Z","iopub.status.idle":"2021-05-30T21:01:06.009679Z","shell.execute_reply.started":"2021-05-30T21:01:05.997332Z","shell.execute_reply":"2021-05-30T21:01:06.008522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from librosa.core import spectrum\nfrom scipy.ndimage.morphology import binary_dilation, binary_erosion\ndef signal_noise_split(audio):\n    S, _ = spectrum._spectrogram(y=audio, power=1.0, n_fft=2048, hop_length=512, win_length=2048)\n\n    col_median = np.median(S, axis=0, keepdims=True)\n    row_median = np.median(S, axis=1, keepdims=True)\n    S[S < row_median * 3] = 0.0\n    S[S < col_median * 3] = 0.0\n    S[S > 0] = 1\n\n    S = binary_erosion(S, structure=np.ones((4, 4)))\n    S = binary_dilation(S, structure=np.ones((4, 4)))\n\n    indicator = S.any(axis=0)\n    indicator = binary_dilation(indicator, structure=np.ones(4), iterations=2)\n\n    mask = np.repeat(indicator, 512)\n    mask = binary_dilation(mask, structure=np.ones(2048 - 512), origin=-(2048 -512)//2)\n    mask = mask[:len(audio)]\n    signal = audio[mask]\n    noise = audio[~mask]\n    return signal,noise\ndef add_noise(signal,i,n=4):\n    \n    p_noise = np.random.uniform(0, 1, n)\n    i_noise = np.where(p_noise > 0.5)[0]\n    alpha_noise = np.random.uniform(0, 0.5, n)\n    path_noise = np.random.choice(i, n)\n    for i in i_noise:\n        noise, _ = lb.load(path_noise[i], sr=SR, mono=True, duration=7*32000, res_type='kaiser_fast')\n        len_noise = len(noise)\n        \n        i_start = 0\n        if len_noise < len_frame:\n            i_start = np.random.randint(len_frame - len_noise)\n        print(signal[i_start: i_start + len_noise].shape)\n        print(alpha_noise[i].shape)\n        print(noise.shape)\n        signal[i_start: i_start + len_noise] += noise[:signal[i_start: i_start + len_noise].shape[0]] * alpha_noise[i]\n    return signal\ndef signal_noise_ratio(spec):\n      spec = spec.copy()\n\n      col_median = np.median(spec, axis=0, keepdims=True)\n      row_median = np.median(spec, axis=1, keepdims=True)\n\n      spec[spec < row_median * 1.25] = 0.0\n      spec[spec < col_median * 1.15] = 0.0\n      spec[spec > 0] = 1.0\n\n      spec = cv2.medianBlur(spec, 3)\n      spec = cv2.morphologyEx(spec, cv2.MORPH_CLOSE, np.ones((3, 3), np.float32))\n\n      spec_sum = spec.sum()\n      try:\n          snr = spec_sum / (spec.shape[0] * spec.shape[1] * spec.shape[2])\n      except:\n          snr = spec_sum / (spec.shape[0] * spec.shape[1])\n\n      return snr","metadata":{"_uuid":"d4895362-750c-4bea-9e0b-ea0978c8f87c","_cell_guid":"36622ed3-67b9-4874-9f62-178ac30cd3a6","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:06.01086Z","iopub.execute_input":"2021-05-30T21:01:06.011162Z","iopub.status.idle":"2021-05-30T21:01:06.028128Z","shell.execute_reply.started":"2021-05-30T21:01:06.011132Z","shell.execute_reply":"2021-05-30T21:01:06.027062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_audios_as_images(df):\n    pool = joblib.Parallel(2)\n    \n    converter = AudioToImage(step=int(DURATION*0.666*SR))\n    mapper = joblib.delayed(converter)\n    tasks = [mapper(row) for row in df.itertuples(False)]\n    \n    pool(tqdm(tasks))","metadata":{"_uuid":"7203cecc-e6eb-4ae5-9b1c-a40581f3bcd2","_cell_guid":"002567e0-4f44-4356-9b2c-e983816d7445","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:06.029311Z","iopub.execute_input":"2021-05-30T21:01:06.029601Z","iopub.status.idle":"2021-05-30T21:01:06.045759Z","shell.execute_reply.started":"2021-05-30T21:01:06.029574Z","shell.execute_reply":"2021-05-30T21:01:06.044709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"int(DURATION)","metadata":{"execution":{"iopub.status.busy":"2021-05-30T21:01:06.047041Z","iopub.execute_input":"2021-05-30T21:01:06.047301Z","iopub.status.idle":"2021-05-30T21:01:06.057896Z","shell.execute_reply.started":"2021-05-30T21:01:06.047276Z","shell.execute_reply":"2021-05-30T21:01:06.056936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_audios_as_images(df)","metadata":{"_uuid":"41db7257-1f8e-46d4-8f13-c469c32b964e","_cell_guid":"07efcc71-2680-4f1c-9bb3-0eca8c10e849","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-05-30T21:01:06.05923Z","iopub.execute_input":"2021-05-30T21:01:06.059498Z","iopub.status.idle":"2021-05-30T21:08:38.308862Z","shell.execute_reply.started":"2021-05-30T21:01:06.059473Z","shell.execute_reply":"2021-05-30T21:08:38.305819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"_uuid":"32210880-7d12-443a-bda9-042950ef2a49","_cell_guid":"b03d3ead-9cee-42b3-945a-8dd46c40d5c2","collapsed":false,"jupyter":{"outputs_hidden":false},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"_uuid":"43dd48ff-6777-405e-8004-f9512bca74d3","_cell_guid":"dda84afe-5ce5-492b-8b4a-73ca73f6a6fc","collapsed":false,"jupyter":{"outputs_hidden":false},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"_uuid":"0310b3ed-018d-4351-94dd-5e3dd7d79d91","_cell_guid":"a1d361d9-ab95-4bd8-b686-1643a7c552b1","collapsed":false,"jupyter":{"outputs_hidden":false},"trusted":true},"execution_count":null,"outputs":[]}]}