Pandas로 TRAI 모바일 데이터 전송률 분석

| | | | | | | | | | | | | | | |

TRAI의 실제 데이터 세트를 사용하여 모바일 데이터 속도를 분석하고 이번 달의 특정 운영자 또는 주에 대한 평균 속도를 확인하려고 합니다. 또한 Pandas가 실제 데이터에 얼마나 쉽게 사용되어 흥미로운 결과를 얻을 수 있는지 보여줍니다.

데이터 세트 정보 —
인도 통신 규제 당국(TRAI)은 앱 MySpeed ‚Äã‚Äã(TRAI) . 여기에는 사용자가 시작한 속도 테스트 또는 애플리케이션에서 수행하는 주기적인 백그라운드 테스트가 포함됩니다. 우리는 이 데이터 세트를 분석하고 이번 달에 특정 운영자 또는 주에 대한 평균 속도를 확인하려고 노력할 것입니다.

원시 데이터 구조 확인:

  • TRAI MySpeed ‚Äã‚ÄãPortal 로 이동하여 지난달 CSV 파일을 업로드하십시오. 다운로드 섹션에서 이 문서에 사용된 CSV 파일을 다운로드할 수도 있습니다. sept18_publish.csv 또는 sept18_publish_drive.csv

  • 이 스프레드시트 파일을 엽니다.
    참고 . 데이터 세트가 방대하기 때문에 소프트웨어에서 모든 행을 로드할 수 없다는 경고를 표시할 수 있습니다. 완벽합니다. 또한 Microsoft Excel을 사용하는 경우 SYLK 파일을 열 때 경고가 표시될 수 있습니다. 이 오류는 Excel에서 흔히 발생하는 오류이므로 무시해도 됩니다.
    이제 데이터의 위치를 살펴보겠습니다.

    데이터세트의 열 이름

    첫 번째 열은 네트워크 운영자 - JIO, Airtel 등입니다.
    두 번째 열은 네트워크 기술 - 3G 또는 4G에 관한 것입니다.
    세 번째 열은 테스트 유형 시작 - 업로드 또는 다운로드.
    4번째 열은 초당 킬로바이트 단위의 속도 ‚Äã‚ÄãMeasured 입니다.
    5번째 열은 측정 중 신호 강도 .
    6번째 열은 현지 서비스 지역(LSA) 또는 테스트가 수행된 원입니다(Delhi, Orissa). 등. 우리는 이것을 단순히 `상태`라고 부를 것입니다.

  • 참고. 신호 강도는 일부 장치가 신호를 가로챌 수 없기 때문에 na(사용할 수 없음) 일 수 있습니다. 프로세스를 단순화하기 위해 계산에서 이 매개변수의 사용을 무시합니다. 그러나 이것은 필터링할 때 조건으로 쉽게 추가할 수 있습니다.

    필요한 패키지 -

    Pandas - a 인기 있는 데이터 분석 툴킷. 대규모 데이터 세트를 처리하는 데 매우 강력합니다.
    Numpy - 동종 데이터 배열에 대해 빠르고 효율적인 작업을 제공합니다. 우리는 이것을 pandas 및 matplotlib와 함께 사용할 것입니다.
    Matplotlib - 플로팅 라이브러리입니다. 우리는 막대 그래프를 만들기 위해 막대 그래프 기능을 사용할 것입니다.

    데이터 분석을 시작하겠습니다.

    1단계: 패키지를 가져오고 일부 상수를 정의합니다.


    가져오기 pd로 판다

    가져오기 np로 numpy

    가져오기 matplotlib.pyplot as plt


    # 일부 상수 정의


    # CSV 데이터 세트 이름

    DATASET_FILENAME <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `sept18_publish.csv`


    # 필터링할 연산자를 정의합니다.

    <코드 클래스 = "일반"> CONST_OPERATOR <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `JIO`


    # 필터링할 상태를 정의합니다.

    <코드 클래스 = "일반"> CONST_STATE <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `델리`


    # 필터링 기술 정의

    CONST_TECHNOLOGY < 코드 클래스 ="키워드 "> = <코드 클래스 ="문자열 ">` 4G`

    2단계: 히스토그램 작성 기능에 쉽게 전달할 수 있도록 최종 계산 결과를 저장할 여러 목록을 정의합니다. 상태(또는 연산자), 다운로드 속도, 다운로드 속도가 순차적으로 저장되므로 인덱스, 상태(또는 연산자) 및 해당 다운로드 및 업로드 속도에 액세스할 수 있습니다.

    예: final_states [2], final_download_speeds [2] final_upload_speeds [2] 세 번째 상태에 해당하는 값을 제공합니다.


    # 목록 정의

    final_download_speeds <코드 클래스 ="키워드 "> = <코드 클래스 = "일반"> []

    <코드 클래스 = "일반"> final_upload_speeds <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []

    <코드 클래스 = "일반"> final_states < 코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []

    <코드 클래스 = "일반"> final_operators <코드 클래스 = "keyword"> = <코드 클래스 = " 일반 "> []

    3단계: < /스트론 g> read_csv() Pandas read_csv() 를 사용하여 파일을 가져오고 ' df'. 이것은 우리가 작업할 CSV 콘텐츠의 DataFrame을 생성할 것입니다.


    df = pd.read_csv (DATASET_FILENAME)


    # 데이터를 기반으로 각 열에 헤더 할당
    # 열에 쉽게 액세스할 수 있습니다.


    df.columns < /코드> <코드 클래스 ="키워드 "> = <코드 클래스 ="일반 "> [ <코드 클래스 = "문자열"> `서비스 제공자` <코드 클래스 =" 일반 ">, ` 기술` , `테스트 유형` <코드 클래스 ="일반 ">,

    <코드 클래스 = "문자열"> `데이터 속도` <코드 클래스 ="일반 ">, `신호 강도` , ` 상태` ]

    4단계: 먼저 이 데이터세트에서 모든 고유한 상태을 찾아 각각의 상태 목록에 저장하겠습니다. 및 문.

    Pandas에 대해 = <코드 클래스 ="일반 "> df [ <코드 클래스 ="문자열 ">` 상태` <코드 클래스 = "일반 ">]. 고유()

    인쇄 ( ` 상태 찾음: ` , 상태)


    # 고유한 연산자 찾기 및 표시

    연산자 = df [ <코드 클래스 = "문자열"> `서비스 공급자` <코드 클래스 ="일반 ">]. 고유()

    인쇄 ( `연산자 찾음:` , 연산자)

    종료:

 주 발견: [`Kerala`` Rajasthan` `Maharashtra`` UP East`` Karnataka` nan `Madhya Pradesh`` Kolkata`` Bihar`` Gujarat`` UP West, Orissa, 타밀나두, 델리, 아삼, 안드라프라데시, 하리아나, 펀자브, 노스이스트, 뭄바이, 첸나이, 히마찰프라데시, 잠무 & amp; Kashmir`` West Bengal`] OPERATORS Found: [`IDEA`` JIO` `AIRTEL`` VODAFONE`` CELLONE`] 

5단계: 정의 fixed_operator 함수는 명령문을 일정하게 유지하고 해당 명령문에 대해 사용 가능한 모든 상태를 반복합니다. 고정 상태에 대해 유사한 함수를 작성할 수 있습니다.


< / tr>

# 필터 연산자 및 기술
# -first 동안 모든

필터링됨 = df [(df [ ` 서비스 제공자` ] = = CONST_OPERATOR)

& amp; (df ‚Äã‚Äã[ `기술` ] = = CONST_TECHNOLOGY)]


# 반복 각 상태에 대해

for state in 상태:

#

# 현재 상태 데이터만

기본 = 필터링됨 [필터링됨 [ ` 상태` <코드 클래스 = "일반">] <코드 클래스 = "키워드"> = <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> 상태 ]


# 다우만 필터링 테스트 유형에 따른 nload 속도

down = 기본 [기본 [ <코드 클래스 = "문자열"> `테스트 유형` <코드 클래스 = "일반">] <코드 클래스 = "키워드"> = <코드 클래스 = "키워드"> = <코드 클래스 = "문자열" > `다운로드` <코드 클래스 ="일반 ">]

# 테스트 유형에 따라 다운로드 속도만 필터링

위로 = base [base [ ` 테스트 유형 ` <코드 클래스 = "일반">] <코드 클래스 = "키워드"> = <코드 클래스 = "키워드"> = <코드 클래스 =" 문자열 ">` 업로드` <코드 클래스 = "일반">]


<코드 클래스 = "comments "> # 데이터 속도에서 평균 속도를 계산합니다.

# Pandas.mean() 메서드를 사용하는 열

avg_down = 아래로 [ `데이터 속도` ]. 평균()

# 평균 속도 계산

# 데이터 속도 열

avg_up = 위로 [ `데이터 속도` <코드 클래스 ="일반 ">]. 평균()

<코드 클래스 ="comments "> # 평균이 숫자(nan)가 아닌 경우 값을 버리고

# 유효한 값만 추가

if (pd.isnull (avg_down) 또는 pd.isnull (avg_up)):

아래로, 위로 = <코드 클래스 = "값"> 0 <코드 클래스 = "일반">, <코드 클래스 = "값"> 0


else :

final_stat es. 추가(상태)

final_download_speeds.append(avg_down)

final_upload_speeds. 추가(avg_up)


# 소수점 이하 2자리까지 출력

print ( str (상태) + `- Avg. 다운로드: ` +

str <코드 클래스 = "일반"> ( <코드 클래스 = "문자열"> `% .2f` <코드 클래스 ="키워드 ">% <코드 클래스 = "일반"> avg_down) <코드 클래스 = "키워드"> +

<코드 클래스 = "문자열" > ` 평균 업로드: ` + str ( `% .2f` <코드 클래스 ="키워드 ">% <코드 클래스 ="일반 "> 평균_업))

종료:

 케랄라주 - 평균 다운로드: 26129.27 평균 업로드: 5193.46 라자스탄 - 평균 다운로드: 27784.86 평균 업로드: 5736.18 마하라슈트라 - 평균 다운로드: 20707.88 평균 업로드: 4130.46 UP 동부 - 평균 다운로드: 22451.35 평균 업로드: 5727.95 Karnataka - 평균 다운로드: 16950.36 평균 업로드: 4720.68 Madhya Pradesh - 평균 다운로드: 23594.85 평균 업로드: 4802.89 콜카타 - 평균 다운로드: 26747.80 평균 업로드: 5655.55 비하르 - 평균 다운로드: 31730.54 평균 업로드: 6599.45 구자라트 - 평균 다운로드: 16377.43 평균 업로드: 3642.89 UP 서부 - 평균 다운로드: 23720.82 평균 업로드: 5280.46 Orissa - 평균 다운로드: 31502.05 평균 업로드: 6895.46 타밀나두 - 평균 다운로드: 16689.28 평균 업로드: 4107.44 델리 - 평균 다운로드: 20308.30 평균 업로드: 4877.40 아삼 - 평균 다운로드: 5653.49 평균 업로드: 2864.47 Andhra Pradesh - 평균 다운로드: 32444.07 평균 업로드: 5755.95 하리아나 - 평균 다운로드: 7170.63 평균 업로드: 2680.02 펀자브어 - 평균 다운로드: 14454.45 평균 업로드: 4981.15 북동부 - 평균 다운로드: 평균 6702.29 업로드: 2966.84 뭄바이 - 평균 다운로드: 14070.97 평균 업로드: 4118.21 첸나이 - 평균 다운로드: 20054.47 평균 업로드: 4602.35 히마찰프라데시 - 평균 다운로드: 7436.99 평균 업로드: 4020.09 Jammu & amp; 카슈미르 - 평균 다운로드: 8759.20 평균 업로드: 4418.21 웨스트 벵골 - 평균 다운로드: 16821.17 평균 업로드: 3628.78 

데이터 플로팅 —

Numpy의 arange() 메서드를 사용하면 주어진 간격에 걸쳐 균일한 간격의 값을 반환합니다. 여기에서 final_states 목록의 길이를 전달하면 0에서 목록의 상태 수까지 값을 얻습니다(예: [0, 1, 2, 3 ...]
그러면 이 인덱스를 사용하여 이곳에 막대를 만들 수 있습니다. 두 번째 막대는 첫 번째 막대의 위치를 막대 너비로 오프셋하여 구성됩니다.


fig, ax = plt.subplots ()


# 너비 각 막대

bar_width = 0.25


# 각 막대의 불투명도

불투명도 = 0.8


# 위치 저장

<코드 클래스 = "일반"> 인덱스 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> np.arange ( len (final_states))


# plt. 막대() 위치
# 열, 플로팅 데이터,
# 각 막대와 일부 막대의 너비
# 불투명도 및 색상과 같은 선택적 매개변수


# 다운로드 일정 작성

bar_download = plt.bar(색인, final_download_speeds,

bar_width, 알파 = 불투명도,

색상 <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `b` <코드 클래스 ="일반 ">, 레이블 <코드 클래스 = "키워드"> = `다운로드` )

# 다운로드 빌드 일정

bar_upload = plt.bar( 색인 <코드 클래스 = "키워드 d"> + <코드 클래스 = "일반"> bar_width, final_upload_speeds,

<코드 클래스 = "일반"> bar_width, 알파 <코드 클래스 = "keyword"> = 불투명도, 색상 = `g` ,

라벨 = <코드 클래스 = "문자열"> `업로드` <코드 클래스 ="일반 ">)

<코드 클래스 = "정의되지 않은 공백 ">
# 차트 이름

plt.title( <코드 클래스 = "문자열"> `평균. `

+ str (CONST_OPERATOR))


# X축 레이블 < / p>

<코드 클래스 = "일반"> plt.xlabel ( <코드 클래스 = "문자열"> `상태` <코드 클래스 ="일반 ">)


# Y축 레이블

plt.ylabel( `Kbps의 평균 속도` )


# 각 열 아래에 레이블,
# 상태와 일치

plt.xticks(색인 + bar_width, final_states, 회전 = 90 <코드 클래스 = "일반">)


# 범례 그리기
plt .le gend ()


# 차트 레이아웃을 견고하게 만듭니다.
plt.tight_layout ()


# 그래프 표시
plt.show ()

예상 속도의 히스토그램

두 달 간의 데이터 비교 —

다른 달의 데이터도 가져와서 함께 도표화하여 데이터 속도의 차이를 살펴보겠습니다.

이 예에서 이전 달의 데이터세트는 sept18_publish.csv, 및 다음 달 데이터 세트 — oct18_publish.csv .

같은 단계를 다시 수행하기만 하면 됩니다. 다른 달의 데이터를 읽으십시오. 후속 데이터 프레임에서 필터링한 다음 약간 다른 방법을 사용하여 플로팅합니다. 열을 구성하는 동안 올바른 위치에 있도록 세 번째 및 네 번째 열(두 번째 파일의 업로드 및 다운로드에 해당)을 열 너비의 2배 및 3배로 늘립니다.

4개의 막대를 그릴 때 오프셋 논리

아래는 2개월 간의 비교 데이터 구현입니다.


가져오기 pd로 판다

가져오기 np로 numpy

가져오기 matplotlib .pyplot as plt

가져오기 시간


상급 월 #

데이터 ET_FILE 이름 = ` https://myspeed.trai.gov.in/download/sept18_publish.csv `

<코드 클래스 ="undefined spaces ">
# 새로운 달

DATASET_FILENAME2 = <코드 클래스 = "문자열"> ` https://myspeed.trai.gov.in/download/oct18_publish.csv `

<코드 클래스 = "일반"> CONST_OPERATOR <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `JIO` < / p>

<코드 클래스 = "일반"> CONST_STATE <코드 클래스 = "키워드"> = <코드 클래스 = "문자열"> `델리`

<코드 클래스 = "일반"> CONST_TEC HNOLOGY = `4G`


# 팬더 파일을 읽고 데이터 프레임으로 저장

df = pd.read_csv (DATASET_FILENAME)

df2 = <코드 클래스 = "plain"> pd.read_csv (DATASET_FILENAME2)


# 열 이름 할당

df .columns = [ `서비스 제공자 ` <코드 클래스 = "일반">, <코드 클래스 = "문자열"> `기술` <코드 클래스 ="일반 ">, <코드 클래스 = "문자열 ">` 테스트 유형 ` ,

` 데이터 속도` , `신호 강도` , `상태` ]

<코드 클래스 ="일반 "> df2.columns <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> [ `서비스 제공자` , `기술` , <코드 클래스 ="문자열 ">` 테스트 유형` <코드 클래스 = "일반">,

<코드 클래스 = "string"> `데이터 속도` , `신호 강도` , ` 상태` ]


# 고유한 상태를 찾아 표시

상태 = df [ <코드 클래스 = "문자열"> `상태` <코드 클래스 ="일반 ">]. 고유()

인쇄 ( ` STATES Found:` ,states)


# 고유 연산자를 찾아 표시

<코드 클래스 = "일반"> 연산자 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> df [ <코드 class = "string"> `서비스 제공자` ].unique ()

인쇄 ( `OPERATORS Found : ` , 연산자)


# 목록 정의

final_download_speeds = []

final_upload_speeds <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []


<코드 클래스 = "일반"> final_download_speeds_second <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []

<코드 클래스 = "일반"> final_upload_speeds_second <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []


<코드 클래스 = "일반"> final_states <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []

<코드 클래스 = "일반"> final_operators <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []


# 데이터에 열 이름 할당

df.columns = <코드 클래스 = "일반"> [ <코드 클래스 = "문자열"> `서비스 공급자` <코드 클래스 ="일반 ">, `기술` , ` 테스트 유형` ,

<코드 클래스 = "문자열"> `데이터 속도` , <코드 클래스 = "문자열"> `신호 강도` <코드 클래스 ="일반 ">, <코드 클래스 ="문자열 "> ` 상태` ]

df2.columns = <코드 클래스 = "일반"> [ <코드 클래스 = "문자열"> `서비스 제공자` <코드 클래스 ="일반 ">, <코드 클래스 ="string ">` 기술` , `테스트 유형` ,

`데이터 속도` , ` 신호 강도` , `상태` <코드 클래스 ="plain ">]



인쇄 ( `데이터 비교` + str (CONST_OPERATOR))

필터링됨 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> df [(df [ <코드 클래스 = "문자열"> `서비스 제공자` <코드 클래스 ="일반 " >] <코드 클래스 = "키워드"> = <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> CONST_OPERATOR)

<코드 클래스 = "일반"> & amp; (df ‚Äã‚Äã[ `기술` ]

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method