18 |
19 |
--------------------------------------------------------------------------------
/data_getter/daily_report.py:
--------------------------------------------------------------------------------
1 | import pandas as pd
2 | import psycopg2
3 | from sqlalchemy import create_engine
4 |
5 | df = pd.read_csv("daily_report.csv")
6 |
7 | # add postgres db engine
8 | engine = create_engine('postgresql+psycopg2://postgres:mastersam@localhost/ncovid')
9 | #
10 | # adding df to tables
11 | df.to_sql(con=engine, name='daily', if_exists='replace', index=True, index_label='id')
12 | #
13 | print('Data transferred from df to postgresql successfully!!!')
14 |
15 | # checking the data
16 | print('checking the data...')
17 | conn = psycopg2.connect(host="localhost", database="ncovid", user="postgres", password="mastersam")
18 | cur = conn.cursor()
19 | cur.execute("SELECT * FROM daily")
20 |
21 | rows = cur.fetchall()
22 |
23 | for row in rows:
24 | print(row)
25 | print('Done checking!!!')
26 |
27 | conn.close()
28 |
--------------------------------------------------------------------------------
/api/states/apiviews.py:
--------------------------------------------------------------------------------
1 | from rest_framework import generics, viewsets
2 | from rest_framework.generics import get_object_or_404
3 | from rest_framework.views import APIView
4 | from rest_framework.response import Response
5 |
6 | from .models import Data
7 | from .serializers import StateSerializer # CaseSerializer
8 |
9 |
10 | class StateList(APIView):
11 | @staticmethod
12 | def get(request):
13 | states = Data.objects.all()
14 | data = StateSerializer(states, many=True).data
15 | return Response(data)
16 |
17 |
18 | class StateDetail(APIView):
19 | @staticmethod
20 | def get(request, id):
21 | state = get_object_or_404(Data, pk=id)
22 | data = StateSerializer(state).data
23 | return Response(data)
24 |
25 |
26 | class StateViewSet(viewsets.ModelViewSet):
27 | queryset = Data.objects.all()
28 | serializer_class = StateSerializer
29 |
--------------------------------------------------------------------------------
/data_getter/ncovid.csv:
--------------------------------------------------------------------------------
1 | id,States,No_of_cases,No_on_admission,No_discharged,No_of_deaths
2 | 0,Lagos,"2,041","1,480",528,33
3 | 1,Kano,707,595,79,33
4 | 2,FCT,370,291,72,7
5 | 3,Katsina,224,187,25,12
6 | 4, Bauchi,206,178,25,3
7 | 5,Borno,188,148,20,20
8 | 6,Jigawa,141,134,4,3
9 | 7,Ogun,127,76,46,5
10 | 8,Gombe,119,53,65,1
11 | 9,Kaduna,116,96,17,3
12 | 10,Sokoto,112,59,40,13
13 | 11,Edo,89,59,26,4
14 | 12,Zamfara,73,67,1,5
15 | 13,Oyo,73,55,16,2
16 | 14,Kwara,53,43,9,1
17 | 15,Osun,42,8,30,4
18 | 16,Rivers,33,25,5,3
19 | 17,Kebbi,31,23,5,3
20 | 18,Nasarawa,28,27,0,1
21 | 19,Delta,22,13,6,3
22 | 20,Adamawa,21,17,4,0
23 | 21,Yobe,20,19,0,1
24 | 22,Plateau,20,16,4,0
25 | 23,Ondo,18,6,11,1
26 | 24,Taraba,17,16,1,0
27 | 25,Akwa Ibom,17,3,12,2
28 | 26,Ekiti,15,5,9,1
29 | 27,Enugu,12,10,2,0
30 | 28,Niger,10,8,2,0
31 | 29,Ebonyi,9,9,0,0
32 | 30,Bayelsa,6,3,3,0
33 | 31,Benue,4,4,0,0
34 | 32,Imo,3,2,1,0
35 | 33,Anambra,2,1,1,0
36 | 34,Abia,2,1,1,0
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Abada Samuel Oghenero.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/api/daily/models.py:
--------------------------------------------------------------------------------
1 | # This is an auto-generated Django model module.
2 | # You'll have to do the following manually to clean this up:
3 | # * Rearrange models' order
4 | # * Make sure each model has one field with primary_key=True
5 | # * Make sure each ForeignKey has `on_delete` set to the desired behavior.
6 | # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
7 | # Feel free to rename the models, but don't rename db_table values or field names.
8 | from django.db import models
9 |
10 |
11 | class Daily(models.Model):
12 | id = models.IntegerField(primary_key=True)
13 | Date = models.CharField(db_column='Date', max_length=50, blank=True, null=False) # Field name
14 | # made lowercase.
15 | No_of_cases = models.CharField(db_column='Confirmed_Cases', max_length=50, blank=True, null=True) # Field name made
16 | # lowercase.
17 | No_of_recovered = models.CharField(db_column='Recovered', max_length=50, blank=True, null=True) # Field
18 | # name made lowercase .
19 | No_of_deaths = models.CharField(db_column='Deaths', max_length=50, blank=True, null=True) # Field name made
20 | # lowercase.
21 |
22 | def __str__(self):
23 | return self.Date
24 |
25 | class Meta:
26 | managed = False
27 | db_table = 'daily'
28 |
--------------------------------------------------------------------------------
/api/.idea/api.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/api/.circle/config.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | jobs:
3 | build:
4 | docker:
5 | # specify the version you desire here
6 | - image: circleci/python:3.6.1
7 |
8 |
9 | working_directory: ~/repo
10 |
11 | steps:
12 | - checkout
13 |
14 | # Download and cache dependencies
15 | - restore_cache:
16 | keys:
17 | - v1-dependencies-{{ checksum "api/requirements.txt" }}
18 | # fallback to using the latest cache if no exact match is found
19 | - v1-dependencies-
20 |
21 | - run:
22 | name: install dependencies
23 | command: |
24 | python3 -m venv venv
25 | . venv/bin/activate
26 | pip install -r api/requirements.txt
27 |
28 | - save_cache:
29 | paths:
30 | - ./venv
31 | key: v1-dependencies-{{ checksum "requirements.txt" }}
32 |
33 | # run tests!
34 | # this example uses Django's built-in test-runner
35 | # other common Python testing frameworks include pytest and nose
36 | # https://pytest.org
37 | # https://nose.readthedocs.io
38 | - run:
39 | name: run tests
40 | command: |
41 | . venv/bin/activate
42 | cd api
43 | python manage.py test
44 |
45 | - store_artifacts:
46 | path: test-reports
47 | destination: test-reports
48 |
49 |
--------------------------------------------------------------------------------
/data_getter/daily_report.csv:
--------------------------------------------------------------------------------
1 | Date,Confirmed_Cases,Recovered,Deaths
2 | 2/27/2020,1,0,0
3 | 2/28/2020,1,0,0
4 | 2/29/2020,1,0,0
5 | 3/1/2020,1,0,0
6 | 3/2/2020,1,0,0
7 | 3/3/2020,1,0,0
8 | 3/4/2020,1,0,0
9 | 3/5/2020,1,0,0
10 | 3/6/2020,1,0,0
11 | 3/7/2020,1,0,0
12 | 3/8/2020,1,0,0
13 | 3/9/2020,2,0,0
14 | 3/10/2020,2,0,0
15 | 3/11/2020,2,0,0
16 | 3/12/2020,2,0,0
17 | 3/13/2020,2,0,0
18 | 3/14/2020,2,1,0
19 | 3/15/2020,2,1,0
20 | 3/16/2020,3,1,0
21 | 3/17/2020,3,1,0
22 | 3/18/2020,8,1,0
23 | 3/19/2020,12,1,0
24 | 3/20/2020,22,0,0
25 | 3/21/2020,25,2,0
26 | 3/22/2020,30,2,0
27 | 3/23/2020,40,2,1
28 | 3/24/2020,44,2,1
29 | 3/25/2020,51,2,1
30 | 3/26/2020,65,3,1
31 | 3/27/2020,81,3,1
32 | 3/28/2020,97,3,1
33 | 3/29/2020,111,3,1
34 | 3/30/2020,131,8,2
35 | 3/31/2020,139,9,2
36 | 4/1/2020,174,9,2
37 | 4/2/2020,184,20,2
38 | 4/3/2020,209,25,4
39 | 4/4/2020,214,25,4
40 | 4/5/2020,232,33,5
41 | 4/6/2020,238,35,5
42 | 4/7/2020,254,44,6
43 | 4/8/2020,276,44,6
44 | 4/9/2020,288,51,7
45 | 4/10/2020,305,58,7
46 | 4/11/2020,318,70,10
47 | 4/12/2020,323,85,10
48 | 4/13/2020,343,91,10
49 | 4/14/2020,373,99,11
50 | 4/15/2020,407,128,12
51 | 4/16/2020,442,152,13
52 | 4/17/2020,493,159,17
53 | 4/18/2020,542,166,19
54 | 4/19/2020,627,170,21
55 | 4/20/2020,665,188,22
56 | 4/21/2020,782,197,25
57 | 4/22/2020,873,197,28
58 | 4/23/2020,981,197,31
59 | 4/24/2020,1095,208,32
60 | 4/25/2020,1182,222,35
61 | 4/26/2020,1273,239,40
62 | 4/27/2020,1337,251,40
63 | 4/28/2020,1532,255,44
64 | 4/29/2020,1728,307,51
65 | 4/30/2020,1932,319,58
66 | 5/1/2020,2170,351,68
67 | 5/2/2020,2388,385,85
68 | 5/3/2020,2558,393,87
69 | 5/4/2020,2950,481,98
70 | 5/5/2020,2802,417,93
71 | 5/6/2020,3145,534,103
72 | 5/7/2020,3526,601,107
73 | 5/8/2020,3912,679,117
74 | 5/9/2020,4151,745,128
75 | 5/10/2020,4399,778,143
76 | 5/11/2020,4641,902,150
77 | 5/12/2020,4787,959,158
78 | 5/13/2020,4971,1070,164
--------------------------------------------------------------------------------
/api/api/urls.py:
--------------------------------------------------------------------------------
1 | """api URL Configuration
2 |
3 | The `urlpatterns` list routes URLs to views. For more information please see:
4 | https://docs.djangoproject.com/en/2.0/topics/http/urls/
5 | Examples:
6 | Function views
7 | 1. Add an import: from my_app import views
8 | 2. Add a URL to urlpatterns: path('', views.home, name='home')
9 | Class-based views
10 | 1. Add an import: from other_app.views import Home
11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12 | Including another URLconf
13 | 1. Import the include() function: from django.urls import include, path
14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15 | """
16 | from django.contrib import admin
17 | from django.urls import path, re_path, include
18 | from rest_framework_swagger.views import get_swagger_view
19 | from rest_framework.documentation import include_docs_urls
20 | from django_otp.admin import OTPAdminSite
21 |
22 |
23 | admin.site.__class__ = OTPAdminSite
24 |
25 |
26 | class OTPAdmin(OTPAdminSite):
27 | pass
28 |
29 |
30 | from django.contrib.auth.models import User
31 | from django_otp.plugins.otp_totp.models import TOTPDevice
32 |
33 | admin_site = OTPAdmin(name='OTPAdmin')
34 | admin_site.register(User)
35 | admin_site.register(TOTPDevice)
36 |
37 | schema_view = get_swagger_view(title='Nigeria Covid-19 API')
38 | api_doc = include_docs_urls(title='Nigeria Covid-19 API')
39 |
40 | urlpatterns = [
41 | path('somenewurl/', admin_site.urls),
42 | path('some/', admin.site.urls),
43 | path(r'api/docs/', schema_view),
44 | path('admin/', include('admin_honeypot.urls', namespace='admin_honeypot')),
45 | re_path(r'^', include('states.urls')),
46 | re_path(r'^', include('confirmed.urls')),
47 | re_path(r'^', include('daily.urls')),
48 | path(r'', api_doc),
49 | ]
50 |
--------------------------------------------------------------------------------
/data_getter/getData.py:
--------------------------------------------------------------------------------
1 | import requests
2 | from bs4 import BeautifulSoup
3 | import pandas as pd
4 | from sqlalchemy import create_engine
5 |
6 |
7 | def update_database():
8 | headers = {
9 | # # 'user-agent': user_agent,
10 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) '
11 | 'Chrome/56.0.2924.87 Safari/537.36',
12 | }
13 | url = 'https://covid19.ncdc.gov.ng'
14 |
15 | # make a request with headers
16 | r = requests.get(url, headers=headers, timeout=5)
17 |
18 | print(r.status_code) # 200 for success
19 |
20 | content = BeautifulSoup(r.text, 'lxml') # parsing content
21 |
22 | My_table = content.find('table', {'id': 'custom3'}) # table to be scrapped having id as custom3
23 |
24 | links = My_table.findAll('b') # all cases data seems to be in b tags
25 | stately = My_table.findAll('td') # all state name seems to be in td tags
26 |
27 | # save cases data to list
28 | cases = []
29 | for link in links:
30 | cases.append(link.text)
31 |
32 | # save states data to list
33 | states = []
34 | for state in stately:
35 | states.append(state.text)
36 |
37 | # escape string appears in list in odd indexes
38 | # get states with even indexes
39 | somes = []
40 | for i in range(0, len(states), 2):
41 | somes.append(states[i])
42 |
43 | # set length to be 37 due to irregularities
44 |
45 | # take data to pandas dataframe
46 | df = pd.DataFrame()
47 | df['States'] = somes[0:37]
48 | df['Cases'] = cases[0:37]
49 |
50 | print('Dataframe\n', df)
51 |
52 | # save data to csv
53 | df.to_csv(r'ncovid.csv', index=True, index_label='id')
54 | print("SUCCESS!!!")
55 |
56 | # create sqlite engine
57 | # engine = create_engine(r'db.sqlite3')
58 |
59 | # add postgres db engine
60 | engine = create_engine('postgresql+psycopg2://postgres:mastersam@localhost/ncovid')
61 |
62 | # adding df to tables
63 | df.to_sql(con=engine, name='data', if_exists='replace', index=True, index_label='id')
64 |
65 | print('Data transferred from df to postgres successfully!!!')
66 |
--------------------------------------------------------------------------------
/api/states/models.py:
--------------------------------------------------------------------------------
1 | # from django.db import models
2 | #
3 | #
4 | # # from django.db import models
5 | # # from django.contrib.auth.models import User
6 | # #
7 | # #
8 | # # class State(models.Model):
9 | # # name = models.CharField(max_length=100)
10 | # #
11 | # # def __str__(self):
12 | # # return self.name
13 | # #
14 | # #
15 | # # class Cases(models.Model):
16 | # # states = models.ForeignKey(State, related_name='numbers', on_delete=models.CASCADE)
17 | # # cases = models.CharField(max_length=100)
18 | # #
19 | # # def __str__(self):
20 | # # return self.cases
21 | # #
22 | #
23 | # class StatesCases(models.Model):
24 | # id = models.IntegerField(primary_key=True)
25 | # cases = models.CharField(max_length=100)
26 | # states_id = models.IntegerField()
27 | #
28 | # class Meta:
29 | # managed = False
30 | # db_table = 'states_cases'
31 | #
32 | #
33 | # class StatesState(models.Model):
34 | # name = models.CharField(max_length=100)
35 | #
36 | # class Meta:
37 | # managed = False
38 | # db_table = 'states_state'
39 |
40 | # This is an auto-generated Django model module.
41 | # You'll have to do the following manually to clean this up:
42 | # * Rearrange models' order
43 | # * Make sure each model has one field with primary_key=True
44 | # * Make sure each ForeignKey has `on_delete` set to the desired behavior.
45 | # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
46 | # Feel free to rename the models, but don't rename db_table values or field names.
47 | from django.db import models
48 |
49 |
50 | class Data(models.Model):
51 | id = models.IntegerField(primary_key=True)
52 | States = models.CharField(db_column='States', max_length=50, blank=True, null=True) # Field name made lowercase.
53 | No_of_cases = models.CharField(db_column='No_of_cases', max_length=50, blank=True, null=True) # Field name made
54 | # lowercase.
55 | No_on_admission = models.CharField(db_column='No_on_admission', max_length=50, blank=True, null=True) # Field
56 | # name made
57 | # lowercase.
58 | No_discharged = models.CharField(db_column='No_discharged', max_length=50, blank=True, null=True) # Field name made
59 | # lowercase.
60 | No_of_deaths = models.CharField(db_column='No_of_deaths', max_length=50, blank=True,null=True) # Field name made
61 | # lowercase.
62 |
63 | def __str__(self):
64 | return self.States
65 |
66 | class Meta:
67 | managed = False
68 | db_table = 'data'
69 |
--------------------------------------------------------------------------------
/data_getter/newscraper.py:
--------------------------------------------------------------------------------
1 | import sqlite3
2 |
3 | import psycopg2
4 | from bs4 import BeautifulSoup
5 | import requests
6 | from sqlalchemy import create_engine # db engine
7 | import pandas as pd
8 |
9 | headers = {
10 | # # 'user-agent': user_agent,
11 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) '
12 | 'Chrome/56.0.2924.87 Safari/537.36',
13 | }
14 |
15 | # make a request with headers
16 | r = requests.get('https://covid19.ncdc.gov.ng', headers=headers, timeout=15)
17 |
18 | # print(r.status_code) # 200 for success
19 |
20 | content = BeautifulSoup(r.text, 'lxml') # parsing content
21 |
22 | My_table = content.findAll('div', {'class': 'col-xs-3 col-md-3 col-xl-3'}) # div for all data
23 | Samples = content.find('div', {'class': 'col-md-12 col-xl-3'}) # div for total tested sapmles
24 |
25 | # print(Samples.find('span').text)
26 | # assign each div
27 | confirmed_cases = My_table[0]
28 | active_cases = My_table[1]
29 | discharged_cases = My_table[2]
30 | death = My_table[3]
31 |
32 | # get the category data
33 | sample_cat = Samples.find('h6').text
34 | confirmed_cat = confirmed_cases.find('h6').text
35 | active_cat = active_cases.find('h6').text
36 | discharged_cat = discharged_cases.find('h6').text
37 | death_cat = death.find('h6').text
38 |
39 | # get the figures data
40 | sample_data = Samples.find('span').text
41 | confirmed_data = confirmed_cases.find('h2').text
42 | active_data = active_cases.find('h2').text
43 | discharged_data = discharged_cases.find('h2').text
44 | death_data = death.find('h2').text
45 |
46 | # check data
47 | print(sample_cat, sample_data)
48 | print(confirmed_cat, confirmed_data)
49 | print(active_cat, active_data)
50 | print(discharged_cat, discharged_data)
51 | print(death_cat, death_data)
52 |
53 | # pass all outputs to list
54 | somes = [sample_cat, confirmed_cat, discharged_cat, death_cat]
55 | cases = [sample_data, confirmed_data, discharged_data, death_data]
56 |
57 | # print(cases)
58 | # print(somes)
59 |
60 | # take data to pandas dataframe
61 | df = pd.DataFrame()
62 | df['Categories'] = somes
63 | df['Values'] = cases
64 |
65 | print('Dataframe\n', df)
66 |
67 | # save data to csv
68 | # df.to_csv(r'ncovid.csv', index=True, index_label='id')
69 | # print("SUCCESS!!!")
70 |
71 | # add postgres db engine
72 | engine = create_engine('postgresql+psycopg2://postgres:mastersam@localhost/ncovid')
73 | #
74 | # adding df to tables
75 | df.to_sql(con=engine, name='confirmed', if_exists='replace', index=True, index_label='id')
76 | #
77 | print('Data transferred from df to postgresql successfully!!!')
78 | #
79 | # checking the data
80 | print('checking the data...')
81 | conn = psycopg2.connect(host="localhost", database="ncovid", user="postgres", password="mastersam")
82 | cur = conn.cursor()
83 | cur.execute("SELECT * FROM confirmed")
84 |
85 | rows = cur.fetchall()
86 |
87 | for row in rows:
88 | print(row)
89 | print('Done checking!!!')
90 |
91 | conn.close()
92 |
--------------------------------------------------------------------------------
/api/requirements.txt:
--------------------------------------------------------------------------------
1 | altgraph==0.17
2 | aniso8601==8.0.0
3 | APScheduler==3.6.3
4 | astroid==2.3.3
5 | atomicwrites==1.3.0
6 | attrs==19.3.0
7 | Automat==20.2.0
8 | backcall==0.1.0
9 | beautifulsoup4==4.8.2
10 | bleach==3.1.4
11 | bs4==0.0.1
12 | certifi==2019.9.11
13 | cffi==1.14.0
14 | chardet==3.0.4
15 | click==7.1.1
16 | codeclimate-test-reporter==0.2.3
17 | colorama==0.4.1
18 | constantly==15.1.0
19 | coreapi==2.3.3
20 | coreschema==0.0.4
21 | coverage==4.5.4
22 | coveralls==1.8.2
23 | cryptography==2.9
24 | cssselect==1.1.0
25 | cycler==0.10.0
26 | decorator==4.4.1
27 | defusedxml==0.6.0
28 | dj-database-url==0.5.0
29 | django>=2.2.13
30 | django-admin-honeypot==1.1.0
31 | django-background-tasks==1.2.5
32 | django-compat==1.0.15
33 | django-defender==0.7.0
34 | django-heroku==0.3.1
35 | django-otp==0.9.0
36 | django-rest-swagger==2.2.0
37 | django-secure==1.0.2
38 | djangorestframework==3.10.3
39 | docopt==0.6.2
40 | entrypoints==0.3
41 | flake8==3.7.9
42 | Flask==1.1.1
43 | Flask-RESTful==0.3.8
44 | get-retries==0.1.1
45 | get-wayback-machine==0.1.2
46 | gunicorn==19.9.0
47 | hyperlink==19.0.0
48 | idna==2.8
49 | importlib-metadata==0.23
50 | incremental==17.5.0
51 | ipykernel==5.1.3
52 | ipython==7.9.0
53 | ipython-genutils==0.2.0
54 | ipywidgets==7.5.1
55 | isort==4.3.21
56 | itsdangerous==1.1.0
57 | itypes==1.1.0
58 | jedi==0.15.1
59 | Jinja2==2.10.3
60 | joblib==0.14.0
61 | jsonschema==3.2.0
62 | jupyter==1.0.0
63 | jupyter-client==5.3.4
64 | jupyter-console==6.0.0
65 | jupyter-core==4.6.1
66 | kiwisolver==1.1.0
67 | lazy-object-proxy==1.4.3
68 | lxml==4.5.0
69 | macholib==1.14
70 | MarkupSafe==1.1.1
71 | matplotlib==3.1.2
72 | mccabe==0.6.1
73 | mistune==0.8.4
74 | modulegraph==0.18
75 | more-itertools==7.2.0
76 | mysql==0.0.2
77 | mysql-connector==2.2.9
78 | mysqlclient==1.4.6
79 | nbconvert==5.6.1
80 | nbformat==4.4.0
81 | notebook==6.0.2
82 | numpy==1.17.4
83 | openapi-codec==1.3.2
84 | packaging==19.2
85 | pandas==0.25.3
86 | pandocfilters==1.4.2
87 | parsel==1.5.2
88 | parso==0.5.1
89 | pickleshare==0.7.5
90 | Pillow>=6.2.2
91 | pluggy==0.13.1
92 | prometheus-client==0.7.1
93 | prompt-toolkit==2.0.10
94 | Protego==0.1.16
95 | psycopg2==2.8.3
96 | py==1.8.0
97 | py2app==0.21
98 | pyasn1==0.4.8
99 | pyasn1-modules==0.2.8
100 | pycodestyle==2.5.0
101 | pycparser==2.20
102 | PyDispatcher==2.0.5
103 | pyflakes==2.1.1
104 | Pygments==2.4.2
105 | PyHamcrest==2.0.2
106 | pylint==2.4.4
107 | PyMySQL==0.9.3
108 | pyOpenSSL==19.1.0
109 | pyowm==2.3.2
110 | pyparsing==2.4.5
111 | pyrsistent==0.15.6
112 | pytest==5.3.0
113 | pytest-cov==2.8.1
114 | python-coveralls==2.9.3
115 | python-dateutil==2.8.1
116 | pytz==2019.3
117 | pywin32==227
118 | pywinpty==0.5.5
119 | PyYAML==5.1.2
120 | pyzmq==18.1.1
121 | qrcode==6.1
122 | qtconsole==4.6.0
123 | queuelib==1.5.0
124 | redis==3.4.1
125 | requests==2.22.0
126 | scikit-learn==0.21.3
127 | scipy==1.3.3
128 | Scrapy==2.0.1
129 | scrapy-wayback-machine==1.0.0
130 | seaborn==0.9.0
131 | Send2Trash==1.5.0
132 | service-identity==18.1.0
133 | simplejson==3.17.0
134 | six==1.13.0
135 | sklearn==0.0
136 | soupsieve==2.0
137 | SQLAlchemy==1.3.15
138 | sqlparse==0.3.0
139 | terminado==0.8.3
140 | testpath==0.4.4
141 | tornado==6.0.3
142 | traitlets==4.3.3
143 | Twisted==20.3.0
144 | typed-ast==1.4.0
145 | tzlocal==2.0.0
146 | uritemplate==3.0.0
147 | urllib3==1.25.7
148 | virtualenv==16.7.8
149 | w3lib==1.21.0
150 | wayback-machine-scraper==1.0.7
151 | waybackpack==0.3.5
152 | wcwidth==0.1.7
153 | webencodings==0.5.1
154 | Werkzeug==1.0.0
155 | whitenoise==4.1.3
156 | widgetsnbextension==3.5.1
157 | wrapt==1.11.2
158 | zipp==0.6.0
159 | zope.interface==5.1.0
160 |
--------------------------------------------------------------------------------
/api/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |