"""
# starterでよく見かけるdef文やfor文を使えるようになりたいので自主トレでノック受けます。
"""
"""
おそらく独学でやられている方は同じように苦手意識あるかもしれませんので、コードシェアさせて頂きます。
"""
import os
from typing import List

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD

from gensim.models import Word2Vec

import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from torchvision.io import read_image, ImageReadMode
from torchvision import transforms
import torchvision.models as models

from tqdm import tqdm
train = pd.read_csv('../input/data-science-winter-osaka2/train.csv')
test = pd.read_csv('../input/data-science-winter-osaka2/test.csv')
train.head()
"""
# ★ここから変えてます
"""
"""
Pythonではdef文を用いて関数を定義するそうです。

"""
"""
「　z=x+y 　に　x=3、y=4　を代入します　」　をpythonでまとめて書くと
"""
def z(x,y) -> int:#　zを関数名　x,yを引数と呼ぶ　　※->：アノテーションといい関数の方を記載しておく、たたの注釈だそうです。(無くてもOK）今回は整数なのでintと記載
    return x+y#　答え（zの中身）を戻り値と呼ぶ　def文の中身は頭文字4個分下げる必要があり　

answer = z(3,4)
answer
"""
これだけの内容だとそこまで便利に感じませんが、xやyに入れる数字が複数あるなら作業時間の短縮になりそうですね。
"""
"""
なのでx,yにいろいろな数字を入れた際にfor文使っているようです
"""
answer = []#　for文で計算した結果を保存するための器

for i in range(100):# 0~99までの数字をiに入力
    x=(i)#　ｘ＝0.1.2.3.4・・・を順番に入力　for文も中身は頭文字4個分下げる必要があり
    y=(i*2)#　ｙ＝0.2.4.6.8・・・を順番に入力
    answer.append(z(x,y))#　関数Zにｘ、ｙの値を放り込む　⇒　answerの器に答えを保管　⇒　for文の頭に戻る

answer
answer2 = []#　for文で計算した結果を保存するための器

for i in range(100):# 0~99までの数字をiに入力
    x=(i*3)#　ｘ＝0.1.2.3.4・・・を順番に入力　for文も中身は頭文字4個分下げる必要があり
    y=(i*9)#　ｙ＝0.2.4.6.8・・・を順番に入力
    answer2.append(z(x,y))#　関数Zにｘ、ｙの値を放り込む　⇒　answerの器に答えを保管　⇒　for文の頭に戻る

answer2
"""
def文はfor文と組み合わせて使うと、入力の数が多くなると楽ですね！（仕事の繰り返し作業にも使えそう…）
"""
"""
★★ここかstarterの頭4つ目のコードに戻って中身の確認を行います★★
"""
type(train['popular_tags'][0])#　このカラムの1つ目の値の型は何　⇒　str（文字列）として認識してますよという意味
"""
元々listデータだったのが、csvにしたことで文字列に変換されてしまいました。<br>
元々のデータに戻すために、eval関数を適応していきます。
"""
"""
# ★Starterでも早速def文＋for文が出てきました…
"""
def eval_data(row):#　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　関数の名前をeval_data、引数はrowに設定
    if row == row:#　 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　もし左右が同じなら　⇒（何か値が入っていれば）
        return eval(row)# 　　　　　　　　 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　文字列を式として変換してください(今回はlistやdict）
    else:#　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　その他は(何も入っていなければ）
        return np.nan#　 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　nan(データ無し)を入力

for column in ['popular_tags', 'categories', 'minimum_requirements', 'recommended_requirements']:#　左の4つカラムをを順番にcolumnに放り込む
    train[column] = train[column].apply(eval_data)# 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　applyはdataframeで関数を使えるようにするための関数
    test[column] = test[column].apply(eval_data)#　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　忘れずtestデータにも織り込み
type(train['popular_tags'][0]), type(train['categories'][0]), type(train['minimum_requirements'][0]), type(train['recommended_requirements'][0])
"""
以上でデータが元の形で読み込めました。欠損データを確かめます。
"""
train.info()
train['description'].tolist()[0]
train['user_reviews'].hist()
"""
# ★今度はfor文が単独で出てきました
"""
for i in range(10):#　0～9の数字をiに順番に代入
    img = read_image(os.path.join('../input/data-science-winter-osaka2/train/train', train['img_path'][i]))#　img_pathを0番目～9番目を順番に開く
    print(img.shape)#
    plt.imshow(img.permute(1, 2, 0))#イメージを写す
    plt.show()#　上から順番に写す
"""
体力が尽きたのでここで終わります。4本くらいしかノック受けれてませんね…　<br>
前処理以降のところはハードル上がりますね…　余裕があれば続きの更新頑張ります！
"""
"""
また内容間違っている等あれば、アドバイス頂けると助かります
"""