python数据分析 pandas对某列Series调用有道翻译API进行翻译

python数据分析 pandas对某列Series调用有道翻译API进行翻译python数据分析pandas对某列Series调用有道翻译API进行翻译_pandas翻译某列成中文

需求:使用pandas对船舶数据分析中,爬取下来的一些字段是英文的,将某列Series的英文翻译成中文

解决方案:这里封装了一个对某列不同语言的Series进行翻译的类

思路:因为翻译接口有访问次数的限制,所以首先将Series去重后,再调用有道翻译的接口将Series中每个数据,翻译成中文保存为json文件{原始数据:翻译后的数据},然后对原始的Series进行遍历替换

效果图:
在这里插入图片描述
在这里插入图片描述
utils.py

import json
from time import time
import requests
import pandas as pd

class Translate_Series:
    """ 思路:因为翻译接口有访问次数的限制,所以首先将Series重后,再调用有道翻译的接口将Series中每个数据, 翻译成中文保存为json文件{原始数据:翻译后的数据},然后对原始的Series进行遍历替换 """
    def __init__(self, filename, Series):
        """ :param filename: 路径/文件名 :param Series: pd.Series """
        self.filename = filename
        self.Series = Series

    @property
    def read_json(self):
        try:
            with open(self.filename, 'r', encoding='utf-8') as f:
                data = json.load(f)
        except:
            return ''
        return data

    def save_json(self, data):
        with open(self.filename, 'w', encoding='utf-8') as f:
            f.write(json.dumps(data, ensure_ascii=False))

    def translation(self, string):
        """ :param string: 需要翻译的字符串 :return: 翻译后的字符串 """
        data = { 
   
            'doctype': 'json',
            'type': 'AUTO',
            'i': string
        }
        # proxy = {'http': '27.38.99.186:9797'}
        url = "http://fanyi.youdao.com/translate"
        try:
            res = requests.get(url, params=data)
            result = res.json()
            print(string+': '+result['translateResult'][0][0]['tgt'])
            return result['translateResult'][0][0]['tgt']
        except:
            pass

    @property
    def translation_detail(self):
        """ :return: 字典:原始数据:翻译后的数据 """
        begin_time = time()  # 用来获取当前的时间,返回的单位是秒
        info_unique = self.Series.unique()
        info_translation = pd.Series(info_unique)
        info_translation = info_translation.apply(lambda x: self.translation(x))
        info = { 
   i: j for i, j in zip(info_unique, info_translation)}
        end_time = time()
        run_time = end_time - begin_time
        print(f'翻译{ 
     len(info)}条数据总耗时:{ 
     run_time}s')
        return info

    def __call__(self):
        if not self.read_json:
            self.save_json(self.translation_detail)        # 翻译保存到json文件中
        begin_time = time()
        print('正在对当前Series遍历替换...')
        res = self.Series.apply(lambda x: self.read_json[x] if not pd.isnull(x) else x)    # 对原始的Series进行遍历替换
        end_time = time()
        run_time = end_time - begin_time
        print(f'遍历替换{ 
     len(self.Series)}条数据总耗时:{ 
     run_time}s')
        return res

ship_clean.py

import pandas as pd
from utils import Translate_Series
# 1.读取文件
ship = pd.read_csv('static/ship.csv')

# 2.船舶类型、船籍国、船旗处理成中文
# 处理船舶类型
ship['Ship_type'] = Translate_Series('./static/type.json', ship['Ship_type'])()
# 处理船籍国
ship['Ship_country'] = Translate_Series('./static/country.json', ship['Ship_country'])()
# 处理船旗
ship['ship_flag'] = Translate_Series('./static/flag.json', ship['ship_flag'])()

今天的文章python数据分析 pandas对某列Series调用有道翻译API进行翻译分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/65001.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注