Вступление
Для наглядного и в тоже время интересного примера работы с таблицами 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]:
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]:
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]:
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]:
In [80]:
pd.DataFrame(pd.Series(dict(zip(places,Pi*df1['$t/24$'])),name='$S_i$'))
Out[80]: