எளிய தமிழில் Pandas-13_Final

Real-time Example

ஒரு தொலைக்காட்சி நிறுவனத்தில் உள்ள அனைத்து புரோகிராம்களின் id, அவை எந்த வகையின் கீழ் அமைந்திருக்கின்றன, அவை ஒளிபரப்பப்பட்ட தேதி, அவற்றிருக்கு வழங்கப்பட்ட ரேடிங், ஸ்கோர் போன்ற தரவுகளை கற்பனையாக உருவாக்கி அவற்றின் அடிப்படையில் நாம் இந்த எடுத்துக்காட்டை செய்து பார்க்கப் போகிறோம். இந்த கற்பனைத் தரவு பின்வருமாறு. 

         category       rating   telecasted_date  program_id  score
0                  news      3  12/26/2020 12:06       67547     65
1                  news      4  10/15/2020 12:06       87465     75
2                  news      3  12/26/2020 12:06       88756     87
3                  news      3  12/26/2020 12:06       98456     56
4                  news      4  10/15/2020 12:06       90908     46
5                  news      3  12/26/2020 12:06       34355     98
6                  news      3  12/26/2020 12:06       87643     95
7                  news      3  12/26/2020 12:06       68864    100
8    Variety shows       4 12/26/2019 12:06       23254     78
9    Variety shows       4 12/26/2019 12:06       88997     56
10  Variety shows       2   8/12/2019 12:06       57636     87
11  Variety shows       5    6/17/2019 12:06      56643     56
12  Variety shows       4  12/26/2019 12:06      67765     45
13  Variety shows       4  12/26/2019 12:06      65499     64
14  Variety shows       3    6/19/2019 12:06      76439     86
15  Variety shows       4  12/26/2019 12:06      77865     57
16  Variety shows       5    6/17/2019 12:06      76638     87
17  Variety shows       4   12/26/2019 12:06     89097     75
18  Variety shows       3    6/19/2019 12:06      87539     89
19  Variety shows       4   12/26/2019 12:06     78754    100

பொதுவாக இதுபோன்ற raw தரவுகளின் மீது ஒருசில logic-ஐ செலுத்தி புதிய தரவுகளை உருவாக்கி அவற்றையே நமது பயன்பாட்டிற்கு எடுத்துக்கொள்வோம். இங்கும் பின்வரும் விதிகளின் அடிப்படையில் புதிய தரவுகளை உருவாக்கப் போகிறோம். 

1. category, rating ஆகியவற்றில் உள்ள தரவுகளை _ மூலம் இணைத்து code எனும் புதிய column – இன் கீழ் வெளிப்படுத்த வேண்டும். எடுத்துக்காட்டாக category=news, rating=3 எனில் code=news_3 என இருக்க வேண்டும்.

2. telecasted_date என்ற column-ல் உள்ள தேதியின் அடிப்படையில் telecasted_quarter என்ற column-ஐ உருவாக்க வேண்டும். எடுத்துக்காட்டாக 12/26/2020 எனும் தேதியை வைத்து உருவாக்கப்படும் quarter-ன் மதிப்பு ‘2020 Quarter 4’ எனும் வடிவில் இருக்க வேண்டும்.

3. ஒரு category-யின் கீழ் ஒரே ரேட்டிங்கை பெற்றிருக்கும் புரோகிராம்களின் எண்ணிக்கை 5-க்கு கீழ் இருந்தால் avg_score எனும் தலைப்பின் கீழ் அவை அனைத்தும் பெற்றுள்ள ஸ்கோரின் சராசரியைக் கண்டுபிடித்து வெளிப்படுத்த வேண்டும். 5-க்கும் மேல் இருந்தால் முதல் ஐந்து புரோகிராம்கள் பெற்றுள்ள ஸ்கோரின் சராசரியை மட்டும் கண்டுபிடித்து வெளிப்படுத்த வேண்டும். எடுத்துக்காட்டாக இங்கு நியூஸ் எனும் கேட்டகிரியின் கீழ் 3 எனும் ரேட்டிங்கை பெற்றிருக்கும் புரோகிராம்களின் எண்ணிக்கை மொத்தம் 6. ஆகவே முதல் 5 புரோகிராம்களின் சராசரியான (65+87+56+98+95)/5 = 80.2 ஆகியவற்றை வெளிப்படுத்த வேண்டும். அதுவே நியூஸ் எனும் கேட்டகிரியின் கீழ் 4 எனும் ரேட்டிங்கை பெற்றிருக்கும் புரோகிராம்களின் எண்ணிக்கை மொத்தம் 2 தான். ஆகவே அந்த இரண்டின் சராசரியை மட்டும் வெளிப்படுத்தினால் போதும். 

மேற்குறிப்பிட்ட மூன்று லாஜிக் ஐயும் பாண்டாஸ் மூலம் செய்து வெளிப்படுத்துவதற்கான நிரல் பின்வருமாறு அமையும். 


import pandas as pd
from datetime import datetime,timedelta
import numpy as np
df = pd.read_csv('./13_input_data.csv')
print (df)
pd.set_option("display.max_columns",8)
df1 = pd.DataFrame()
df1['code'] = df['category'].astype(str)+'_'+df['rating'].astype(str)
df1['rating'] = df['rating']
df1['year'] = pd.DatetimeIndex(df['telecasted_date']).year
df1['telecasted_quarter'] = df1['year'].astype(str)+' Quarter '+pd.DatetimeIndex(df['telecasted_date']).quarter.astype(str)
df1['score'] = df['score']
print (df1.head(3))
df2 = df1.groupby(['code','rating','year','telecasted_quarter'])['rating'].count().reset_index(name="total_programs")
df2['greater_than_5'] = df2['total_programs'].apply(lambda x: 'YES' if x >= 5 else 'No')
df3 = df1.groupby(['code','rating','year','telecasted_quarter'])['score'].mean().reset_index(name="all")
df2['all'] = df3['all']
df4 = df1.groupby(['code','rating','year','telecasted_quarter'])['score']
l1 = []
for i,j in df4:
y = float(j[0:5].mean())
l1.append(y)
df2['first_5'] = pd.Series(l1)
print (df2)
l2 = []
for i,j,k in zip(df2['all'],df2['first_5'],df2['greater_than_5']):
if k=='YES':
l2.append(j)
else:
l2.append(i)
df2['avg_score'] = pd.Series(l2)
df2 = df2[['code','telecasted_quarter','avg_score']]
print (df2)

நிரலுக்கான விளக்கம்:

1. முதலில் கொடுக்கப்பட்டுள்ள தரவுகள் df எனும் டேட்டாஃப்பிரேமுக்குள் சேமிக்கப்படுகின்றன. 
பின் df1 எனும் ஒரு empty  டேட்டாஃப்பிரேமை உருவாக்கி அதற்குள் code எனும் column-ன் கீழ் df-லிருந்து கேட்டகிரி மற்றும்  ரேட்டிங் ஆகியவற்றில் உள்ள மதிப்புகளை எடுத்து அதனை underscore மூலம் இணைத்து சேமிக்கிறோம். 
பின் telecasted_date என்ற column-ல் இருக்கும் தேதியிலிருந்து year மற்றும் quarter ஆகியவற்றைப் பிரித்து அதனை நாம் விரும்பும் வடிவில் Quarter எனும் வார்த்தையையும் இணைத்து telecasted_quarter என்ற column-ன் கீழ் சேமித்துள்ளோம்.
பின் ஒரே வகையான கேட்டகிரி மற்றும் ரேட்டிங்கை குரூப் செய்து ஸ்கோரைக் கணக்கிட வேண்டும் என்பதால், இதற்குத் தேவையான rating, score ஆகியவற்றையும் df1-க்குள் சேமித்து உள்ளோம். 

df1 = pd.DataFrame()
df1[‘code’] = df[‘category’].astype(str)+’_’+df[‘rating’].astype(str)
df1[‘rating’] = df[‘rating’]
df1[‘year’] = pd.DatetimeIndex(df[‘telecasted_date’]).year
df1[‘telecasted_quarter’] = df1[‘year’].astype(str)+’ Quarter ‘+pd.DatetimeIndex(df[‘telecasted_date’]).quarter.astype(str)
df1[‘score’] = df[‘score’]
print (df1.head(3))

     code    rating  year   telecasted_quarter  score
0  news_3       3  2020     2020 Quarter 4     65
1  news_4       4  2020     2020 Quarter 4     75
2  news_3       3  2020     2020 Quarter 4     87

2. பின் ஒரே வகையான கேட்டகிரி மற்றும் ரேட்டிங்கை குரூப் செய்து, ஒவ்வொரு தனித்தனி குரூப்பிலும் எத்தனை புரோகிராம் உள்ளது எனக் கணக்கிட்டு அதனை total_programs எனும் தலைப்பின் கீழ் அமைக்கிறது. இந்த புதிய டேட்டாஃப்பிரேமின் பெயர் df2 ஆகும். பின் இந்த  count 5- இக்கு மேல் இருந்தால் YES எனும் மதிப்பையும், கீழ் இருந்தால் NO எனும் மதிப்பையும் கொள்ளுமாறு ‘greater_than_5’ எனும் column உருவாக்கப்பட்டுள்ளது. பின் all எனும் column-ன் கீழ் கேட்டகிரி, ரேட்டிங் முறையில் குரூப் செய்யப்பட்ட அனைத்து score-ன் சராசரி மதிப்பும் கண்டுபிடிக்கப் பட்டுள்ளது. அதேபோல first_5 எனும் column-ன் கீழ் கேட்டகிரி, ரேட்டிங் முறையில் குரூப் செய்யப்பட்ட முதல் 5 ஸ்கோரின் சராசரி மதிப்பு கண்டுபிடிக்கப்பட்டுள்ளது.

df2 = df1.groupby([‘code’,’rating’,’year’,’telecasted_quarter’])[‘rating’].count().reset_index(name=”total_programs”)
df2[‘greater_than_5’] = df2[‘total_programs’].apply(lambda x: ‘YES’ if x >= 5 else ‘No’)
df3 = df1.groupby([‘code’,’rating’,’year’,’telecasted_quarter’])[‘score’].mean().reset_index(name=”all”)
df2[‘all’] = df3[‘all’]

df4 = df1.groupby([‘code’,’rating’,’year’,’telecasted_quarter’])[‘score’]
l1 = []
for i,j in df4:
y = float(j[0:5].mean())
l1.append(y)
df2[‘first_5’] = pd.Series(l1)
print (df2)

          code           rating  year  telecasted_quarter  total_programs  \
0 Variety shows_2      2  2019     2019 Quarter 3               1    
1 Variety shows_3      3  2019     2019 Quarter 2               2    
2 Variety shows_4      4  2019     2019 Quarter 4               7    
3 Variety shows_5      5  2019     2019 Quarter 2               2    
4               news_3      3  2020     2020 Quarter 4               6    
5               news_4      4  2020     2020 Quarter 4               2    

 greater_than_5           all    first_5   
0             No    87.000000     87.0   
1             No    87.500000     87.5   
2          YES    67.857143     60.0   
3             No    71.500000     71.5   
4          YES    83.500000     80.2   
5             No    60.500000     60.5  

3. கடைசியாக greater_than_5 எனும் column-ல் உள்ள மதிப்பு YES என்றிருந்தால், first_5 எனும் column-ல் உள்ள மதிப்பினை எடுத்துக் கொள்ளுமாறும், NO என்றிருந்தால் all எனும் column-ல் உள்ள மதிப்பினை எடுத்துக் கொள்ளுமாறும், ஒரு கண்டிஷனை அமைத்து avg_score எனும் column-ஐ உருவாக்கியுள்ளோம். இறுதியில் நமக்குத் தேவையான column-ஐ மட்டும் வைத்துக் கொள்ளலாம். 

l2 = []
for i,j,k in zip(df2[‘all’],df2[‘first_5’],df2[‘greater_than_5’]):
    if k==’YES’:
        l2.append(j)
    else:
        l2.append(i)
df2[‘avg_score’] = pd.Series(l2)
df2 = df2[[‘code’,’telecasted_quarter’,’avg_score’]]
print (df2)

              code           telecasted_quarter  avg_score
0  Variety shows_2     2019 Quarter 3       87.0
1  Variety shows_3     2019 Quarter 2       87.5
2  Variety shows_4     2019 Quarter 4       60.0
3  Variety shows_5     2019 Quarter 2       71.5
4                news_3     2020 Quarter 4       80.2
5                news_4     2020 Quarter 4       60.5

%d bloggers like this: