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

左手的ㄟ右手 2023-02-16 04:12 78阅读 0赞

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

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

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

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

  1. import json
  2. from time import time
  3. import requests
  4. import pandas as pd
  5. class Translate_Series:
  6. """ 思路:因为翻译接口有访问次数的限制,所以首先将Series重后,再调用有道翻译的接口将Series中每个数据, 翻译成中文保存为json文件{原始数据:翻译后的数据},然后对原始的Series进行遍历替换 """
  7. def __init__(self, filename, Series):
  8. """ :param filename: 路径/文件名 :param Series: pd.Series """
  9. self.filename = filename
  10. self.Series = Series
  11. @property
  12. def read_json(self):
  13. try:
  14. with open(self.filename, 'r', encoding='utf-8') as f:
  15. data = json.load(f)
  16. except:
  17. return ''
  18. return data
  19. def save_json(self, data):
  20. with open(self.filename, 'w', encoding='utf-8') as f:
  21. f.write(json.dumps(data, ensure_ascii=False))
  22. def translation(self, string):
  23. """ :param string: 需要翻译的字符串 :return: 翻译后的字符串 """
  24. data = {
  25. 'doctype': 'json',
  26. 'type': 'AUTO',
  27. 'i': string
  28. }
  29. # proxy = {'http': '27.38.99.186:9797'}
  30. url = "http://fanyi.youdao.com/translate"
  31. try:
  32. res = requests.get(url, params=data)
  33. result = res.json()
  34. print(string+': '+result['translateResult'][0][0]['tgt'])
  35. return result['translateResult'][0][0]['tgt']
  36. except:
  37. pass
  38. @property
  39. def translation_detail(self):
  40. """ :return: 字典:原始数据:翻译后的数据 """
  41. begin_time = time() # 用来获取当前的时间,返回的单位是秒
  42. info_unique = self.Series.unique()
  43. info_translation = pd.Series(info_unique)
  44. info_translation = info_translation.apply(lambda x: self.translation(x))
  45. info = { i: j for i, j in zip(info_unique, info_translation)}
  46. end_time = time()
  47. run_time = end_time - begin_time
  48. print(f'翻译{len(info)}条数据总耗时:{run_time}s')
  49. return info
  50. def __call__(self):
  51. if not self.read_json:
  52. self.save_json(self.translation_detail) # 翻译保存到json文件中
  53. begin_time = time()
  54. print('正在对当前Series遍历替换...')
  55. res = self.Series.apply(lambda x: self.read_json[x] if not pd.isnull(x) else x) # 对原始的Series进行遍历替换
  56. end_time = time()
  57. run_time = end_time - begin_time
  58. print(f'遍历替换{len(self.Series)}条数据总耗时:{run_time}s')
  59. return res

ship_clean.py

  1. import pandas as pd
  2. from utils import Translate_Series
  3. # 1.读取文件
  4. ship = pd.read_csv('static/ship.csv')
  5. # 2.船舶类型、船籍国、船旗处理成中文
  6. # 处理船舶类型
  7. ship['Ship_type'] = Translate_Series('./static/type.json', ship['Ship_type'])()
  8. # 处理船籍国
  9. ship['Ship_country'] = Translate_Series('./static/country.json', ship['Ship_country'])()
  10. # 处理船旗
  11. ship['ship_flag'] = Translate_Series('./static/flag.json', ship['ship_flag'])()

发表评论

表情:
评论列表 (有 0 条评论,78人围观)

还没有评论,来说两句吧...

相关阅读