PySciBlog

Python is under investigation of future

Таблицы pandas в действии

Вступление

Для наглядного и в тоже время интересного примера работы с таблицами pandas, можно использовать алгоритм оценки реальной химической нагрузки на человека за счет загрязнения воздушной среды.

Реальная химическая нагрузка - это сума всех химических загрязнений, которые получает человек за определенный период времени. Поэтому сразу определим выходные данные:

  • 1. Время пребывания человека в разных условиях $t, часов$
  • 2. Концентрация згрязняющих веществ в разных условиях $C, мг/м^3$

В данном примере условия, это места где человек может находиться. Я выбрал вот такие:

Производственное помещение
Жилая площадь
Общественный автотранспорт
Жилая среда
Место рекреации

In [67]:
import pandas as pd
import numpy as np
from itertools import product
from IPython.display import HTML
In [72]:
data=np.array([[['Производственное помещение'],['Амиак','Карбон (II) оксид']],
        [['Жилая площадь'],['Формальдегид','Нафталин','Ацетон']],
        [['Общественный автотранспорт'],['Карбон (II) оксид','Нитроген (IV) оксид',
                   'Свинец','Пиль неорганичнеская','Бенз(а)пирен']],
        [['Жилая среда'],['Формальдегид','Карбон (II) оксид','Бенз(а)пирен']],
        [['Место рекреации'],['Карбон (II) оксид','Нитроген (IV)','Бензол']]])

coords=[]
for i in range(len(data)):coords+=(list(product(data[i][0],data[i][1])))

index = pd.MultiIndex.from_tuples(coords,names=['Место пребывания','Загрезненные вещества'])

df = pd.DataFrame([0.007,5.004,0.002,0.035,0.0234,1.4,0.07,0.0002,3,1.8*10**-6,0.5,0.001,10**-6,0.03,0.005,0.903],
    index,['С, мг/м3'])

df['КН']=pd.Series([3,4,2,2,3,4,2,1,2,1,4,2,1,4,2,4], df.index)
df['ГДК, мг/м3']=pd.Series([2,1,0.003,0.003,0.35,1,2,0.0003,0.1,10**-6,1,0.003,10**-6,1,2,0.1],df.index)
HTML('<font size=2>'+df.to_html()+'</font>')
Out[72]:
С, мг/м3 КН ГДК, мг/м3
Место пребывания Загрезненные вещества
Производственное помещение Амиак 0.007000 3 2.000000
Карбон (II) оксид 5.004000 4 1.000000
Жилая площадь Формальдегид 0.002000 2 0.003000
Нафталин 0.035000 2 0.003000
Ацетон 0.023400 3 0.350000
Общественный автотранспорт Карбон (II) оксид 1.400000 4 1.000000
Нитроген (IV) оксид 0.070000 2 2.000000
Свинец 0.000200 1 0.000300
Пиль неорганичнеская 3.000000 2 0.100000
Бенз(а)пирен 0.000002 1 0.000001
Жилая среда Формальдегид 0.500000 4 1.000000
Карбон (II) оксид 0.001000 2 0.003000
Бенз(а)пирен 0.000001 1 0.000001
Место рекреации Карбон (II) оксид 0.030000 4 1.000000
Нитроген (IV) 0.005000 2 2.000000
Бензол 0.903000 4 0.100000
In [77]:
time=[8,10,2,2,2]
places=df.index.get_level_values(0).unique()
df1=pd.DataFrame(pd.Series(dict(zip(places,time)),name='$t$'))
df1['$t/24$']=df1['$t$']/24
df1
Out[77]:
$t$ $t/24$
Жилая площадь 10 0.416667
Жилая среда 2 0.083333
Место рекреации 2 0.083333
Общественный автотранспорт 2 0.083333
Производственное помещение 8 0.333333
In [78]:
df['Кратность перевишения ГДК']=df['С, мг/м3']/df['ГДК, мг/м3']
elements=df.index.get_level_values(1)

funk=lambda koef1,koef2,k,n:k*(koef1)**(koef2*abs(np.log10(k))*n)

KN,k=df['КН'],df['Кратность перевишения ГДК']

temp=[]
for i in range(len(KN)):
                   
    if KN[i]==1: temp+=[funk(3,2.89,k[i],1)]
    elif KN[i]==2: temp+=[funk(3/2,1.55,k[i],1)]
    elif KN[i]==3:temp+=[funk(3/2,1.55,k[i],0)]
    else:temp+=[funk(3/4,1.05,k[i],1)]

df['Приведение до 3-му классу опасности']=temp

HTML('<font size=2>'+df.to_html()+'</font>')
Out[78]:
С, мг/м3 КН ГДК, мг/м3 Кратность перевишения ГДК Приведение до 3-му классу опасности
Место пребывания Загрезненные вещества
Производственное помещение Амиак 0.007000 3 2.000000 0.003500 0.003500
Карбон (II) оксид 5.004000 4 1.000000 5.004000 0.000000
Жилая площадь Формальдегид 0.002000 2 0.003000 0.666667 0.666667
Нафталин 0.035000 2 0.003000 11.666667 11.666667
Ацетон 0.023400 3 0.350000 0.066857 0.066857
Общественный автотранспорт Карбон (II) оксид 1.400000 4 1.000000 1.400000 0.000000
Нитроген (IV) оксид 0.070000 2 2.000000 0.035000 0.035000
Свинец 0.000200 1 0.000300 0.666667 1.166051
Пиль неорганичнеская 3.000000 2 0.100000 30.000000 30.000000
Бенз(а)пирен 0.000002 1 0.000001 1.800000 4.048208
Жилая среда Формальдегид 0.500000 4 1.000000 0.500000 0.000000
Карбон (II) оксид 0.001000 2 0.003000 0.333333 0.333333
Бенз(а)пирен 0.000001 1 0.000001 1.000000 1.000000
Место рекреации Карбон (II) оксид 0.030000 4 1.000000 0.030000 0.000000
Нитроген (IV) 0.005000 2 2.000000 0.002500 0.002500
Бензол 0.903000 4 0.100000 9.030000 0.000000
In [79]:
Pi=[]
for i in places:
    Pi+=[sum(df.xs(i)['Приведение до 3-му классу опасности']**2)**0.5]


pd.DataFrame(pd.Series(dict(zip(places,Pi)),name='$P_i$'))
Out[79]:
$P_i$
Жилая площадь 11.685890
Жилая среда 1.054093
Место рекреации 0.002500
Общественный автотранспорт 30.294370
Производственное помещение 0.003500
In [80]:
pd.DataFrame(pd.Series(dict(zip(places,Pi*df1['$t/24$'])),name='$S_i$'))
Out[80]:
$S_i$
Жилая площадь 0.973824
Жилая среда 0.087841
Место рекреации 0.000833
Общественный автотранспорт 2.524531
Производственное помещение 0.001458

posts pandas