achizitii_ministerul_sanatatii






Guvernul Romaniei, in litera si spiritul legii privind accesul liber la informatie, da acces celor interesati la diverse baze de date.
Eu, in acelasi spirit al accesului liber la informatie, o sa va arat cum se analizeaza bazele astea de date.
Pentru ca, din analiza diverselor baze de date, reies diverse chestii interesante.
O sa incepem cu un exemplu subtirel… insa nu atat de subtirel incat sa-l terminam intr-un singur episod: vor urma si altele.
In principiu, daca sunteti genul ‘geek’, o sa va distrati.
Daca vreti dezvaluiri, mai aveti de asteptat! Nu stiu cat, pentru ca ele vor fi o surpriza si pentru mine!
Daca vreti sa invatati “hands on”, pe dataset-uri din lumea reala, diverse chestii legate de Data Science, Machine Learning, AI… ati nimerit unde trebuie!
Singura chestie e ca o sa scriu fix cand o sa am timp si chef!
Asta nu inseamna ca nu raman deschis la sugestii 🙂

Ok!

Hai sa scobim in lista de achizitii a unitatilor sanitare din subordinea Ministerului Sanatatii din primele sase luni ale anului trecut, 2017.
Sa vedem ce gasim!
… si sa speram ca nu incalc nicio lege privind protectia datelor puse pe net 😀

Ne bazam, ca de obicei, pe python 3.6 si pe un macbook air pe care il tine bateria cateva ore!

In [1]:
import pandas as pd
path = '/Users/dan/Downloads/'
raport = 'raportms0106.2017.xlsx'
df = pd.read_excel(path + raport)
df.head()
Out[1]:
Denumire OF castigator CUI Of castigator LocalitateOfCastigator Adresa Of castigator Tara Of castigator Obiect Contract Tip Procedura Denumire AC CUI AC Nr anunt atribuire Data anunt atrib Contract Nr Data contract Valoare contract RON Cod CPV are contracte subsecvente valoare contracte subsecvente
0 A&A PRO DIAGNOSTIC S.R.L. RO 23068692 Bucuresti STR. GRAULUI, NR. 19, SECTOR 4 Romania Contract de Furnizare de react Cerere de oferta / Procedura simplificata Spitalul de Boli infectioase si Psihiatrie Bai… 3627501 205395 2017-01-17 12:52:41.637 257 2017-01-16 510 Reactivi de laborator (Rev.2) Nu 0.0
1 A&A PRO DIAGNOSTIC S.R.L. RO 23068692 Bucuresti STR. GRAULUI, NR. 19, SECTOR 4 Romania Contract de Furnizare de react Cerere de oferta / Procedura simplificata Spitalul de Boli infectioase si Psihiatrie Bai… 3627501 205395 2017-01-17 12:52:41.637 257 2017-01-16 922.5 Reactivi de laborator (Rev.2) Nu 0.0
2 A&A PRO DIAGNOSTIC S.R.L. RO 23068692 Bucuresti STR. GRAULUI, NR. 19, SECTOR 4 Romania Contract de Furnizare de react Cerere de oferta / Procedura simplificata Spitalul de Boli infectioase si Psihiatrie Bai… 3627501 205395 2017-01-17 12:52:41.637 257 2017-01-16 5500 Reactivi de laborator (Rev.2) Nu 0.0
3 A&A PRO DIAGNOSTIC S.R.L. RO 23068692 Bucuresti STR. GRAULUI, NR. 19, SECTOR 4 Romania Contract de Furnizare de react Cerere de oferta / Procedura simplificata Spitalul de Boli infectioase si Psihiatrie Bai… 3627501 205395 2017-01-17 12:52:41.637 260 2017-01-16 4650 Reactivi de laborator (Rev.2) Nu 0.0
4 A&A PRO DIAGNOSTIC S.R.L. RO 23068692 Bucuresti STR. GRAULUI, NR. 19, SECTOR 4 Romania Contract de Furnizare de react Cerere de oferta / Procedura simplificata Spitalul de Boli infectioase si Psihiatrie Bai… 3627501 205395 2017-01-17 12:52:41.637 262 2017-01-16 1782 Reactivi de laborator (Rev.2) Nu 0.0

Cam asa arata forma bruta a bazei de date: un document excel populat cu valori pe care MS le-a considerat semnificative.
Mai sus aveti doar capul de tabel – head-ul, cum ar veni!.
Este un document destul de impozant (are peste 50 Mb) si nu prea poate fi analizat eficient in ms-excel sau open office sau mai stiu eu ce softuri de secretariat achizitionate in perioada cunoscuta sub numele de “dosarul Microsoft”.
Cam asta e unul dintre motivele pentru care exista pe Terra analistii.
Asadar, daca pe liniile tabelului avem firmele castigatoare de contracte de achizitii, pe coloane avem atributele acestor contracte.
Primul pas pe care ar trebui sa-l faca orice analist ar fi sa inteleaga despre ce naiba e vorba in propozitie!
Nu stiu mai nimic despre industria asta, nici despre legislatia careia i se supune, nu stiu actorii… sunt cam varza!
Asa ca n-am incotro si voi incepe, demn, sa bajbai prin excelul asta, sa vad ce gasesc!
Incep cu banuiala ca in figura de mai sus n-au incaput toate coloanele! Ca sa verific banuiala asta, o sa le printez separat:

In [2]:
df.axes
Out[2]:
[RangeIndex(start=0, stop=29250, step=1),
 Index(['Denumire OF castigator', 'CUI Of castigator', 'LocalitateOfCastigator',
        'Adresa Of castigator', 'Tara Of castigator', 'Obiect Contract',
        'Tip Procedura', 'Denumire AC', 'CUI AC', 'Nr anunt atribuire',
        'Data anunt atrib', 'Contract Nr', 'Data contract',
        'Valoare contract RON', 'Cod CPV', 'are contracte subsecvente',
        'valoare contracte subsecvente'],
       dtype='object')]

Bun!
Cred ca avem tot ce ne trebuie si putem purcede la identificarea unor insight-uri.
Adica sa nu asteptam conferinta de presa a MS in care sa ne zica cineva ce contine de fapt baza de date si cum a fost ea facuta, ci sa vedem cu ochii nostri!
Primul lucru care sare in ochi este prezenta lui “OF” in in primele 5 coloane si absenta lui in ultimele 12!
Adica “Denumire OF castigator”, “CUI OF castigator” …
Mie, ca analist, asta imi spune ca pana si amaratul asta de tabel excel a fost implementat pornind de la un template fie furat de pe net, fie cumparat de la vreo firma de IT de niste oameni care nu prea au nicio legatura cu calculatorul.
Tabelul, cel mai probabil, a fost generat de o interogare a unei baze de date relationale, de genul SQL. Iar denumirile coloanelor sunt cele originale, din tutorialele incluse in pret.
As putea verifica, dar e ilegal! (o sa va invat alta data cum se face asta)
Iar plictisitul de admin n-a considerat ca trebuie schimbate, desi banuiesc ca i-o fi atras cineva atentia pana acum.
Dear admin, vezi ca e Ziua Limbii Romane (sau a fost zilele astea). Schimba “OF” cu “a lu’“.
O sa ai “Denumirea lu’ castigator“, sau “Adresa lu’ castigator“.
Suna mai bine decat “Denumirea OF castigator“!

Ma rog, hai sa vedem si cate firme au semnat contracte cu unitati ale Ministerului Sanatatii!
Repet, baza de date e pe primele 6 luni din 2017.

In [3]:
print(len(df['Denumire OF castigator'].unique()))
print(len(df))
1002
29250

Asta inseamna ca 1002 firme au castigat 29.250 de contracte.
Banuiesc ca va mai amintiti cum se calculeaza media:

In [4]:
print('In medie, o firma a castigat {0} contracte'.format(len(df)/len(df['Denumire OF castigator'].unique())))
In medie, o firma a castigat 29.191616766467067 contracte

Da, calculatoarele au boala asta: sa fie mai exacte decat cere bunul simt.
De-aia m-am bucurat cand am gasit un modul python care se ocupa fix de boala asta.
Se cheama – cum altfel? – humanize!

In [5]:
import humanize as hm
print('In medie, o firma a castigat {0} contracte'.format(hm.intword(len(df)/len(df['Denumire OF castigator'].unique()))))
In medie, o firma a castigat 29 contracte

E mai citibil, de acord? Cifra este numai buna de anuntat ca statistica oficiala

Ceea ce multa lume nu stie, dar intuieste, e ca statisticile, cateodata, mint cu nerusinare.
Asta e si cazul de fata!
Degeaba va chinuiti, media e calculata corect, insa semnificatia ei este insidioasa si profund mincinoasa.
Hai sa vedem cate contracte a semnat fiecare dintre cele 1002 firme castigatoare!

In [6]:
df['Denumire OF castigator'].value_counts()
Out[6]:
FARMEXPERT D.C.I. S.R.L.                                                           2802
MEDIPLUS EXIM S.R.L.                                                               2048
FARMEXIM S.A.                                                                      1185
PHARMAFARM S.A.                                                                    1105
FRESENIUS KABI ROMANIA S.R.L.                                                      1048
EUROPHARM HOLDING S.A.                                                              959
FELSIN FARM S.R.L.                                                                  923
FARMACEUTICA REMEDIA DISTRIBUTION & LOGISTICS S.R.L.                                892
B.BRAUN MEDICAL S.R.L.                                                              838
Pharma S.A.                                                                         645
FIDELIO FARM S.R.L.                                                                 416
ACTAVIS S.R.L.                                                                      407
Romastru Trading S.R.L.                                                             380
COMPANIA NATIONALA UNIFARM                                                          269
FILDAS TRADING S.R.L.                                                               268
SC PFIZER ROMANIA SRL                                                               245
A.M.S. 2000 TRADING IMPEX S.R.L.                                                    231
ROMFARMACHIM S.A.                                                                   221
CRIO - 2 S.R.L.                                                                     220
INFOMED FLUIDS S.R.L.                                                               209
VALDOMEDICA TRADING S.R.L.                                                          203
HYPERICUM S.R.L.                                                                    201
CLINI-LAB S.R.L.                                                                    180
STEDYAN COM S.R.L.                                                                  177
Sante International S.A.                                                            176
ROMBIOMEDICA S.R.L.                                                                 163
ROCHE ROMANIA S.R.L.                                                                157
MEDICLIM S.R.L.                                                                     157
BELLA ROMANIA IMPEX S.R.L.                                                          155
GEOCOR TRADE IMP-EXP S.R.L.                                                         141
                                                                                   ... 
MATE-FIN S.R.L.                                                                       1
MEDI SENSE SRL                                                                        1
ORTOPEDICS HYPOKRAT S.R.L.                                                            1
Pro Analysis Systems S.R.L.                                                           1
TITUS&SONS  S.R.L                                                                     1
AQUATOR S.R.L.                                                                        1
BURAF EXIM S.R.L.                                                                     1
ASCENSO S.R.L.                                                                        1
AMRIX TECHNOLOGIES S.R.L.                                                             1
RO ET CO INTERNATIONAL S.A.                                                           1
FIPRO TRADE S.R.L.                                                                    1
ENTERPRISE FOCUSED SOLUTIONS SRL                                                      1
Institutul National de Cercetare "CANTACUZINO"                                        1
MEDIROM TRADING S.R.L.                                                                1
AIRDDSDEJ- Unitate protejata Sectia Minitipografia Digitala "Tipografia Sprint"       1
AWE INFRA SRL                                                                         1
Power Medical                                                                         1
S.C. HELP 92 S.R.L.                                                                   1
GTA TELECOMUNICATION SRL                                                              1
MESSYSTECH S.R.L.                                                                     1
PRO CARDIA S.R.L.                                                                     1
HYLLAN PHARMA SRL                                                                     1
SC UNION CO SRL                                                                       1
EROMEDIKS S.R.L.                                                                      1
Livorno Vision                                                                        1
DYNAMIC BUSINESS S.R.L.                                                               1
GENOMICALL SOLUTIONS SRL                                                              1
SC VERICOM 2001 SRL                                                                   1
EUROCIV CONS S.R.L.                                                                   1
FLAMAR 99 S.R.L.                                                                      1
Name: Denumire OF castigator, Length: 1002, dtype: int64

Hopa!
Doua chestii sar in ochi chiar si celor care nu au o pasiune deosebita pentru statistica!

  1. Firma de pe primul loc a castigat peste 2800 de contracte, adica aproape 10 la suta din totalul de 29.250 de contracte.
  2. Sunt foarte multe firme care au castigat cate un singur contract.

Ca sa obligam statistica sa nu ne mai minta chiar asa, in fata, putem sa scobim inca putin, sa vedem ce se afla sub suprafata!
Hai sa facem o lista cu looserii – firmele care au castigat un singur contract – si sa vedem cati sunt:

In [7]:
looseri = []
for i in range (0, len(df['Denumire OF castigator'].value_counts())):
    if df['Denumire OF castigator'].value_counts()[i] == 1:
        looseri.append('looser')
print('{0} firme au castigat cate un singur contract'.format(len(looseri)))
308 firme au castigat cate un singur contract

Adica, din 1002 firme, 308 au castigat cate un singur contract.
Adica vreo 30 la suta.
In timp ce o singura firma a castigat aproape 3 mii de contracte.
Ei, deja media aia de 29 de contracte per firma suna stupid si lipsit de semnficatie, nu-i asa?

Sa nu uitam: vorbim de o baza de date pe 6 luni.
Sa zicem ca fiecare luna are 22 de zile lucratoare (adica in care se puteau semna fizic niste contracte), deci vorbim in total de o perioada utila de aproximativ 132 de zile.
Sa vedem cate firme au semnat cel putin un contract pe zi cu Ministerul Sanatatii:

In [8]:
norocosi = []
for i in range (0, len(df['Denumire OF castigator'].value_counts())):
    if df['Denumire OF castigator'].value_counts()[i] >= 132:
        norocosi.append('norocos')
print('{0} firme au semnat cel putin cate un contract pe zi cu Ministerul Sanatatii'.format(len(norocosi)))
32 firme au semnat cel putin cate un contract pe zi cu Ministerul Sanatatii

Asta suna deja a titlu!

Sa nu ne grabim, zic!
Ideea acestei postari era sa va arat cum se scobeste intr-o baza de date, nu sa produc stiri.
Dar asta e: obiceiurile vechi mor greu 😀

Deocamdata las la pastrare informatia asta, si trec la altele, in speranta ca ma voi dumiri pana la urma cu toate cele.
Deci, vorba cantecului: show me the money!
Sa vedem despre ce bani vorbim!

In [9]:
bani = []
for i in range (0, len(df)):
    a = df['Valoare contract RON'][i]
    bani.append(int(a))
bani
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-2449decbc2a7> in <module>()
      2 for i in range (0, len(df)):
      3     a = df['Valoare contract RON'][i]
----> 4     bani.append(int(a))
      5 bani

ValueError: invalid literal for int() with base 10: 'Reactivi de laborator (Rev.2)'

Evident, eroare!
Se pare ca un destept a scris in loc de valoarea contractului (in RON), o lista de cumparaturi!
Ah, urasc adminii cu job la stat!

In [10]:
for i in range (0, len(df)):
    if df['Valoare contract RON'][i] == 'Reactivi de laborator (Rev.2)':
        print('Pozitia in tabel: ', i)
        print(df.iloc[i])
Pozitia in tabel:  23714
Denumire OF castigator                                   STERICYCLE ROMANIA S.R.L.
CUI Of castigator                                                      RO 15071999
LocalitateOfCastigator                                                      Jilava
Adresa Of castigator                                        Sos. Giurgiului, Nr. 5
Tara Of castigator                                                         Romania
Obiect Contract                  Servicii de colectare transport si eliminare f...
Tip Procedura                                                              4617719
Denumire AC                                                                    NaN
CUI AC                                                                         NaN
Nr anunt atribuire                                                             277
Data anunt atrib                                               2017-01-09 00:00:00
Contract Nr                                        Achizitie reactivi de laborator
Data contract                                                                  NaT
Valoare contract RON                                 Reactivi de laborator (Rev.2)
Cod CPV                                                                      18989
are contracte subsecvente                                                      NaN
valoare contracte subsecvente                                                  NaN
Name: 23714, dtype: object

Cam asa arata fisa gresita.
Dincolo de problemele mele personale cu salariatii statului, se vad de la o posta cateva chestii nashpa:

  1. Valori NaN & NaT – ceea ce inseamna lipsa oricarei inregistrari la rubrica respectiva
  2. Baza de date n-a fost verificata de nimeni nici inainte nici dupa ce a fost facuta publica
    </strong>

Poate cineva sa-mi spuna daca, cand si mai ales cum verifica MS contractele astea?
Linge cineva vreun biblioraft din cand in cand?
Si daca da, pe ce criterii selecteaza dosarele?

Ma rog, sa nu ma las distrat de amanuntele astea!
Parca incercam sa vad despre ce bani vorbim.
Hai sa ma fac ca nu vad inregistrarea gresita: o sterg de-a binelea!

In [11]:
df.drop(df.index[23714], inplace = True)
df.reset_index(inplace = True) # asta ca sa nu mi se bulibasheasca toate alea
In [12]:
bani = []
for i in range (0, len(df)):
    a = df['Valoare contract RON'][i]
    bani.append(int(a))
sum(bani)
Out[12]:
1036284919

Da, am uitat sa umanizez…

In [13]:
print(hm.intword(sum(bani)))
1.0 billion

Mdap, vorbim despre un miliard de RON.
De fapt, de ceva mai mult… dar 36 de milioane pare deja maruntzish!

In [14]:
print('Asta inseamna ca, in medie, fiecare firma a incasat {0} RON'
     .format(hm.intword(sum(bani)/len(df['Denumire OF castigator'].unique()))))
Asta inseamna ca, in medie, fiecare firma a incasat 1.0 million RON

Un milion la sase luni nu e de lepadat!
Insa media asta, asa cum v-am zis mai inainte, este inselatoare.
30% din firme au un singur contract fiecare, in timp ce doar vreo 5 au peste 1.000 de contracte fiecare.
Asa ca hai sa mai scobim:

In [15]:
d = {}
for i in range(0, len(df)):
    d.setdefault(df['Denumire OF castigator'][i], []).append(bani[i])
data = pd.DataFrame()
data['firma'] = d.keys()
data['bani'] = d.values()
data.head()
Out[15]:
firma bani
0 A&A PRO DIAGNOSTIC S.R.L. [510, 922, 5500, 4650, 1782, 234, 1393, 2000, …
1 A&D Promo Distribution SRL [23965, 2560, 6350, 1560, 2400, 297, 2726, 100…
2 A.M.S. 2000 TRADING IMPEX S.R.L. [425, 665, 2997, 4305, 1800, 711, 1261, 3750, …
3 AB T & CO S.R.L. [3200, 3000, 2100, 32365, 11800, 3473, 1600, 1…
4 ACTAVIS S.R.L. [43940, 73755, 7056, 7376, 30292, 6832, 106690…

E-te, na!
N-am ce face cu sumele defalcate, imi trebuie suma lor!

In [16]:
suma_totala = []
for i in range(0, len(data)):
    a = sum(list(data['bani'][i]))
    suma_totala.append(a)
data['suma_totala'] = suma_totala
data.sort_values('suma_totala', ascending=False, inplace = True)
data.reset_index(inplace = True)
data.head()
Out[16]:
index firma bani suma_totala
0 168 FARMEXPERT D.C.I. S.R.L. [136782, 1181, 360, 2820, 2730, 2450, 172770, … 150540923
1 217 MEDIPLUS EXIM S.R.L. [36000, 26676, 16250, 5200, 19632, 896, 4425, … 116392843
2 166 FARMEXIM S.A. [24400, 2157, 3019, 4307, 4991, 32669, 165, 41… 39409518
3 35 B.BRAUN MEDICAL S.R.L. [22560, 1330, 52750, 8800, 3384, 5496, 17500, … 33630454
4 169 FELSIN FARM S.R.L. [25652, 14928, 570, 283, 616, 4290, 10, 135, 2… 29269115

Ladies and transgenders, we have some winners!
Peste 150 de milioane din miliardul ala cheltuit pe achizitii s-au dus spre o singura firma: FARMEXPERT D.C.I. S.R.L.
Adica vreo 15 la suta!
Chiar, Hexifarma o mai exista?

In [17]:
[x for x in data['firma'] if x.startswith('HEX')]
Out[17]:
['HEXAMEDICAL HEALTH']

Nope, nu mai exista!

Sa revenim la winner! – informatii gasite la o cautare cu goagal
Firma a avut in 2017 o cifra de afaceri de vreo 3 miliarde RON.
Profitul net raportat a fost de vreo 90 de milioane.
A avut, tot in 2017, aproape 1000 de angajati.
Este o multinationala.
Pe scurt… sa-i fie de bine!

Pe noi ne intereseaza statistica!
Sa vedem cum au facut contractele:

In [18]:
d = {}
for i in range(0, len(df)):
    d.setdefault(df['Denumire OF castigator'][i], []).append(df['Tip Procedura'][i])
tip_contracte = pd.DataFrame()
tip_contracte['firma'] = d.keys()
tip_contracte['tip_procedura'] = d.values()
data['tip_procedura'] = tip_contracte['tip_procedura']
data.head()
Out[18]:
index firma bani suma_totala tip_procedura
0 168 FARMEXPERT D.C.I. S.R.L. [136782, 1181, 360, 2820, 2730, 2450, 172770, … 150540923 [Cerere de oferta / Procedura simplificata, Ce…
1 217 MEDIPLUS EXIM S.R.L. [36000, 26676, 16250, 5200, 19632, 896, 4425, … 116392843 [Cerere de oferta / Procedura simplificata, Ce…
2 166 FARMEXIM S.A. [24400, 2157, 3019, 4307, 4991, 32669, 165, 41… 39409518 [Cerere de oferta / Procedura simplificata, Ce…
3 35 B.BRAUN MEDICAL S.R.L. [22560, 1330, 52750, 8800, 3384, 5496, 17500, … 33630454 [Cerere de oferta / Procedura simplificata, Ce…
4 169 FELSIN FARM S.R.L. [25652, 14928, 570, 283, 616, 4290, 10, 135, 2… 29269115 [Cerere de oferta / Procedura simplificata, Ce…
In [19]:
print(len(data['tip_procedura'][0]))
33
In [20]:
set(data['tip_procedura'][0])
Out[20]:
{'Cerere de oferta / Procedura simplificata', 'Licitatie deschisa'}
In [21]:
print(len([x for x in data['tip_procedura'][0] if x == 'Cerere de oferta / Procedura simplificata']))
print(len([x for x in data['tip_procedura'][0] if x == 'Licitatie deschisa']))
17
16

Asta inseamna ca firma asta a semnat 33 de contracte, din care 17 prin procedura simplificata si 16 prin licitatie deschisa.

Uite, ca m-am luat cu vorba si inca habar n-am cu ce fac astia afaceri!
Sa vedem, zic, marfa!

In primul rand, TOP 10!

In [22]:
df['Cod CPV'].value_counts()[0:10]
Out[22]:
Diverse medicamente (Rev.2)                                  4207
Produse farmaceutice (Rev.2)                                 3472
Consumabile medicale (Rev.2)                                 2239
Reactivi de laborator (Rev.2)                                1527
Antibacterieni pentru uz sistemic (Rev.2)                    1036
Antineoplazice (Rev.2)                                        893
Medicamente pentru tractul digestiv si metabolism (Rev.2)     681
Antineoplazice si imunomodulatoare (Rev.2)                    658
Reactivi pentru analize de sange (Rev.2)                      580
Antihemoragice (Rev.2)                                        449
Name: Cod CPV, dtype: int64

Na! Pe primul loc – “diverse medicamente”.
Habar n-am ce inseamna asta!
La prima vedere, se pare ca nu exista un standard al denumirilor achizitiilor!
Poate, totusi, ma insel si e ceva cu (REV. 2) ala…

Hai sa verific!

In [23]:
print('Numarul achizitiilor unice (cu aceeasi denumire): ', len(df['Cod CPV'].unique()))
Numarul achizitiilor unice (cu aceeasi denumire):  394
In [24]:
rev = [x for x in df['Cod CPV'] if x.endswith('Rev.2)')]
print('Numarul achizitiilor unice care contin Rev.2:', len(set(rev)))
Numarul achizitiilor unice care contin Rev.2: 394

Na, dracie!
Absolut toate achizitiile au acest cod la final!
… si habar n-am ce inseamna!
De ce naiba l-au mai pus, daca nu diferentiaza nimic?
Insa stiu un lucru: nu exista un nomenclator standard al achizitiilor; fiecare unitate din subordinea MS scrie acolo ce-i trece prin cap
Nu-i de mirare ca diverse medicamente e pe primul loc!

Hai ca m-am plictisit!
Data viitoare mai scobim, sa vedem si care sunt unitatile din subordinea MS care au facut achizitii … cine, ce, de la cine…
O sa ne jucam si cu niste grafice, niste geoplot-uri…
Sa fiti cuminti!

 

 

http://musetoiu.ro/wp-content/uploads/2018/08/achizitii-1024x539.jpghttp://musetoiu.ro/wp-content/uploads/2018/08/achizitii-150x150.jpgdan musetoiuMLdata science,ministerul sanatatii,python
achizitii_ministerul_sanatatii /*! * * Twitter Bootstrap * */ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { ...