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 தான். ஆகவே அந்த இரண்டின் சராசரியை மட்டும் வெளிப்படுத்தினால் போதும்.
மேற்குறிப்பிட்ட மூன்று லாஜிக் ஐயும் பாண்டாஸ் மூலம் செய்து வெளிப்படுத்துவதற்கான நிரல் பின்வருமாறு அமையும்.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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