Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Verarbeitungsbeispiele für unordentliche Textdaten

Python-Verarbeitungsbeispiele für unordentliche Textdaten

PHP中文网
PHP中文网Original
2017-06-20 16:34:565454Durchsuche

1. Betriebsumgebung

Alle Blog-Codes sind diese Version
2. Systemumgebung: Win7 64-Bit-System

2 Unordentlicher Text Datenverarbeitung

Einige Daten-Screenshots sind wie folgt: Das erste Feld ist das Originalfeld, und die nächsten drei sind die bereinigten Felder in der Datenbank. Auf den ersten Blick sind die Daten relativ regulär, ähnlich wie (Währungsbetrag Zehntausend Yuan) Auf diese Weise habe ich darüber nachgedacht, SQL zu verwenden, um bedingte Urteile zu schreiben und sie einheitlich in die Einheit „Zehntausend Yuan“ umzuwandeln. Allerdings könnte ich ein SQL-Skript verwenden, um die Zeichenfolge abzufangen Später stellte ich fest, dass die Daten unregelmäßig waren und es zu viele bedingte Beurteilungen gab und die Reinigungsqualität nicht gut war. Natürlich haben einige keine Klammern davor, einige Felder enthalten keine Währung, einige Zahlen schon keine Ganzzahlen, und einige haben keine 10.000 Zeichen. Wenn die beiden Felder als Zahlen und in der Einheit „10.000 Yuan“ gespeichert werden, wird es kompliziert, das SQL-Skript zu schreiben Kann Zahlen aus Text extrahieren. Reguläre Ausdrücke werden häufig in Where-Bedingungen verwendet. Wenn jemand weiß, dass MySQL eine Funktion hat, die dem Filtern von Text ähnelt, um Zahlen aus Text zu extrahieren, können Sie mir sagen, dass Sie nicht so viel Geld ausgeben müssen . Für viel Aufwand nutzen Sie einfach Kettle als Werkzeug. Am besten erlernen und nutzen Sie das Werkzeug flexibel.

In Kombination mit der Erfahrung mit Python verfügt Python über viele Funktionen zum Filtern von Zeichenfolgen. Diese Methode wird im späteren Code zum Filtern von Text verwendet.


Screenshot der ersten Teilreinigungsdaten

3. Makrologisches Denken zur Datenverarbeitung

Beeilen Sie sich nicht, zuerst den Code zu schreiben. Dies ist sehr wichtig In die richtige Richtung erhalten Sie mit halbem Aufwand das doppelte Ergebnis. Der Rest der Zeit ist Code. Der Prozess der Implementierung von Logik und des Debuggens von Code.

3.1 Denkprozess ohne Code schreiben:

Die letzte Datenbereinigung, die ich erreichen möchte, besteht darin, das Fondsfeld in eine Kombination aus [Betrag + Einheit + jede Währung] oder [Betrag + Einheit] umzuwandeln ] + Einheitliche RMB-Währung] (Wechselkursumrechnung), dies kann in zwei oder drei Schritten erfolgen

3.1.1 Aufteilung in drei Felder, Zahl, Einheit, Währung

(Einheiten sind unterteilt in Zehntausende und ohne Zehntausende, und Währungen werden in RMB und bestimmte Fremdwährungen unterteilt)

3.1.2 Konvertieren Sie die Einheiten in Einheiten von Zehntausenden

Die Einheit in der ersten Schritt ist nicht Der digitale Teil von Zehntausend/10000, der digitale Teil von Zehntausend bleibt unverändert

3.1.3 Währung in RMB vereinheitlichen

Die Währung ist RMB, die ersten beiden Felder bleiben erhalten unverändert, nein Der numerische Teil wird in eine Zahl geändert * Der Wechselkurs jeder Fremdwährung zu RMB, die Einheit bleibt unverändert und ist im zweiten Schritt immer noch der einheitliche „Zehntausend“

3.2 Datenaufzählung der erwarteter Reinigungseffekt jedes Schritts:

Daraus haben wir begonnen, ihn Schritt für Schritt zu zerlegen und zunächst den Reinigungslogikteil zu klären

3.2.1 Der erwartete Effekt des ersten Die Reinigung wurde in drei Felder unterteilt, digitale Einheitswährung:

① Feldwert = „2000 Yuan“, die erste Reinigung
2000  不含万   人民币
② Feldwert = „20 Millionen Yuan“, die erste Reinigung
2000  万   人民币
③ Feldwert = „20 Millionen Yuan“ Fremdwährung“, die erste Reinigung
2000  万   外币

3.2.2 Der erwartete Effekt der zweiten Reinigung wird sein in Zehntausend vereinheitlicht:

#二次处理条件case when 单位=‘万’ then 金额 else 金额/10000 end as 第二次金额

①Feldwert = „2000 Yuan RMB“
0.2    万  人民币
②Feldwert = „20 Millionen RMB“
2000    万  人民币
③Feldwert = „20 Millionen Fremdwährung“
2000    万  外币

Hinweis: Wenn die oben genannten Anforderungen erfüllt sind, ist die Reinigung abgeschlossen. Wenn Sie das Gerät in RMB umrechnen möchten, führen Sie die folgenden drei Reinigungen durch

3.2.3 Der erwartete Effekt der dritten Reinigung: Die Einheitswährung wird auf 10.000 + RMB vereinheitlicht

Wenn die letzte Anforderung darin besteht, die Währung in einheitliche RMB umzuwandeln, können wir einfach die Bedingungen schreiben basierend auf der zweiten Reinigung,

#三次处理条件case when 币种=‘人民币’ then 金额 else 金额*币种和人民币的换算汇率 end as 第三次金额

①Feldwert = „2000 Yuan RMB“
0.2    万  人民币
②Feldwert = „20 Millionen RMB“
2000    万  人民币
③Feld Wert = „20 Millionen Fremdwährung“
2000*外币兑换人民币汇率  万  人民币

4. Makrologisches Denken zu bestimmten Codes

Währung und Einheit sind nur zwei Situationen, die leicht zu schreiben sind

4.1. Währungsteil

Diese Bedingung ist einfach. Wenn der Wert der Währung im Zeichen erscheint, stellen Sie einfach das neue Feld auf den Wert dieser Währung ein.

4.2. Einheit (zehntausend ist die Einheit)

Diese Bedingung ist ebenfalls einfach. Wenn das Wort zehntausend vorkommt, ist die Einheitsvariable = „zehntausend“. nicht erscheint, soll die Einheitsvariable gleich „zehntausend ausschließen“ sein. Dies wurde geschrieben, um das Schreiben bedingter Urteile bei der sekundären Verarbeitung von Zahlen im nächsten Schritt zu erleichtern.

Stellen Sie sicher, dass der numerische Teil nach der Reinigung logisch mit dem ursprünglichen Wert übereinstimmt, und treffen Sie einige Beurteilungen.

Stellen Sie sicher, dass der logische Wert nach der Reinigung mit dem ursprünglichen Wert übereinstimmt Das heißt, wenn es ein solches Feld gibt, werden aus 300,01 Millionen nach der Reinigung auch 10.000 Yuan.

filter(str.isdigit,字段的值)Das erste, was ich über diesen Code weiß, ist, dass er die Zahlen aus dem Text extrahieren kann, indem er die Felder gruppiert und aggregiert. Die extrahierten Werte sind nicht vorhanden haben mehr Dezimalpunkte, wie zum Beispiel „200.100“. Die herausgenommene Zahl ist 2001. Offensichtlich ist diese Zahl falsch, daher müssen Sie überlegen, ob es einen Dezimalpunkt gibt Identisch mit dem Originalfeldfilter(str.isdigit,‘20.01万’)

4. Bereinigen Sie den Hauptcode zum ersten Mal. Lesen Sie nicht zuerst die Datenbankdaten

Extrahieren Sie etwa 10 Ausreißer aus der Datenbank zum Testen des regCapital-Feldes

   #带小数点的以小数点分割 取出小数点前后部分进行拼接if '.' in info and int(filter(str.isdigit,info.split('.')[1]))>0:
        derive_regcapital=filter(str.isdigit,info.split('.')[0])+'.'+filter(str.isdigit,info.split('.')[1])
    elif '.' in info and int(filter(str.isdigit,info.split('.')[1]))==0:
        derive_regcapital = filter(str.isdigit, info.split('.')[0])

    elif filter(str.isdigit,info)=='':
        derive_regcapital='0'else:
        derive_regcapital=filter(str.isdigit,info)#单位 以万和不含万 为统一if '万' in info:
        derive_danwei='万'else:
        derive_danwei='不含万'   #币种 第一次清洗 外币保留外币字段 聚合大量数据 发现数据中含有外币的情况大致有下面这些情况 如果有新外币出现 进行数据的update操作即可if '美元' in info:
           derive_currency='美元'
    elif '港币' in info:
        derive_currency = '港币'
    elif '阿富汗尼' in info:
        derive_currency = '阿富汗尼'
    elif '澳元' in info:
        derive_currency = '澳元'
    elif '英镑' in info:
         derive_currency = '英镑'
    elif '加拿大元' in info:
        derive_currency = '加拿大元'
    elif '日元' in info:
        derive_currency = '日元'
    elif '港币' in info:
        derive_currency = '港币'
    elif '法郎' in info:
        derive_currency = '法郎'
    elif '欧元' in info:
        derive_currency = '欧元'
    elif '新加坡' in info:
        derive_currency = '新加坡元'else:
         derive_currency = '人民币'
5. Alle Codes: Lesen Sie die Datenbankdaten für eine vollständige Messung. Reinigung

Der vierte Schritt besteht darin, einige Daten zu testen, um zu überprüfen, ob der Code korrekt ist Gleichzeitig sollte die Logik aus Makroperspektive erweitert werden und die Info-Variable dynamisch in alle Werte in der Datenbank geändert werden, um eine vollständige Bereinigung durchzuführen

#coding:utf-8from class_mysql import Mysql
project=Mysql('s_58infor_data',[],0,conn_type='local')
p2=Mysql('etl1_58infor_data',[],24,conn_type='local')
field_list=p2.select_fields(db='local_db',table='etl1_58infor_data')print field_list
project2=Mysql('etl1_58infor_data',field_list=field_list,field_num=26,conn_type='local')#以上部分 看不懂没关系 由于我有两套数据库环境,测试和生产#不同的数据库连接和网段,因此要传递不同的参数进行切换数据库和数据连接 如果一套环境 连接一次数据库即可 数据处理需要经常做测试 方便自己调用
data_tuple=project.select(db='local_db',id=0)#data_tuple 是我实例化自己写的操作数据库的类对数据库数据进行全字段进行读取,返回值是一个不可变的对象元组tuple,清洗需要保留旧表全部字段,同时增加3个清洗后的数据字段
data_tuple=project.select(db='local_db',id=0)#遍历元组 用字典去存储每个字段的值 插入到增加3个清洗字段的表 etl1_58infor_datafor data in data_tuple:
    item={}#old_data不取最后一个字段 是因为那个字段我想用当前处理的时间 
#这样可以计算数据总量运行的时间 来调整二次清洗的时间去和和kettle定时任务对接#元组转换为列表 转换的原因是因为元组为不可变类型 如果有数据中有null值 遍历转换为字符串会报错
    old_data=list(data[:-1])if data[-2]:if len(data[-2]) >0 :
            info=data[-2].encode('utf-8')else:
        info=''if '.' in info and int(filter(str.isdigit,info.split('.')[1]))>0:
        derive_regcapital=filter(str.isdigit,info.split('.')[0])+'.'+filter(str.isdigit,info.split('.')[1])elif '.' in info and int(filter(str.isdigit,info.split('.')[1]))==0:
        derive_regcapital = filter(str.isdigit, info.split('.')[0])elif filter(str.isdigit,info)=='':
        derive_regcapital='0'else:
        derive_regcapital=filter(str.isdigit,info)if '万' in info:
        derive_danwei='万'else:
        derive_danwei='不含万'if '美元' in info:
           derive_currency='美元'elif '港币' in info:
        derive_currency = '港币'elif '阿富汗尼' in info:
        derive_currency = '阿富汗尼'elif '澳元' in info:
        derive_currency = '澳元'elif '英镑' in info:
         derive_currency = '英镑'elif '加拿大元' in info:
        derive_currency = '加拿大元'elif '日元' in info:
        derive_currency = '日元'elif '港币' in info:
        derive_currency = '港币'elif '法郎' in info:
        derive_currency = '法郎'elif '欧元' in info:
        derive_currency = '欧元'elif '新加坡' in info:
        derive_currency = '新加坡元'else:
         derive_currency = '人民币'
    time_58infor_data = p2.create_time()
    old_data.append(time_58infor_data)
    old_data.append(derive_regcapital)
    old_data.append(derive_danwei)
    old_data.append(derive_currency)#print len(old_data)for i in range(len(old_data)):if not  old_data[i] :
            old_data[i]=''else:pass
        data2=old_data[i].replace('"','')
        item[i+1]=data2print item[1]   #插入测试环境 的表 
    project2.insert(item=item,db='local_db')
6. Code-Operation

6.1 Lesen Sie die ursprünglichen Tabellendaten der Datenbank und die in der neuen Tabelle erstellten Felder


Lesen Sie die ursprünglichen Tabellendaten der Datenbank und die in der neuen Tabelle erstellten Felder
6.2 Fügen Sie die neue Tabelle ein und führen Sie die erste Datenbereinigung durch

Der rote Kästchenteil ist der Reinigungsteil, und andere Daten wurden desensibilisiert


Fügen Sie eine neue Tabelle ein und führen Sie die erste Datenbereinigung durch

6.3 数据表数据清洗结果


数据表数据清洗结果

七、增量数据处理

由于每天数据有增量进入,因此第一次执行完初始话之后,我们要根据表中的时间戳字段进行判断,读取昨日新的数据进行清洗插入,这部分留到下篇博客。
初步计划用下面函数 作为参数 判断增量 create_time 是爬虫脚本执行时候写入的时间,yesterday是昨日时间,在where条件里加以限制,取出昨天进入数据库的数据 进行执行 win7系统支持定时任务

import datetimefrom datetime import datetime as dt#%进行转义使用%%来转义#主要构造sql中条件“where create_time like %s%%“  % yesterday#写入脚本运行的当前时间 

def create_time(self):
    create_time = dt.now().strftime('%Y-%m-%d %H:%M:%S')return create_timedef yesterday(self):
    yestoday= datetime.date.today()-datetime.timedelta(days=1)return yestoday

Das obige ist der detaillierte Inhalt vonPython-Verarbeitungsbeispiele für unordentliche Textdaten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn