import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder,StandardScaler
import re
import xgboost as xgb
import copy

sort_list=['職場の様子',
 '（紹介予定）入社後の雇用形態',
 '勤務地\u3000最寄駅3（駅名）',
 '勤務地固定',
 '休日休暇(月曜日)',
 '応募先\u3000名称',
 '（派遣先）配属先部署\u3000男女比\u3000男',
 '勤務地\u3000最寄駅3（沿線名）',
 '（派遣先）勤務先写真コメント',
 '勤務地\u3000最寄駅3（分）',
 '無期雇用派遣',
 '勤務地\u3000最寄駅2（駅名）',
 '未使用.14',
 '（派遣以外）応募後の流れ',
 '（派遣先）概要\u3000従業員数',
 '電話応対なし',
 '大手企業',
 '（紹介予定）雇用形態備考',
 '週払い',
 '週1日からOK',
 '交通費別途支給',
 '（派遣先）配属先部署\u3000人数',
 '固定残業制 残業代 下限',
 '残業月20時間以上',
 '職種コード',
 '1日7時間以下勤務OK',
 'ミドル（40〜）活躍中',
 'ルーティンワークがメイン',
 '未使用.11',
 '短時間勤務OK(1日4h以内)',
 '駅から徒歩5分以内',
 'フリー項目\u3000内容',
 '先輩からのメッセージ',
 '対象者設定\u3000年齢下限',
 '未使用.10',
 '学校・公的機関（官公庁）',
 '土日祝のみ勤務',
 '掲載期間\u3000開始日',
 '動画コメント',
 'Wordのスキルを活かす',
 '未使用.8',
 '経験必須',
 '固定残業制 残業代に充当する労働時間数 下限',
 '給与/交通費\u3000給与支払区分',
 'ブロックコード2',
 '勤務地\u3000最寄駅1（分）',
 '未使用.4',
 'CAD関連のスキルを活かす',
 '未使用.7',
 'お仕事No.',
 'メモ',
 '派遣スタッフ活躍中',
 'ブロックコード3',
 '固定残業制',
 'WEB面接OK',
 '大量募集',
 '公開区分',
 '17時以降出社OK',
 '寮・社宅あり',
 '20代活躍中',
 'Accessのスキルを活かす',
 '検索対象エリア',
 '就業形態区分',
 'ネットワーク関連のスキルを活かす',
 'Wワーク・副業可能',
 '勤務地\u3000最寄駅2（沿線名）',
 '休日休暇(火曜日)',
 '固定残業制 残業代に充当する労働時間数 上限',
 'プログラム関連のスキルを活かす',
 '未使用.15',
 '平日休みあり',
 '（派遣先）概要\u3000勤務先名（漢字）',
 '勤務地\u3000最寄駅2（駅からの交通手段）',
 '休日休暇\u3000備考',
 '30代活躍中',
 'フラグオプション選択',
 '未使用.12',
 'エルダー（50〜）活躍中',
 '（派遣）応募後の流れ',
 '期間・時間\u3000勤務時間',
 '期間・時間\u3000勤務期間',
 '派遣形態',
 '人材紹介',
 '週2・3日OK',
 '主婦(ママ)・主夫歓迎',
 '勤務先公開',
 'Excelのスキルを活かす',
 '16時前退社OK',
 '正社員登用あり',
 '残業月20時間未満',
 '勤務地\u3000備考',
 '英語力不要',
 '拠点番号',
 '休日休暇(日曜日)',
 '雇用形態',
 'Dip JobsリスティングS',
 'ブロックコード1',
 'フリー項目\u3000タイトル',
 '社員食堂あり',
 '（紹介予定）入社時期',
 'お仕事名',
 '資格取得支援制度あり',
 '未使用.1',
 'ブランクOK',
 '対象者設定\u3000年齢上限',
 '未使用.20',
 '10時以降出社OK',
 '社会保険制度あり',
 '募集形態',
 '期間・時間\u3000勤務開始日',
 '英語以外の語学力を活かす',
 '休日休暇(祝日)',
 '勤務地\u3000最寄駅3（駅からの交通手段）',
 '外資系企業',
 '（派遣先）勤務先写真ファイル名',
 '応募先\u3000最寄駅（沿線名）',
 '服装自由',
 '仕事写真（下）\u3000写真1\u3000ファイル名',
 'PowerPointのスキルを活かす',
 '未使用.16',
 '仕事写真（下）\u3000写真3\u3000ファイル名',
 'オープニングスタッフ',
 '応募先\u3000所在地\u3000ブロックコード',
 '（派遣先）配属先部署',
 '（派遣先）配属先部署\u3000男女比\u3000女',
 '応募先\u3000所在地\u3000都道府県',
 '動画タイトル',
 '仕事内容',
 '（派遣先）概要\u3000事業内容',
 '応募先\u3000最寄駅（駅名）',
 '残業月10時間未満',
 '休日休暇(土曜日)',
 '（紹介予定）年収・給与例',
 '外国人活躍中・留学生歓迎',
 '履歴書不要',
 '未使用.17',
 '休日休暇(木曜日)',
 '未使用.9',
 '研修制度あり',
 '日払い',
 '未使用',
 '勤務地\u3000最寄駅1（沿線名）',
 '未使用.18',
 '未使用.22',
 '未使用.5',
 '（派遣先）配属先部署\u3000平均年齢',
 '英語力を活かす',
 '勤務地\u3000周辺情報',
 '仕事写真（下）\u3000写真2\u3000ファイル名',
 'バイク・自転車通勤OK',
 '仕事写真（下）\u3000写真2\u3000コメント',
 'DTP関連のスキルを活かす',
 '会社概要\u3000業界コード',
 '勤務地\u3000都道府県コード',
 '未使用.3',
 'PCスキル不要',
 '車通勤OK',
 '制服あり',
 '給与/交通費\u3000給与上限',
 '休日休暇(水曜日)',
 '未使用.2',
 'WEB関連のスキルを活かす',
 '仕事の仕方',
 '未使用.6',
 '給与\u3000経験者給与下限',
 '勤務地\u3000最寄駅1（駅からの交通手段）',
 '応募資格',
 '学生歓迎',
 '紹介予定派遣',
 '固定残業制 残業代 上限',
 '未使用.19',
 '（紹介予定）休日休暇',
 '給与\u3000経験者給与上限',
 'シフト勤務',
 '経験者優遇',
 '週4日勤務',
 '未経験OK',
 '派遣会社のうれしい特典',
 '土日祝休み',
 '給与/交通費\u3000交通費',
 '掲載期間\u3000終了日',
 '未使用.21',
 '待遇・福利厚生',
 'シニア（60〜）歓迎',
 'ベンチャー企業',
 '少人数の職場',
 '仕事写真（下）\u3000写真3\u3000コメント',
 '新卒・第二新卒歓迎',
 '休日休暇(金曜日)',
 'お仕事のポイント（仕事PR）',
 '産休育休取得事例あり',
 '扶養控除内',
 '動画ファイル名',
 '給与/交通費\u3000給与下限',
 '対象者設定\u3000性別',
 'WEB登録OK',
 '応募先\u3000備考',
 'オフィスが禁煙・分煙',
 '応募先\u3000所在地\u3000市区町村',
 '仕事写真（下）\u3000写真1\u3000コメント',
 '勤務地\u3000市区町村コード',
 '（派遣先）職場の雰囲気',
 '未使用.13',
 '（紹介予定）待遇・福利厚生',
 '勤務地\u3000最寄駅1（駅名）',
 '勤務地\u3000最寄駅2（分）',
 '応募拠点',
 '給与/交通費\u3000備考',
 '残業なし',
 'これまでの採用者例',
 '期間･時間\u3000備考',
 '（派遣先）概要\u3000勤務先名（フリガナ）']
 
drop_list=['勤務地\u3000最寄駅3（駅名）',
 '応募先\u3000名称',
 '勤務地\u3000最寄駅3（沿線名）',
 '（派遣先）勤務先写真コメント',
 '勤務地\u3000最寄駅3（分）',
 '無期雇用派遣',
 '未使用.14',
 '（派遣以外）応募後の流れ',
 '（派遣先）概要\u3000従業員数',
 '電話応対なし',
 '週払い',
 '固定残業制 残業代 下限',
 '未使用.11',
 'フリー項目\u3000内容',
 '先輩からのメッセージ',
 '未使用.10',
 '未使用.8',
 '経験必須',
 '固定残業制 残業代に充当する労働時間数 下限',
 'ブロックコード2',
 '未使用.4',
 '未使用.7',
 'メモ',
 'ブロックコード3',
 'WEB面接OK',
 '17時以降出社OK',
 '寮・社宅あり',
 'ネットワーク関連のスキルを活かす',
 'Wワーク・副業可能',
 '固定残業制 残業代に充当する労働時間数 上限',
 'プログラム関連のスキルを活かす',
 '未使用.15',
 '（派遣先）概要\u3000勤務先名（漢字）',
 '未使用.12',
 'エルダー（50〜）活躍中',
 '人材紹介',
 '主婦(ママ)・主夫歓迎',
 'ブロックコード1',
 'フリー項目\u3000タイトル',
 '未使用.1',
 'ブランクOK',
 '未使用.20',
 '募集形態',
 '勤務地\u3000最寄駅3（駅からの交通手段）',
 '（派遣先）勤務先写真ファイル名',
 '応募先\u3000最寄駅（沿線名）',
 '仕事写真（下）\u3000写真1\u3000ファイル名',
 '未使用.16',
 '仕事写真（下）\u3000写真3\u3000ファイル名',
 'オープニングスタッフ',
 '応募先\u3000所在地\u3000ブロックコード',
 '応募先\u3000所在地\u3000都道府県',
 '応募先\u3000最寄駅（駅名）',
 '外国人活躍中・留学生歓迎',
 '未使用.17',
 '未使用.9',
 '日払い',
 '未使用',
 '未使用.18',
 '未使用.22',
 '未使用.5',
 '勤務地\u3000周辺情報',
 '仕事写真（下）\u3000写真2\u3000ファイル名',
 'バイク・自転車通勤OK',
 '仕事写真（下）\u3000写真2\u3000コメント',
 '未使用.3',
 '未使用.2',
 'WEB関連のスキルを活かす',
 '未使用.6',
 '給与\u3000経験者給与下限',
 '学生歓迎',
 '固定残業制 残業代 上限',
 '未使用.19',
 '給与\u3000経験者給与上限',
 '未使用.21',
 '待遇・福利厚生',
 'シニア（60〜）歓迎',
 'ベンチャー企業',
 '少人数の職場',
 '仕事写真（下）\u3000写真3\u3000コメント',
 '応募先\u3000備考',
 '応募先\u3000所在地\u3000市区町村',
 '仕事写真（下）\u3000写真1\u3000コメント',
 '未使用.13',
 '応募拠点',
 'これまでの採用者例',
 '（派遣先）概要\u3000勤務先名（フリガナ）']

count_dict={'お仕事名': ['事務', '交通', '入力', '大手', '時給', '業務'],
 '仕事内容': ['10',
  '11',
  '12',
  'oa',
  'サポート',
  'システム',
  'スタッフ',
  'データ',
  'ファイリング',
  'メール',
  'ヶ月',
  '予定',
  '事務',
  '会社',
  '伝票',
  '作成',
  '使用',
  '入力',
  '内容',
  '処理',
  '問合',
  '土日',
  '契約',
  '安心',
  '対応',
  '専用',
  '就業',
  '引継',
  '当社',
  '応対',
  '書類',
  '来客',
  '業務',
  '残業',
  '活躍',
  '派遣',
  '確認',
  '管理',
  '職場',
  '請求',
  '資料',
  '通勤',
  '雇用',
  '電話'],
 '応募資格': ['excel', 'oa', 'スキル', '事務', '使用', '必要', '関数'],
 'お仕事のポイント（仕事PR）': ['オフィカジ',
  'オフィス',
  'カジュアル',
  'コンビニ',
  'スタッフ',
  'ビル',
  '仕事',
  '休憩',
  '便利',
  '分煙',
  '勤務',
  '可能',
  '土日',
  '安心',
  '完備',
  '就業',
  '当社',
  '徒歩',
  '快適',
  '業務',
  '残業',
  '活躍',
  '派遣',
  '環境',
  '禁煙',
  '給湯',
  '職場',
  '設備',
  '通勤',
  '長期',
  '飲食'],
 '（派遣先）職場の雰囲気': ['分煙', '安心', '快適', '業務', '環境', '禁煙', '職場', '雰囲気'],
 '（派遣先）配属先部署': ['事務']}

def func(test_data):
    test_data=test_data.drop(drop_list,axis=1)

    test_data=test_data.drop(['動画ファイル名','動画コメント',"（派遣）応募後の流れ",'動画タイトル','派遣会社のうれしい特典','期間・時間\u3000勤務開始日'],axis=1)
    test_data['（紹介予定）雇用形態備考']=test_data['（紹介予定）雇用形態備考'].map({'※ご紹介先により異なります。詳細はお問い合わせ下さい。':0,
                                'アルバイト社員':1,
                                'パート社員':2,
                                '契約員':3,
                                '契約社員':4,
                                '契約契約社員':4,
                                '正社員':5
                                }).fillna(-1)
    test_data['（紹介予定）入社時期']=test_data['（紹介予定）入社時期'].map({
        '※ご紹介先により異なります。詳細はお問い合わせ下さい。':0,
        '◆1ヶ月後':1,
        '◆2ヶ月後':2,
        '◆3ヶ月後':3,
        '◆4ヶ月後':4,
        '◆5ヶ月後':5,
        '◆6ヶ月後':6}).fillna(-1)
    test_data['（派遣先）概要\u3000事業内容']=test_data['（派遣先）概要\u3000事業内容'].map({
        '※ご紹介先により異なります。詳細はお問い合わせ下さい。':1
    }).fillna(-1)
    test_data['掲載期間\u3000開始日']=test_data['掲載期間\u3000開始日'].map({
        '2019/11/27':1, 
        '2019/9/25':0
    })
    test_data['掲載期間\u3000終了日']=test_data['掲載期間\u3000終了日'].map({
        '2020/11/27':1,
        '2020/9/25':0
    })
    test_data.loc[test_data['期間･時間\u3000備考'].str.contains('開始日',na=False)==True,'期間･時間\u3000備考']="開始日"
    test_data['期間･時間\u3000備考']=test_data['期間･時間\u3000備考'].map({
        '開始日':1,
        '延長可能性：有':2
    }).fillna(-1)
    kyoten_dict=dict(zip(test_data['拠点番号'].value_counts().keys(),np.log(list(test_data['拠点番号'].value_counts()))))
    test_data['拠点番号']=test_data['拠点番号'].map(kyoten_dict)
    test_data=test_data.drop(['勤務地\u3000最寄駅2（駅名）',
                        '勤務地\u3000最寄駅2（沿線名）',
                        '勤務地\u3000備考',
                        '勤務地\u3000最寄駅1（沿線名）',
                        '勤務地\u3000最寄駅1（駅名）'
                        ],axis=1)
    test_data['（紹介予定）休日休暇']=test_data['（紹介予定）休日休暇'].str.extract("(\d{2,3})").astype(float)
    start=test_data['期間・時間\u3000勤務時間'].str.extract("(\d+):").astype(int)+test_data['期間・時間\u3000勤務時間'].str.extract(":(\d+)").astype(int)/60
    end=test_data['期間・時間\u3000勤務時間'].str.extract("〜(\d+)").astype(int)+test_data['期間・時間\u3000勤務時間'].str.extract("〜\d+:(\d+)").astype(int)/60

    test_data["勤務時間"]=end-start

    test_data["休憩時間"]=test_data['期間・時間\u3000勤務時間'].str.extract("(\d+)分").astype(float)/60

    min=test_data['期間・時間\u3000勤務時間'].str.extract("月(\d+)").astype(float)
    max=test_data['期間・時間\u3000勤務時間'].str.extract("〜(\d+)時間").astype(float)
    test_data["平均残業時間"]=(min+max)/2

    test_data=test_data.drop('期間・時間\u3000勤務時間',axis=1)
    test_data["基本給"]=test_data['給与/交通費\u3000備考'].str.extract("(\d+)万").astype(float)*10000+test_data['給与/交通費\u3000備考'].str.extract("(\d+)円").astype(float)

    test_data["交通費"]=test_data['給与/交通費\u3000備考'].str.extract("日額(\d+)円")
    test_data["交通費"]=test_data["交通費"].map({'５００':1})

    test_data=test_data.drop(['給与/交通費\u3000備考'],axis=1)
    test_data["登用後"]=test_data['（紹介予定）年収・給与例'].str.extract("★(.+社員)登用後")
    test_data["登用後"]=test_data["登用後"].map({'正社員':4
                        , '契約社員':3
                        , 'アルバイト社員':1
                        , 'パート社員':2
                        , '契約契約社員':3
                    }).fillna(-1)
    salary_min=test_data['（紹介予定）年収・給与例'].str.extract("年収(\d+)").astype(float)
    salary_max=test_data['（紹介予定）年収・給与例'].str.extract("〜(\d+)").astype(float)
    saraly_mean=test_data['（紹介予定）年収・給与例'].str.extract("年収約(\d+)").astype(float)
    saraly_mean=saraly_mean.fillna(0)+(salary_max/2+salary_min/2).fillna(0)
    test_data.loc[test_data['（紹介予定）年収・給与例'].str.contains('賞与含')==True,'（紹介予定）年収・給与例']="賞与含"
    test_data.loc[test_data['（紹介予定）年収・給与例'].str.contains('賞与別')==True,'（紹介予定）年収・給与例']="賞与別"
    test_data['（紹介予定）年収・給与例']=test_data['（紹介予定）年収・給与例'].fillna("不明")
    test_data.loc[(test_data['（紹介予定）年収・給与例'].str.contains('賞与別')==False) &
                (test_data['（紹介予定）年収・給与例'].str.contains('賞与含')==False) &
                (test_data['（紹介予定）年収・給与例'].str.contains("不明")==False) ,'（紹介予定）年収・給与例']="賞与なし"
    test_data["ボーナスについて"]=test_data['（紹介予定）年収・給与例'].map({'不明':-1, '賞与含':1, '賞与なし':0, '賞与別':2})
    test_data=test_data.drop(['（紹介予定）年収・給与例'],axis=1)
    test_data["給与最大値"]=salary_max
    test_data["給与最低値"]=salary_min
    test_data["給与平均額"]=saraly_mean
    def clean(txt):
        txt=txt.str.replace("<BR>","")
        txt=txt.str.replace("\u3000","")
        
        delete="◆●▼※☆＊！≪【★◎＼＜】?■◇○×"
        for i in delete:
            txt=txt.str.replace(i,"")
            
        delete_2="＞／≫】!♪"
        for i in delete_2:
            txt=txt.str.replace(i,"。")
        return txt
    for i in ['お仕事名','仕事内容','応募資格','お仕事のポイント（仕事PR）','（派遣先）職場の雰囲気','（紹介予定）待遇・福利厚生','（派遣先）配属先部署']:
        test_data[i]=clean(test_data[i])
    warranty_bool=test_data["（紹介予定）待遇・福利厚生"].str.contains("完備|全|すべて|加入")|(test_data["（紹介予定）待遇・福利厚生"].str.contains("雇")&test_data["（紹介予定）待遇・福利厚生"].str.contains("健")&test_data["（紹介予定）待遇・福利厚生"].str.contains("厚")&test_data["（紹介予定）待遇・福利厚生"].str.contains("労"))
    test_data.loc[warranty_bool,"（紹介予定）待遇・福利厚生"]="4"
    test_data.loc[test_data["（紹介予定）待遇・福利厚生"].str.contains("アリ|有|あり|各種|適用")==True,"（紹介予定）待遇・福利厚生"]="2"
    test_data.loc[test_data["（紹介予定）待遇・福利厚生"].str.contains("勤務時間によって異なる")==True,"（紹介予定）待遇・福利厚生"]="1"
    test_data.loc[test_data["（紹介予定）待遇・福利厚生"].str.contains("1|2|4")==False,"（紹介予定）待遇・福利厚生"]="3"

    test_data["（紹介予定）待遇・福利厚生"]=test_data["（紹介予定）待遇・福利厚生"].fillna(-1).astype(float)



    text_df= pd.DataFrame(index=[])
    text_df_list=copy.deepcopy(text_df)
    for i in ['お仕事名','仕事内容','応募資格','お仕事のポイント（仕事PR）','（派遣先）職場の雰囲気','（派遣先）配属先部署']:
        df=test_data[i].fillna("").astype(str)
        for j in range(len(df)):
            df[j]=df[j].translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))
            df[j]=df[j].lower()
        text_df[i]=df
    text_df_list=copy.deepcopy(text_df)
    text_df["未経験"]=0
    for i  in ['お仕事名','仕事内容','応募資格','お仕事のポイント（仕事PR）','（派遣先）職場の雰囲気','（派遣先）配属先部署']:
        a=(text_df[i].astype(str).str.contains("未",na=False)==True)
        b=(text_df[i].astype(str).str.contains("経験",na=False)==True)
        text_df.loc[a&b,"未経験"]=1
 
    for i in ['お仕事名','仕事内容','応募資格','お仕事のポイント（仕事PR）','（派遣先）職場の雰囲気','（派遣先）配属先部署']:
        sentence=text_df[i]
        words=count_dict[i]
        text_df_list[i]=sum([sentence.str.contains(words[n]).astype(float) for n in range(len(words))])
    
    for i in ['お仕事名','仕事内容','応募資格','お仕事のポイント（仕事PR）','（派遣先）職場の雰囲気','（派遣先）配属先部署']:
        test_data[i]=text_df_list[i]
        
        
    test_data["未経験"]=text_df["未経験"]
    day_copy=copy.deepcopy(test_data["休日休暇　備考"])
    day_copy=day_copy.str.replace("※|企業カレンダーあります。","")
    off_day=pd.DataFrame(day_copy.str.extract("(.+)がお休み"))[0]
    off_day=off_day.str.replace("１日|2日|平日","")
    off_day=pd.DataFrame(off_day)
    for i in "月火水木金土日祝":
        off_day[i]=0
        off_day.loc[off_day[0].str.contains(i)==True,i]=1
    day_copy=day_copy.str.replace(r".+がお休み.+。","")
    work_day=day_copy.str.extract("勤*務*週(\d〜*\d*)日.*勤務")
    work_day[0]=work_day[0].map({'３〜４':3.5,'４〜５':4.5,'３〜５':4,'２〜４':3,'１〜２':1.5,'１〜３':2})
    work_day[0]=work_day[0].astype(float)

    off_day["勤務日数"]=work_day[0]
    off_day=off_day.drop([0],axis=1)
    day_copy=day_copy.str.replace(r"勤*務*週(\d〜*\d*)日.*勤務","")
    off_day["休日日数"]=day_copy.str.extract("週休(\d〜*\d*)日*")[0].map({'２':2})
    for i in off_day:
        test_data[i]=off_day[i]
    test_data=test_data.drop(['休日休暇\u3000備考'],axis=1)
    for i in test_data.select_dtypes(include=object):
        test_data[i]=test_data[i].astype(float)

    return test_data
