Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

Mara nyingi watu wanaoingia kwenye uwanja wa Sayansi ya Data huwa na matarajio yasiyo ya kweli ya kile kinachowangoja. Watu wengi wanafikiri kwamba sasa wataandika mitandao ya neural baridi, kuunda msaidizi wa sauti kutoka Iron Man, au kumpiga kila mtu katika masoko ya fedha.
Lakini kazi Data Mwanasayansi anaendeshwa na data, na mojawapo ya vipengele muhimu na vinavyotumia muda mwingi ni kuchakata data kabla ya kuiingiza kwenye mtandao wa neva au kuichanganua kwa njia fulani.

Katika makala haya, timu yetu itaelezea jinsi unavyoweza kuchakata data haraka na kwa urahisi kwa maelekezo ya hatua kwa hatua na msimbo. Tulijaribu kufanya msimbo unyumbulike kabisa na unaweza kutumika kwa hifadhidata tofauti.

Wataalamu wengi hawawezi kupata chochote cha kushangaza katika nakala hii, lakini wanaoanza wataweza kujifunza kitu kipya, na mtu yeyote ambaye amekuwa na ndoto ya kutengeneza daftari tofauti kwa usindikaji wa data wa haraka na muundo anaweza kunakili msimbo na kuubadilisha wao wenyewe, au pakua daftari iliyomalizika kutoka kwa Github.

Tumepokea seti ya data. Nini cha kufanya baadaye?

Kwa hivyo, kiwango: tunahitaji kuelewa kile tunachoshughulikia, picha ya jumla. Ili kufanya hivyo, tunatumia panda kufafanua tu aina tofauti za data.

import pandas as pd #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ pandas
import numpy as np  #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ numpy
df = pd.read_csv("AB_NYC_2019.csv") #Ρ‡ΠΈΡ‚Π°Π΅ΠΌ датасСт ΠΈ записываСм Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ df

df.head(3) #смотрим Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 3 строчки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ выглядят значСния

Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

df.info() #ДСмонстрируСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ…

Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

Wacha tuangalie maadili ya safu:

  1. Je, idadi ya mistari katika kila safu inalingana na jumla ya idadi ya mistari?
  2. Ni nini kiini cha data katika kila safu?
  3. Je, ni safu gani tunayotaka kulenga ili kufanya ubashiri wake?

Majibu ya maswali haya yatakuruhusu kuchanganua mkusanyiko wa data na kuchora takribani mpango wa vitendo vyako vifuatavyo.

Pia, kwa utazamaji wa kina wa maadili katika kila safu, tunaweza kutumia kazi ya pandas explain(). Hata hivyo, hasara ya chaguo hili la kukokotoa ni kwamba haitoi taarifa kuhusu safu wima zilizo na maadili ya kamba. Tutashughulika nao baadaye.

df.describe()

Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

Taswira ya uchawi

Wacha tuangalie ni wapi hatuna maadili hata kidogo:

import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

Hii ilikuwa sura fupi kutoka juu, sasa tutaendelea na mambo ya kuvutia zaidi

Wacha tujaribu kupata na, ikiwezekana, ondoa safu wima ambazo zina thamani moja tu katika safu zote (hazitaathiri matokeo kwa njia yoyote):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ датасСт, оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния

Sasa tunajilinda na kufaulu kwa mradi wetu kutoka kwa mistari iliyorudiwa (mistari ambayo ina habari sawa kwa mpangilio sawa na moja ya mistari iliyopo):

df.drop_duplicates(inplace=True) #Π”Π΅Π»Π°Π΅ΠΌ это, Ссли считаСм Π½ΡƒΠΆΠ½Ρ‹ΠΌ.
                                 #Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ с самого Π½Π°Ρ‡Π°Π»Π° Π½Π΅ стоит.

Tunagawanya seti ya data kuwa mbili: moja ikiwa na maadili ya ubora, na nyingine na yale ya kiasi.

Hapa tunahitaji kufanya ufafanuzi mdogo: ikiwa mistari iliyo na data inayokosekana katika data ya ubora na kiasi haijaunganishwa sana, basi tutahitaji kuamua ni nini tunatoa dhabihu - mistari yote iliyo na data inayokosekana, sehemu yao tu, au safu fulani. Ikiwa mistari imeunganishwa, basi tuna kila haki ya kugawanya mkusanyiko wa data kuwa mbili. Vinginevyo, utahitaji kwanza kushughulika na mistari ambayo haiunganishi data inayokosekana katika ubora na idadi, na kisha tu ugawanye hifadhidata kuwa mbili.

df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])

Tunafanya hivi ili iwe rahisi kwetu kuchakata aina hizi mbili tofauti za data - baadaye tutaelewa jinsi hii inavyorahisisha maisha yetu.

Tunafanya kazi na data ya kiasi

Jambo la kwanza tunapaswa kufanya ni kuamua ikiwa kuna "safu wima za ujasusi" katika data ya kiasi. Tunaziita safu wima hizi kwa sababu zinajiwasilisha kama data ya kiasi, lakini hufanya kama data ya ubora.

Je, tunaweza kuwatambuaje? Kwa kweli, yote inategemea asili ya data unayochambua, lakini kwa ujumla safu kama hizo zinaweza kuwa na data ndogo ya kipekee (katika eneo la maadili 3-10 ya kipekee).

print(df_numerical.nunique())

Mara tu tumegundua safu wima za kijasusi, tutazihamisha kutoka kwa data ya kiasi hadi data ya ubora:

spy_columns = df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]#выдСляСм ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ-ΡˆΠΏΠΈΠΎΠ½Ρ‹ ΠΈ записываСм Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ dataframe
df_numerical.drop(labels=['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3'], axis=1, inplace = True)#Π²Ρ‹Ρ€Π΅Π·Π°Π΅ΠΌ эти ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΈΠ· количСствСнных Π΄Π°Π½Π½Ρ‹Ρ…
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1']) #добавляСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2']) #добавляСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']) #добавляСм Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅

Hatimaye, tumetenganisha kabisa data ya kiasi kutoka kwa data ya ubora na sasa tunaweza kufanya kazi nayo vizuri. Jambo la kwanza ni kuelewa ni wapi tuna maadili tupu (NaN, na katika hali zingine 0 itakubaliwa kama maadili tupu).

for i in df_numerical.columns:
    print(i, df[i][df[i]==0].count())

Katika hatua hii, ni muhimu kuelewa ni safu zipi sufuri zinaweza kuonyesha thamani zinazokosekana: je, hii ni kutokana na jinsi data ilivyokusanywa? Au inaweza kuhusishwa na maadili ya data? Maswali haya lazima yajibiwe kwa msingi wa kesi kwa kesi.

Kwa hivyo, ikiwa bado tutaamua kwamba tunaweza kukosa data ambapo kuna sufuri, tunapaswa kubadilisha sufuri na NaN ili iwe rahisi kufanya kazi na data hii iliyopotea baadaye:

df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]] = df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]].replace(0, nan)

Sasa hebu tuone ni wapi tunakosa data:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ df_numerical.info()

Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

Hapa thamani hizo ndani ya safuwima ambazo hazipo zinapaswa kuwekwa alama ya manjano. Na sasa furaha huanza - jinsi ya kukabiliana na maadili haya? Je, nifute safu mlalo zilizo na maadili au safu wima hizi? Au jaza maadili haya tupu na zingine?

Hapa kuna mchoro wa takriban ambao unaweza kukusaidia kuamua ni nini, kimsingi, kinaweza kufanywa na maadili tupu:

Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

0. Ondoa nguzo zisizohitajika

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Je, idadi ya thamani tupu katika safu hii ni zaidi ya 50%?

print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)#УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ большС 50 пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Futa mistari iliyo na maadili tupu

df_numerical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Kuingiza thamani nasibu

import random #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ random
df_numerical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True) #вставляСм Ρ€Π°Π½Π΄ΠΎΠΌΠ½Ρ‹Π΅ значСния Π² пустыС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

3.2. Kuingiza thamani isiyobadilika

from sklearn.impute import SimpleImputer #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ SimpleImputer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ значСния
imputer = SimpleImputer(strategy='constant', fill_value="<Π’Π°ΡˆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ здСсь>") #вставляСм ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SimpleImputer
df_numerical[["новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1",'новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2','новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']] = imputer.fit_transform(df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]) #ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ это для нашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
df_numerical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True) #Π£Π±ΠΈΡ€Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ со старыми значСниями

3.3. Weka thamani ya wastani au ya mara kwa mara

from sklearn.impute import SimpleImputer #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ SimpleImputer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ значСния
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #вмСсто mean ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ most_frequent
df_numerical[["новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1",'новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2','новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']] = imputer.fit_transform(df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]) #ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ это для нашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
df_numerical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True) #Π£Π±ΠΈΡ€Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ со старыми значСниями

3.4. Ingiza thamani iliyohesabiwa na muundo mwingine

Wakati mwingine maadili yanaweza kuhesabiwa kwa kutumia modeli za urekebishaji kwa kutumia modeli kutoka kwa maktaba ya sklearn au maktaba zingine zinazofanana. Timu yetu itatoa nakala tofauti juu ya jinsi hii inaweza kufanywa katika siku za usoni.

Kwa hivyo, kwa sasa, hadithi kuhusu data ya kiasi itaingiliwa, kwa sababu kuna nuances nyingine nyingi kuhusu jinsi ya kufanya vizuri utayarishaji wa data na usindikaji wa awali wa kazi tofauti, na mambo ya msingi ya data ya kiasi yamezingatiwa katika makala hii, na. sasa ni wakati wa kurejea data ya ubora ambayo tulitenganisha hatua kadhaa nyuma kutoka kwa zile za kiasi. Unaweza kubadilisha daftari hili upendavyo, ukibadilisha kwa kazi tofauti, ili usindikaji wa data uende haraka sana!

Data ya ubora

Kimsingi, kwa data ya ubora, njia ya usimbaji-Moto-moto hutumiwa ili kuibadilisha kutoka kwa kamba (au kitu) hadi nambari. Kabla ya kuendelea na hatua hii, hebu tutumie mchoro na msimbo hapo juu ili kukabiliana na maadili tupu.

df_categorical.nunique()

sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Karatasi ya kudanganya ya Notepad kwa uchakataji haraka wa Data

0. Ondoa nguzo zisizohitajika

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Je, idadi ya thamani tupu katika safu hii ni zaidi ya 50%?

print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True) #УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 
                                                                          #ΠΈΠΌΠ΅Π΅Ρ‚ большС 50% пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Futa mistari iliyo na maadili tupu

df_categorical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, 
                                   #Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Kuingiza thamani nasibu

import random
df_categorical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True)

3.2. Kuingiza thamani isiyobadilika

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="<Π’Π°ΡˆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ здСсь>")
df_categorical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_categorical[['колонка1', 'колонка2', 'колонка3']])
df_categorical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True)

Kwa hivyo, hatimaye tumepata kushughulikia nulls katika data ya ubora. Sasa ni wakati wa kutekeleza usimbaji-moto-moja kwenye maadili yaliyo kwenye hifadhidata yako. Njia hii hutumiwa mara nyingi sana ili kuhakikisha kwamba algoriti yako inaweza kujifunza kutoka kwa data ya ubora wa juu.

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res)

features_to_encode = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"]
for feature in features_to_encode:
    df_categorical = encode_and_bind(df_categorical, feature))

Kwa hivyo, hatimaye tumemaliza kuchakata data tofauti ya ubora na kiasi - wakati wa kuzichanganya tena

new_df = pd.concat([df_numerical,df_categorical], axis=1)

Baada ya kuunganisha hifadhidata kuwa moja, hatimaye tunaweza kutumia ubadilishaji wa data kwa kutumia MinMaxScaler kutoka maktaba ya sklearn. Hii itafanya maadili yetu kuwa kati ya 0 na 1, ambayo itasaidia wakati wa kufundisha mfano katika siku zijazo.

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)

Data hii sasa iko tayari kwa lolote - mitandao ya neva, algoriti za kawaida za ML, n.k.!

Katika makala hii, hatukuzingatia kufanya kazi na data ya mfululizo wa muda, kwa kuwa kwa data hiyo unapaswa kutumia mbinu tofauti za usindikaji, kulingana na kazi yako. Katika siku zijazo, timu yetu itatoa nakala tofauti kwa mada hii, na tunatumai kuwa itaweza kuleta kitu cha kufurahisha, kipya na muhimu katika maisha yako, kama hii.

Chanzo: mapenzi.com

Kuongeza maoni