Eudra-Vigilance Data Project
By Craig Paardekooper(August 9th 2024)

WHAT IS EUDRA-VIGILANCE ?
Eudra-vigilance is the European equivalent of VAERS – it is a database of adverse
reaction reports for all vaccines, substances and products used in the European
Union (includes Astazeneca data) since 2001.
URL : https://www.adrreports.eu/en/disclaimer.html

PURPOSE OF THE EUDRA-VIGILANCE DATA PROJECTTo provide public access to Eudra-vigilance data for analysis of drug safety.
The resulting CSV dataset is the largest publicly available dataset of its kindin the world, consisting of 7,044,225 reports, covering 20,000 unique symptoms
relating to 13,000 unique drug brand names, and 17,000 unique ingredient lists.

SINGLE DRUG EFFECTS
In this document I look at the effects associated with the administration of asingle drug. There are 5,333,575 reports where only 1 drug is administered. I
use this data to determine the safety and effectiveness of each drug.
This dataset will empower analysts to rank many drugs by the incidence of theiradverse effects – and aide informed choice.

STEPS FOR THE CREATION OF THE DATASETAll the data is publicly available, but the following steps automate the gatheringof it and the organising of it into useful fields. I have completed all the steps
for you. I am describing the steps in case you wish to repeat / confirm them foryourself.

Step 1 : Data Download
Wouter Aukema (http://www.aukema.org/) wrote code for automatically reading anddownloading the data from Eudra-Vigilance. The download takes about 4 hours using
high speed internet (30 mb / sec). The python code used for downloading isavailable here - python . The downloaded data consisted of 4088 csv files.
If you are not a Python programmer, you can skip downloading all the files
yourself, since I have already done that and made all 4088 files available as adownloadable zip file here - Dropbox (complete unformatted tables)

Step 3 : Reading the Files with Python
Once I had the files downloaded, the next stage was to read them. They were all.csv files, however the files did not all use the same encoding. Some csv files
used “ISO-8859-1” encoding, other files used “UTF-8” encoding, others used“windows 1292” encoding, and for some files the encoding was unknown.
To find out which ones I could open, I looped through the files, trying to readeach one with one encoding, then another – here - file reading.
In many cases the files would not open in Python, so I had to open each one
manually by importing it into an excel spreadsheet, then saving the sheet as acsv. The csv files were then read into Python and concatenated into one large
file. The method of concatenation is shown here - manual conversion
You can skip these step too, if you wish, since I have done it for you.
Here is the code I used find out which encoding each file had -Otherwise I used this process for detecting encoding –As you can see, this code told me which files could be opened using a specificencoding, and which files could not. In addition, it concatenated the files that
could be opened into one big file.
Repeating this with other encodings eventually led to the creation of one big
file out of the many.

STEP 4 Concatenating the files into one massive file
Concatenation of the files was performed when reading the files. You can see thatas each file is read, it is appended to a framelist, and this is eventually
written to a csv file - file reading.

However, I could also do the concatenation separately like this I create a master dataframe

Then I loop through, reading each file into a dataframe of its own, andconcatenating them to the master dataframe.

The final master dataframe is then saved to a csv fileStep 5 : Looking at the Data Fields

Here are all the fields in the original downloaded csvs.

Here is a list of the columns
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

Unnamed: 0
EU Local Number
Report TypeEV Gateway Receipt Date
Primary Source Qualification
Primary Source Country for Regulatory Purposes
Literature Reference
Patient Age Group
Patient Age Group (as per reporter)
Parent Child Report
Patient Sex
Reaction List PT (Duration – Outcome - Seriousness Criteria)
Suspect/interacting Drug List (Drug Char - Indication PT - Action taken [Duration - Dose - Route])
Concomitant/Not Administered Drug List (Drug Char - Indication PT - Action
taken - [Duration - Dose - Route])
ICSR Form
Reaction List PT (Duration – Outcome - Seriousness Criteria)

Step 6 : Identifying Null Values

Counting Not-Nulls

There are 10,882,388 rows in the initial dataset.

So, the number of records in each column where the valueby –is not null is given

So, there are 4 columns where Reaction is specified, which contain thefollowing numbers of records ••••208771647471
13819135277572

Totalling 8,794,672
These 4 separate columns should be merged into a single column.

Removing Null Values

The EU Local Number is the report identification number. When we drop all NaN
values from this column, we get

The counts

for this column now match that for the other columns

Before we can work with this data, we must merge the 4 reaction columns into asingle column called REACTION, and then drop the 4 original reaction columns.

I confirmed that there were no longer any nulls in any of the columns

All columns were now of the same length

Renaming Columns

To facilitate coding, I renamed these columns with easier names.

Step 7 Removing Duplicates

So we have 8,794,672 reports. I wanted to see if any records have been
duplicated, which might happen when I was concatenating so many separate files.
Duplicates may have arisen during the process of combining the 4088 csv files,
if these csv files had any overlap.
In order to remove duplicates I used –Each individual person has a unique ID. There are 7,044,225 unique IDs in thedataset.

Who submitted these reports ?

So most reporters were healthcare professionals

NOTE : 63% of reports in Eudra were submitted by healthcare professionals, anda further 35% of reports were submitted by non-healthcare professionals - most
likely admin staff in the employ of hospitals, private medical practices, orcare services. So this data is to be taken seriously.
EXPLORING THE DATAThe DATE Column

This is the date when the report was received. Reports cover a time span from
5th July 2002 till 1st June 2024, a period of 22 years.
The spread of dates is interesting –As you can see, there is a gradual rise in number of reports from 2002 to 2024.
There are also some sharp increases – in 2008 (Swine Flu Jab) and in 2021
(Covid Jab).
The incidence jumps up suddenly. It reached a peak on 27th March 2021
(Passover). It remains high for 1 whole year, then starts to drop in March 2022
By December 2022 it has returned to 2020 level. Both the abrupt beginning andabrupt end do not seem very virus-like.

The graph appears to split into two streams, alower one and an upper one. The lower one ismade up of weekend dates when input was less,and the upper is made of weekday dates, when
input was greater. Notice that weekend input
also has a raised peak.
I have created a spreadsheet of the frequency ofreports for each date from 2022 till 2024. You
can download the spreadsheet here.
Notice that the high frequency of reports comesin clusters of 5 days. This is because data
inputting mainly occurs during weekdays rather
than at weekends.
This is further evidence that data is being
input by professionals working in the healthindustry, rather than by ordinary members of the
public, who would tend to input during out-ofwork hours or at the weekend.

There is a surge in reports soon after the rollout of the Covid Jab. The surge
is abrupt – rising to 2 x the 2020 rate of reports in a single month. andreaching a peak on March 27th. Then it remains high until March 2022. Afterthat it begins to descend at a slower rate.
There is no surge evident during the 2020 “pandemic” period !!
Do viruses behave like this?
The magnitude of the explosion is about 2 times higher than the level
immediately preceding it in 2020.

The COUNTRY Column

The data is equally split between the European Economic Area, and the NonEuropean Economic Area.
It will be interesting to see how western Europe differs from eastern Europe.

The AGE Column

These numbers of records are large, so an analysis of childhood effects ispossible.

The REP-AGE Column

The REP-AGE column provides slightly different categories –It will be interesting to look at effects on foetus and neonates.

The PARENT-REPORT Column

This is where parents submit a report on behalf of a child. There are 135586
such reports. Since these reports relate to children, this will be a valuable
dataset for analysing effects on children.

The GENDER Column

Adverse effects are reported more frequently for females. Does this apply for
all drugs, or only for the Covid jab?
The ratio of female to male is approximately 1 : 1.5, or 2 : 3. It will beinteresting to see if this ratio varies for different drugs.

The DRUG Column

This column lists the drugs suspected of causing the adverse reactions. In mostcases only a single drug is listed.
••

Number of reports with a single drug listed =Number of reports with multiple drugs listed =5,333,575
1,710,650

=
=

75%
25%

When multiple drugs are administered, it is harder to attribute adverse effects
to a particular drug. For this reason, I will analyse effects from single drug
administration first.
Cases of multiple drug administration are mostly multiple doses of the Covid
jab. It will be interesting to analyse this to see if there are dose dependent
effects.

The CONCOM Column

This is similar to the DRUGS column, except it is for concomitant drugs taken,
rather than for the suspected drug. These are drugs that are administeredconcomitantly with the suspected drug. Each drug entry also lists its PATHOLOGYTREATED, INGREDIENTS, DURATION and DOSE AMOUNT. These will have to be split out
into separate columns, just as is needed for the DRUG column.
Concomitant drugs may suggest 1. co-morbidities
2. additional drugs used to overcome the adverse effects of the suspected
medicine.
3. Additional drugs used to compliment the suspected medicine
As with the DRUG column, reports with no concomitant drugs make for a clearer
attribution of effects to the suspected drug. Such reports can be identified
by “Not reported” or “NOT AVAILABLE”.

The most common concomitant drugs are “anti-retro-virals”. During the Covid“pandemic” anti-retro-virals were heavily prescribed as an anti-viral treatment
for early onset of “Covid”. This included •••REMDESIVIRPAXLOVID (Ritonavir)
TAMIFLU (Oseltamivir)

It is highly controversial why these drugs were used, since they have sideeffects that are very serious including kidney damage, liver damage and bonedamage. It is unclear why Tenofovir was being administered…

The ICSR Column

ICSR means “Individual Case Safety Report” – showing that each row is anindividual person. There are 7,044,225 unique case reports in the dataset.
The ICSR column lists the URL for each report. For example –https://dap.ema.europa.eu/xmlpserver/PHV%20DAP/Reports/ICSR.xdo?_xpf=&_xt=form&
SR_ID=10011128660&_xpt=1&_xf=pdf

This is the URL for the report with ID 10011128660. It is a pdf hosted on theEuropean Medical Association website.
This shows that the downloaded data is not made up. Rather, each row of data
has a report that you can verify using the link provided.
Each downloaded report looks like this –The REACTION Column

This column lists
1. the symptoms of the adverse effect.
2. the severity of the effect for each symptom
3. the duration of the effect for each symptom
4. the recovery status from the effect for each symptom

The Finished Dataset

The finished dataset is called total-06-08-24.csv. It contains all of theoriginal columns from the 4088 original files, that have been concatenated into
one big file, and renamed.
Its 5.67 Gb in size, and many of the columns are unnecessary for carrying out
analysis of drug symptom associations.
In addition, some columns need to be split into separate fields.

ANALYSISMy aim in this analysis is to rank all drugs according to the incidence of theireffects. So to do this analysis, I only need the DRUG column and the REACTION
column. I drop all the other columns.
df = frame[[frame.columns[10],frame.columns[13]]]

Preparing the DRUGS Column

All rows where the DRUG column contained multiple drugs were removed
df = frame1[ frame1['DRUG'].str.contains('<br><br>')==False ]The DRUG column is split into 2 columns – DRUG and INGREDIENTS
df['NAME'] = df['DRUG'].str.split('\[', expand = True)[0]df['INGREDIENTS'] = df['DRUG'].str.split('\[', expand = True)[1]Then the INGREDIENTS column is further split into 2 columns – PATHOLOGY and
INGREDIENTS
df['INGREDIENT-LIST'] = df['INGREDIENTS'].str.split('\]', expand = True)[0]df['PATHOLOGY'] = df['INGREDIENTS'].str.split('\]', expand = True)[1]

The initial columns are then dropped to eliminate duplication.
df = df.drop(['DRUG'], axis=1)
df = df.drop(['INGREDIENTS'], axis=1)

Preparing the REACTION Column

The REACTION column consists of more than 1 symptom per row, so I used this –The REACTION column is then split into 2 columns – SYMPTOM and SEVERITY
dff['SYMPTOM'] = dff['REACTION'].str.split('\(', expand = True)[0]dff['SEVERITY'] = dff['REACTION'].str.split('\(', expand = True)[1]

The initial REACTION column was then dropped to eliminate duplication
dff = dff.drop(['REACTION'], axis=1)

Finally, the columns were tidied up by removing unnecessary brackets dff['PATHOLOGY'] = dff['PATHOLOGY'].str.replace('\(S -',"")
dff['SEVERITY'] = dff['SEVERITY'].str.replace('\),',"")
dff['SEVERITY'] = dff['SEVERITY'].str.replace('\)',"")The INGREDIENTS column was sometimes a single ingredient, and sometimes a very
long list of ingredients, and sometimes a detailed description. This will need
to be further processed before the data can be used to see how predictive
individual ingredients are for each symptom.
The final file contains just the columns necessary for Drug-Reaction analysis.
It is available here – Version2.zip

Step 7 : Opening the Master File
The master file is large – 311 Mb compressed, about 5Gb uncompressed, so you
cannot open it completely in Excel – this is because Excel only displays up to
1 million rows, and the master file has 26 million rows. So you will need to open
the master file in Python.
Here is what the Masterfile looks likeI could work with this file, using Python, but it was still seriously large, andwould cause memory errors, so I dropped columns that were unnecessary for myanalysis. I dropped all unnecessary columns.

Final data format
The final dataset is derived from 7,044,255 individual people records, and has
a total of 26,704,452 drug-symptom associations covering 20,085 unique symptoms
relating to 13,003 unique drug brand names, and 17,194 unique ingredient lists.
Each row is NOT a unique person. Rather it is a drug-symptom association.
This dataset only shows records where a single person takes a single drug, buteach drug can have many associated symptoms. So each line is a drug-symptom
association.

Files for Download

1. The 4088 original csv files are found in a master folder called - “eudravigilance3”, with a size of 6.63 Gb uncompressed, and 690 Mb compressed.
Download (original 4088 files)

2. The final master file after processing and concatenation is called – “total08-06-2024” of size 4.78 Gb uncompressed, but compressed is 318 Mb.
Download (all columns - concatenated and formatted files)

3. The dataset used for analysis is called – “version2.csv”
Download (only columns for drug-reaction analysis – one symptom per row)

4. A fourth dataset is available. It is a pivot table showing the safety signals
for any of 20,000 symptoms for 3645 different drugs. It also shows every drug
sorted in order of its safety signal for any chosen symptom. This dataset has asize of only 4Mb.
DownloadComparing Cancer Drugs - an example of drug analysis

I used the Version 2 dataset to determine the safety and efficacy of 152 cancer
drugs.

Safety was measured by the number of associations with•••

A fatal outcome
A hospital outcome
A life threatening event

each expressed as a percentage of the total number of associations

Efficacy was measured by the number of associations with•••

An outcome of complete recovery
An outcome of improvement
An outcome of no recovery

each expressed as a percentage of the total number of associations

In addition I looked at the incidence of symptoms related to well-being during
treatment –
•
•
•
•
•
•
•
•
•

Pain
NauseaFatigue
Diarrhea
HairlossAnaemia
Neutropenia
Cardiomyopathy
Neuropathy

A high association did not mean that the drug caused the symptom – it could also
arise if the drug was used to treat a pathology with the symptom. A high incidence
simply identified POSSIBLE cause, and would require further research of clinicaland experimental literature to determine if it was an ACTUAL cause.

The write-up for this study can be found here –cancer-drugs-compared
And the downloadable spreadsheet can be found here –cancer-drug-ratings-updated.csv